From d3493d601d73d4322caf317b5c6d7c8b1aca0a13 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sun, 25 Feb 2018 13:21:27 +0000 Subject: [PATCH] Add full set of operators to etl::optional --- library.properties | 2 +- src/optional.h | 271 ++++++++++++++++++++++++++++++++++---- support/Release notes.txt | 5 + test/data.h | 20 +++ test/test_optional.cpp | 155 ++++++++++++++++++++++ 5 files changed, 428 insertions(+), 25 deletions(-) diff --git a/library.properties b/library.properties index 4fe9f709..6da68f3d 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Embedded Template Library -version=10.20.0 +version=10.21.0 author= John Wellbelove maintainer=John Wellbelove sentence=A C++ template library tailored for embedded systems. diff --git a/src/optional.h b/src/optional.h index f6f4ce10..a1ec6a64 100644 --- a/src/optional.h +++ b/src/optional.h @@ -97,6 +97,7 @@ namespace etl //***************************************************************************** /// An optional type. /// If the optional type is not initialised then a type is not constructed. + /// See http://en.cppreference.com/w/cpp/utility/optional ///\tparam The type to store. ///\ingroup utilities //***************************************************************************** @@ -329,7 +330,7 @@ void swap(etl::optional& lhs, etl::optional& rhs) } //*************************************************************************** -/// Equality operator. +/// Equality operator. cppreference 1 //*************************************************************************** template bool operator ==(const etl::optional& lhs, const etl::optional& rhs) @@ -349,7 +350,16 @@ bool operator ==(const etl::optional& lhs, const etl::optional& rhs) } //*************************************************************************** -/// Less than operator. +/// Equality operator. cppreference 2 +//*************************************************************************** +template +bool operator !=(const etl::optional& lhs, const etl::optional& rhs) +{ + return !(lhs == rhs); +} + +//*************************************************************************** +/// Less than operator. cppreference 3 //*************************************************************************** template bool operator <(const etl::optional& lhs, const etl::optional& rhs) @@ -369,7 +379,67 @@ bool operator <(const etl::optional& lhs, const etl::optional& rhs) } //*************************************************************************** -/// Equality operator. +/// Less than equal operator. cppreference 4 +//*************************************************************************** +template +bool operator <=(const etl::optional& lhs, const etl::optional& rhs) +{ + if (!bool(lhs)) + { + return true; + } + else if (!bool(rhs)) + { + return false; + } + else + { + return lhs.value() <= rhs.value(); + } +} + +//*************************************************************************** +/// greater than operator. cppreference 5 +//*************************************************************************** +template +bool operator >(const etl::optional& lhs, const etl::optional& rhs) +{ + if (!bool(lhs)) + { + return false; + } + else if (!bool(rhs)) + { + return true; + } + else + { + return lhs.value() > rhs.value(); + } +} + +//*************************************************************************** +/// greater than equal operator. cppreference 6 +//*************************************************************************** +template +bool operator >=(const etl::optional& lhs, const etl::optional& rhs) +{ + if (!bool(rhs)) + { + return true; + } + else if (!bool(lhs)) + { + return false; + } + else + { + return lhs.value() >= rhs.value(); + } +} + +//*************************************************************************** +/// Equality operator. cppreference 7 //*************************************************************************** template bool operator ==(const etl::optional& lhs, etl::nullopt_t) @@ -378,25 +448,43 @@ bool operator ==(const etl::optional& lhs, etl::nullopt_t) } //*************************************************************************** -/// Equality operator. +/// Equality operator. cppreference 8 //*************************************************************************** template bool operator ==(etl::nullopt_t, const etl::optional& rhs) +{ + return !bool(rhs); +} + +//*************************************************************************** +/// Inequality operator. cppreference 9 +//*************************************************************************** +template +bool operator !=(const etl::optional& lhs, etl::nullopt_t) +{ + return !(lhs == etl::nullopt); +} + +//*************************************************************************** +/// Inequality operator. cppreference 10 +//*************************************************************************** +template +bool operator !=(etl::nullopt_t , const etl::optional& rhs) +{ + return !(etl::nullopt == rhs); +} + +//*************************************************************************** +/// Less than operator. cppreference 11 +//*************************************************************************** +template +bool operator <(const etl::optional&, etl::nullopt_t) { return false; } //*************************************************************************** -/// Less than operator. -//*************************************************************************** -template -bool operator <(const etl::optional& lhs, etl::nullopt_t) -{ - return !bool(lhs); -} - -//*************************************************************************** -/// Less than operator. +/// Less than operator. cppreference 12 //*************************************************************************** template bool operator <(etl::nullopt_t, const etl::optional& rhs) @@ -405,32 +493,167 @@ bool operator <(etl::nullopt_t, const etl::optional& rhs) } //*************************************************************************** -/// Equality operator. -//************************************************************************** +/// Less than equal operator. cppreference 13 +//*************************************************************************** template -bool operator ==(const etl::optional& lhs, const T& rhs) +bool operator <=(const etl::optional& lhs, etl::nullopt_t) +{ + return !bool(lhs); +} + +//*************************************************************************** +/// Less than equal operator. cppreference 14 +//*************************************************************************** +template +bool operator <=(etl::nullopt_t, const etl::optional&) +{ + return true; +} + +//*************************************************************************** +/// Greater than operator. cppreference 15 +//*************************************************************************** +template +bool operator >(const etl::optional& lhs, etl::nullopt_t) +{ + return bool(lhs); +} + +//*************************************************************************** +/// Greater than operator. cppreference 16 +//*************************************************************************** +template +bool operator >(etl::nullopt_t, const etl::optional&) +{ + return false; +} + +//*************************************************************************** +/// Greater than equal operator. cppreference 17 +//*************************************************************************** +template +bool operator >=(const etl::optional&, etl::nullopt_t) +{ + return true; +} + +//*************************************************************************** +/// Greater than equal operator. cppreference 18 +//*************************************************************************** +template +bool operator >=(etl::nullopt_t, const etl::optional& rhs) +{ + return !bool(rhs); +} + +//*************************************************************************** +/// Equality operator. cppreference 19 +//************************************************************************** +template +bool operator ==(const etl::optional& lhs, const U& rhs) { return bool(lhs) ? lhs.value() == rhs : false; } //*************************************************************************** -/// Equality operator. +/// Inequality operator. cppreference 21 //************************************************************************** -template -bool operator ==(const T& value, const etl::optional& rhs) +template +bool operator !=(const etl::optional& lhs, const U& rhs) { - return bool(rhs) ? rhs.value() == value : false; + return !(lhs == rhs); } //*************************************************************************** -/// Less than operator. +/// Equality operator. cppreference 20 +//************************************************************************** +template +bool operator ==(const U& lhs, const etl::optional& rhs) +{ + return bool(rhs) ? rhs.value() == lhs : false; +} + //*************************************************************************** -template -bool operator <(const etl::optional& lhs, const T& rhs) +/// Inequality operator. cppreference 22 +//************************************************************************** +template +bool operator !=(const U& lhs, const etl::optional& rhs) +{ + return !(lhs == rhs); +} + +//*************************************************************************** +/// Less than operator. cppreference 23 +//*************************************************************************** +template +bool operator <(const etl::optional& lhs, const U& rhs) { return bool(lhs) ? lhs.value() < rhs : true; } +//*************************************************************************** +/// Less than operator. cppreference 24 +//*************************************************************************** +template +bool operator <(const U& lhs, const etl::optional& rhs) +{ + return bool(rhs) ? lhs < rhs.value() : false; +} + +//*************************************************************************** +/// Less than equal operator. cppreference 25 +//*************************************************************************** +template +bool operator <=(const etl::optional& lhs, const U& rhs) +{ + return bool(lhs) ? lhs.value() <= rhs : true; +} + +//*************************************************************************** +/// Less than equal operator. cppreference 26 +//*************************************************************************** +template +bool operator <=(const U& lhs, const etl::optional& rhs) +{ + return bool(rhs) ? lhs <= rhs.value() : false; +} + +//*************************************************************************** +/// Greater than operator. cppreference 27 +//*************************************************************************** +template +bool operator >(const etl::optional& lhs, const U& rhs) +{ + return bool(lhs) ? lhs.value() > rhs : false; +} + +//*************************************************************************** +/// Greater than operator. cppreference 28 +//*************************************************************************** +template +bool operator >(const U& lhs, const etl::optional& rhs) +{ + return bool(rhs) ? lhs > rhs.value() : true; +} + +//*************************************************************************** +/// Greater than equal operator. cppreference 29 +//*************************************************************************** +template +bool operator >=(const etl::optional& lhs, const U& rhs) +{ + return bool(lhs) ? lhs.value() >= rhs : false; +} + +//*************************************************************************** +/// Greater than equal operator. cppreference 30 +//*************************************************************************** +template +bool operator >=(const U& lhs, const etl::optional& rhs) +{ + return bool(rhs) ? lhs >= rhs.value() : true; +} + //*************************************************************************** /// Make an optional. //*************************************************************************** diff --git a/support/Release notes.txt b/support/Release notes.txt index 8a780b79..2dd20638 100644 --- a/support/Release notes.txt +++ b/support/Release notes.txt @@ -1,3 +1,8 @@ +=============================================================================== +10.21.0 +Completion of operator set for etl::optional +Removal of more GCC warnings when using -Wextra. + =============================================================================== 10.20.0 Rewrite of debounce code to factor out commonality. diff --git a/test/data.h b/test/data.h index b66d2f8f..9db25ab4 100644 --- a/test/data.h +++ b/test/data.h @@ -63,6 +63,16 @@ public: return value > other.value; } + bool operator <= (const TestDataDC& other) const + { + return !(value > other.value); + } + + bool operator >= (const TestDataDC& other) const + { + return !(value < other.value); + } + T value; int index; }; @@ -109,6 +119,16 @@ public: return value > other.value; } + bool operator <= (const TestDataNDC& other) const + { + return !(value > other.value); + } + + bool operator >= (const TestDataNDC& other) const + { + return !(value < other.value); + } + T value; int index; }; diff --git a/test/test_optional.cpp b/test/test_optional.cpp index 2c66f275..e0d081f4 100644 --- a/test/test_optional.cpp +++ b/test/test_optional.cpp @@ -114,24 +114,71 @@ namespace etl::optional data2; CHECK(data1 == data2); + CHECK(data2 == data1); data1 = Data("Data1"); CHECK(!(data1 == data2)); + CHECK(!(data2 == data1)); data1 = etl::nullopt; data2 = Data("Data2"); CHECK(!(data1 == data2)); + CHECK(!(data2 == data1)); data1 = Data("Data1"); data2 = Data("Data1"); CHECK(data1 == data2); + CHECK(data2 == data1); data1 = Data("Data1"); data2 = Data("Data2"); CHECK(!(data1 == data2)); + CHECK(!(data2 == data1)); + + CHECK(!(etl::nullopt == data2)); + CHECK(!(data1 == etl::nullopt)); CHECK(data1 == Data("Data1")); CHECK(!(data1 == Data("Data2"))); + CHECK(Data("Data1") == data1); + CHECK(!(Data("Data2") == data1)); + } + + //************************************************************************* + TEST(test_inequality) + { + etl::optional data1; + etl::optional data2; + + CHECK(!(data1 != data2)); + CHECK(!(data2 != data1)); + + data1 = Data("Data1"); + CHECK(data1 != data2); + CHECK(data2 != data1); + + data1 = etl::nullopt; + data2 = Data("Data2"); + CHECK(data1 != data2); + CHECK(data2 != data1); + + data1 = Data("Data1"); + data2 = Data("Data1"); + CHECK(!(data1 != data2)); + CHECK(!(data2 != data1)); + + data1 = Data("Data1"); + data2 = Data("Data2"); + CHECK(data1 != data2); + CHECK(data2 != data1); + + CHECK(etl::nullopt != data2); + CHECK(data1 != etl::nullopt); + + CHECK(!(data1 != Data("Data1"))); + CHECK(data1 != Data("Data2")); + CHECK(!(Data("Data1") != data1)); + CHECK(Data("Data2") != data1); } //************************************************************************* @@ -140,22 +187,130 @@ namespace etl::optional data1; etl::optional data2; + CHECK(!(data2 < data1)); CHECK(!(data1 < data2)); data1 = Data("Data1"); CHECK(!(data1 < data2)); + CHECK(data2 < data1); data1 = etl::nullopt; data2 = Data("Data2"); CHECK(data1 < data2); + CHECK(!(data2 < data2)); data1 = Data("Data1"); data2 = Data("Data2"); CHECK(data1 < data2); CHECK(!(data2 < data1)); + CHECK(etl::nullopt < data2); + CHECK(!(data1 < etl::nullopt)); + CHECK(data1 < Data("Data2")); CHECK(!(data1 < Data("Data1"))); + CHECK(!(Data("Data2") < data1)); + CHECK(Data("Data1") < data2); + } + + //************************************************************************* + TEST(test_less_than_equal) + { + etl::optional data1; + etl::optional data2; + + CHECK(data1 <= data2); + CHECK(data2 <= data1); + + data1 = Data("Data1"); + CHECK(!(data1 <= data2)); + CHECK(data2 <= data1); + + data1 = etl::nullopt; + data2 = Data("Data2"); + CHECK(data1 <= data2); + CHECK(!(data2 <= data1)); + + data1 = Data("Data1"); + data2 = Data("Data2"); + CHECK(data1 <= data2); + CHECK(!(data2 <= data1)); + + CHECK(etl::nullopt <= data2); + CHECK(!(data1 <= etl::nullopt)); + + CHECK(data1 <= Data("Data2")); + CHECK(!(data2 <= Data("Data1"))); + CHECK(data1 <= Data("Data1")); + CHECK(!(Data("Data2") <= data1)); + CHECK(Data("Data1") <= data2); + CHECK(Data("Data1") <= data1); + } + + //************************************************************************* + TEST(test_greater_than) + { + etl::optional data1; + etl::optional data2; + + CHECK(!(data1 > data2)); + CHECK(!(data2 > data1)); + + data1 = Data("Data1"); + CHECK(data1 > data2); + CHECK(!(data2 > data1)); + + data1 = etl::nullopt; + data2 = Data("Data2"); + CHECK(!(data1 > data2)); + CHECK(data2 > data1); + + data1 = Data("Data1"); + data2 = Data("Data2"); + CHECK(data2 > data1); + CHECK(!(data1 > data2)); + + CHECK(!(etl::nullopt > data2)); + CHECK(data1 > etl::nullopt); + + CHECK(!(data1 > Data("Data2"))); + CHECK(data2 > Data("Data1")); + CHECK(Data("Data2") > data1); + CHECK(!(Data("Data1") > data2)); + } + + //************************************************************************* + TEST(test_greater_than_equal) + { + etl::optional data1; + etl::optional data2; + + CHECK(data1 >= data2); + CHECK(data2 >= data1); + + data1 = Data("Data1"); + CHECK(data1 >= data2); + CHECK(!(data2 >= data1)); + + data1 = etl::nullopt; + data2 = Data("Data2"); + CHECK(!(data1 >= data2)); + CHECK(data2 >= data1); + + data1 = Data("Data1"); + data2 = Data("Data2"); + CHECK(!(data1 >= data2)); + CHECK(data2 >= data1); + + CHECK(!(etl::nullopt >= data2)); + CHECK(data1 >= etl::nullopt); + + CHECK(!(data1 >= Data("Data2"))); + CHECK(data2 >= Data("Data1")); + CHECK(data1 >= Data("Data1")); + CHECK(Data("Data2") >= data1); + CHECK(!(Data("Data1") >= data2)); + CHECK(Data("Data1") >= data1); } //*************************************************************************