aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/armnn/Optional.hpp20
-rw-r--r--src/armnn/test/OptionalTest.cpp26
2 files changed, 34 insertions, 12 deletions
diff --git a/include/armnn/Optional.hpp b/include/armnn/Optional.hpp
index 29be3829a7..863b122716 100644
--- a/include/armnn/Optional.hpp
+++ b/include/armnn/Optional.hpp
@@ -55,7 +55,10 @@ public:
return m_HasValue;
}
- operator bool() const noexcept
+ /// Conversion to bool, so can be used in if-statements and similar contexts expecting a bool.
+ /// Note this is explicit so that it doesn't get implicitly converted to a bool in unwanted cases,
+ /// for example "Optional<TypeA> == Optional<TypeB>" should not compile.
+ explicit operator bool() const noexcept
{
return has_value();
}
@@ -278,6 +281,21 @@ public:
template<class... Args>
explicit Optional(ConstructInPlace, Args&&... args) :
BaseSwitch(CONSTRUCT_IN_PLACE, std::forward<Args>(args)...) {}
+
+ /// Two optionals are considered equal if they are both empty or both contain values which
+ /// themselves are considered equal (via their own == operator).
+ bool operator==(const Optional<T>& rhs) const
+ {
+ if (!this->has_value() && !rhs.has_value())
+ {
+ return true;
+ }
+ if (this->has_value() && rhs.has_value() && this->value() == rhs.value())
+ {
+ return true;
+ }
+ return false;
+ }
};
// Utility template that constructs an object of type T in-place and wraps
diff --git a/src/armnn/test/OptionalTest.cpp b/src/armnn/test/OptionalTest.cpp
index e2054399f1..f36ab34682 100644
--- a/src/armnn/test/OptionalTest.cpp
+++ b/src/armnn/test/OptionalTest.cpp
@@ -25,31 +25,33 @@ BOOST_AUTO_TEST_SUITE(OptionalTests)
BOOST_AUTO_TEST_CASE(SimpleStringTests)
{
armnn::Optional<std::string> optionalString;
- BOOST_TEST(optionalString == false);
+ BOOST_TEST(static_cast<bool>(optionalString) == false);
BOOST_TEST(optionalString.has_value() == false);
+ BOOST_TEST((optionalString == armnn::Optional<std::string>()));
optionalString = std::string("Hello World");
- BOOST_TEST(optionalString == true);
+ BOOST_TEST(static_cast<bool>(optionalString) == true);
BOOST_TEST(optionalString.has_value() == true);
BOOST_TEST(optionalString.value() == "Hello World");
+ BOOST_TEST((optionalString == armnn::Optional<std::string>("Hello World")));
armnn::Optional<std::string> otherString;
otherString = optionalString;
- BOOST_TEST(otherString == true);
+ BOOST_TEST(static_cast<bool>(otherString) == true);
BOOST_TEST(otherString.value() == "Hello World");
optionalString.reset();
- BOOST_TEST(optionalString == false);
+ BOOST_TEST(static_cast<bool>(optionalString) == false);
BOOST_TEST(optionalString.has_value() == false);
const std::string stringValue("Hello World");
armnn::Optional<std::string> optionalString2(stringValue);
- BOOST_TEST(optionalString2 == true);
+ BOOST_TEST(static_cast<bool>(optionalString2) == true);
BOOST_TEST(optionalString2.has_value() == true);
BOOST_TEST(optionalString2.value() == "Hello World");
armnn::Optional<std::string> optionalString3(std::move(optionalString2));
- BOOST_TEST(optionalString3 == true);
+ BOOST_TEST(static_cast<bool>(optionalString3) == true);
BOOST_TEST(optionalString3.has_value() == true);
BOOST_TEST(optionalString3.value() == "Hello World");
}
@@ -96,17 +98,19 @@ BOOST_AUTO_TEST_CASE(SimpleIntTests)
const int intValue = 123;
armnn::Optional<int> optionalInt;
- BOOST_TEST(optionalInt == false);
+ BOOST_TEST(static_cast<bool>(optionalInt) == false);
BOOST_TEST(optionalInt.has_value() == false);
+ BOOST_TEST((optionalInt == armnn::Optional<int>()));
optionalInt = intValue;
- BOOST_TEST(optionalInt == true);
+ BOOST_TEST(static_cast<bool>(optionalInt) == true);
BOOST_TEST(optionalInt.has_value() == true);
BOOST_TEST(optionalInt.value() == intValue);
+ BOOST_TEST((optionalInt == armnn::Optional<int>(intValue)));
armnn::Optional<int> otherOptionalInt;
otherOptionalInt = optionalInt;
- BOOST_TEST(otherOptionalInt == true);
+ BOOST_TEST(static_cast<bool>(otherOptionalInt) == true);
BOOST_TEST(otherOptionalInt.value() == intValue);
}
@@ -137,13 +141,13 @@ BOOST_AUTO_TEST_CASE(ObjectConstructedInPlaceTests)
// Use MakeOptional
armnn::Optional<SimpleObject> optionalObject1 = armnn::MakeOptional<SimpleObject>(objectName, objectValue);
- BOOST_CHECK(optionalObject1 == true);
+ BOOST_CHECK(static_cast<bool>(optionalObject1) == true);
BOOST_CHECK(optionalObject1.has_value() == true);
BOOST_CHECK(optionalObject1.value() == referenceObject);
// Call in-place constructor directly
armnn::Optional<SimpleObject> optionalObject2(CONSTRUCT_IN_PLACE, objectName, objectValue);
- BOOST_CHECK(optionalObject1 == true);
+ BOOST_CHECK(static_cast<bool>(optionalObject1) == true);
BOOST_CHECK(optionalObject1.has_value() == true);
BOOST_CHECK(optionalObject1.value() == referenceObject);
}