[v2,1/4] optional: minor improvements
Commit Message
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
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
>
@@ -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
}