Device interface library for multiple platforms including Mbed.
Dependents: DeepCover Embedded Security in IoT MaximInterface MAXREFDES155#
Maxim Interface is a library framework focused on providing flexible and expressive hardware interfaces. Both communication interfaces such as I2C and 1-Wire and device interfaces such as DS18B20 are supported. Modern C++ concepts are used extensively while keeping compatibility with C++98/C++03 and requiring no external dependencies. The embedded-friendly design does not depend on exceptions or RTTI.
The full version of the project is hosted on GitLab: https://gitlab.com/iabenz/MaximInterface
Diff: MaximInterfaceCore/Optional.hpp
- Revision:
- 8:5ea891c7d1a1
- Parent:
- 7:9cd16581b578
diff -r 9cd16581b578 -r 5ea891c7d1a1 MaximInterfaceCore/Optional.hpp --- a/MaximInterfaceCore/Optional.hpp Mon Jul 22 11:44:07 2019 -0500 +++ b/MaximInterfaceCore/Optional.hpp Mon Sep 16 11:13:37 2019 -0500 @@ -1,5 +1,5 @@ /******************************************************************************* -* Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved. +* Copyright (C) Maxim Integrated Products, Inc., All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -30,8 +30,8 @@ * ownership rights. *******************************************************************************/ -#ifndef MaximInterfaceCore_Optional -#define MaximInterfaceCore_Optional +#ifndef MaximInterfaceCore_Optional_hpp +#define MaximInterfaceCore_Optional_hpp #include "None.hpp" #include "SafeBool.hpp" @@ -42,7 +42,7 @@ namespace MaximInterfaceCore { -/// @brief Optional value container similar to std::optional. +/// @brief %Optional value container similar to std::optional. /// @details /// To prevent the need for aligned storage, this implementation imposes that /// types must be DefaultConstructible, CopyConstructible, and CopyAssignable. @@ -66,11 +66,19 @@ return *this; } + Optional & operator=(const T & value) { + value_ = value; + hasValue_ = true; + return *this; + } + template <typename U> Optional & operator=(const Optional<U> & other) { - if (hasValue_ || other.hasValue()) { - value_ = other.value(); - hasValue_ = other.hasValue(); - } + assign(other); + return *this; + } + + Optional & operator=(const Optional & other) { + assign(other); return *this; } @@ -116,6 +124,13 @@ } private: + template <typename U> void assign(const Optional<U> & other) { + if (hasValue_ || other.hasValue()) { + value_ = other.value(); + hasValue_ = other.hasValue(); + } + } + T value_; bool hasValue_; };