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

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_;
 };