[v2,1/4] optional: minor improvements

Message ID 20220316163055.4127796-2-gprocida@google.com
State New
Headers
Series add symbol namespace support, update symbol CRC support |

Commit Message

Giuliano Procida March 16, 2022, 4:30 p.m. UTC
  This change makes minor improvements to the optional class used with
pre-C++17 compilers.

- adds operator== and operator!=
- adds various missing noexcept (but not constexpr) decorations
- defines operator bool in terms of has_value

Note that some constexpr decorations would require C++17 anyway.

	* include/abg-cxx-compat.h (optional): Add operator== and
	operator!=. Add noexcept decorations. Tweak operator bool.

Signed-off-by: Giuliano Procida <gprocida@google.com>
---
 include/abg-cxx-compat.h | 30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)
  

Comments

Matthias Männich March 17, 2022, 10:56 a.m. UTC | #1
On Wed, Mar 16, 2022 at 04:30:52PM +0000, Giuliano Procida wrote:
>This change makes minor improvements to the optional class used with
>pre-C++17 compilers.
>
>- adds operator== and operator!=
>- adds various missing noexcept (but not constexpr) decorations
>- defines operator bool in terms of has_value
>
>Note that some constexpr decorations would require C++17 anyway.
>
>	* include/abg-cxx-compat.h (optional): Add operator== and
>	operator!=. Add noexcept decorations. Tweak operator bool.
>
>Signed-off-by: Giuliano Procida <gprocida@google.com>

Reviewed-by: Matthias Maennich <maennich@google.com>

Cheers,
Matthias

>---
> include/abg-cxx-compat.h | 30 ++++++++++++++++++++++++------
> 1 file changed, 24 insertions(+), 6 deletions(-)
>
>diff --git a/include/abg-cxx-compat.h b/include/abg-cxx-compat.h
>index 443905c7..5c5943d0 100644
>--- a/include/abg-cxx-compat.h
>+++ b/include/abg-cxx-compat.h
>@@ -45,7 +45,7 @@ public:
>   optional(const T& value) : has_value_(true), value_(value) {}
>
>   bool
>-  has_value() const
>+  has_value() const noexcept
>   {
>     return has_value_;
>   }
>@@ -67,19 +67,19 @@ public:
>   }
>
>   const T&
>-  operator*() const
>+  operator*() const& noexcept
>   { return value_; }
>
>   T&
>-  operator*()
>+  operator*() & noexcept
>   { return value_; }
>
>   const T*
>-  operator->() const
>+  operator->() const noexcept
>   { return &value_; }
>
>   T*
>-  operator->()
>+  operator->() noexcept
>   { return &value_; }
>
>   optional&
>@@ -90,9 +90,27 @@ public:
>     return *this;
>   }
>
>-  explicit operator bool() const { return has_value_; }
>+  explicit operator bool() const noexcept { return has_value(); }
> };
>
>+template <typename T, typename U>
>+bool
>+operator==(const optional<T>& lhs, const optional<U>& rhs)
>+{
>+  if (!lhs.has_value() && !rhs.has_value())
>+    return true;
>+  if (!lhs.has_value() || !rhs.has_value())
>+    return false;
>+  return lhs.value() == rhs.value();
>+}
>+
>+template <typename T, typename U>
>+bool
>+operator!=(const optional<T>& lhs, const optional<U>& rhs)
>+{
>+  return !(lhs == rhs);
>+}
>+
> #endif
> }
>
>-- 
>2.35.1.894.gb6a874cedc-goog
>
  

Patch

diff --git a/include/abg-cxx-compat.h b/include/abg-cxx-compat.h
index 443905c7..5c5943d0 100644
--- a/include/abg-cxx-compat.h
+++ b/include/abg-cxx-compat.h
@@ -45,7 +45,7 @@  public:
   optional(const T& value) : has_value_(true), value_(value) {}
 
   bool
-  has_value() const
+  has_value() const noexcept
   {
     return has_value_;
   }
@@ -67,19 +67,19 @@  public:
   }
 
   const T&
-  operator*() const
+  operator*() const& noexcept
   { return value_; }
 
   T&
-  operator*()
+  operator*() & noexcept
   { return value_; }
 
   const T*
-  operator->() const
+  operator->() const noexcept
   { return &value_; }
 
   T*
-  operator->()
+  operator->() noexcept
   { return &value_; }
 
   optional&
@@ -90,9 +90,27 @@  public:
     return *this;
   }
 
-  explicit operator bool() const { return has_value_; }
+  explicit operator bool() const noexcept { return has_value(); }
 };
 
+template <typename T, typename U>
+bool
+operator==(const optional<T>& lhs, const optional<U>& rhs)
+{
+  if (!lhs.has_value() && !rhs.has_value())
+    return true;
+  if (!lhs.has_value() || !rhs.has_value())
+    return false;
+  return lhs.value() == rhs.value();
+}
+
+template <typename T, typename U>
+bool
+operator!=(const optional<T>& lhs, const optional<U>& rhs)
+{
+  return !(lhs == rhs);
+}
+
 #endif
 }