Add full set of operators to etl::optional

This commit is contained in:
John Wellbelove 2018-02-25 13:21:27 +00:00
parent d1adfab03c
commit d3493d601d
5 changed files with 428 additions and 25 deletions

View File

@ -1,5 +1,5 @@
name=Embedded Template Library
version=10.20.0
version=10.21.0
author= John Wellbelove <john.wellbelove@etlcpp.com>
maintainer=John Wellbelove <john.wellbelove@etlcpp.com>
sentence=A C++ template library tailored for embedded systems.

View File

@ -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<T>& lhs, etl::optional<T>& rhs)
}
//***************************************************************************
/// Equality operator.
/// Equality operator. cppreference 1
//***************************************************************************
template <typename T>
bool operator ==(const etl::optional<T>& lhs, const etl::optional<T>& rhs)
@ -349,7 +350,16 @@ bool operator ==(const etl::optional<T>& lhs, const etl::optional<T>& rhs)
}
//***************************************************************************
/// Less than operator.
/// Equality operator. cppreference 2
//***************************************************************************
template <typename T>
bool operator !=(const etl::optional<T>& lhs, const etl::optional<T>& rhs)
{
return !(lhs == rhs);
}
//***************************************************************************
/// Less than operator. cppreference 3
//***************************************************************************
template <typename T>
bool operator <(const etl::optional<T>& lhs, const etl::optional<T>& rhs)
@ -369,7 +379,67 @@ bool operator <(const etl::optional<T>& lhs, const etl::optional<T>& rhs)
}
//***************************************************************************
/// Equality operator.
/// Less than equal operator. cppreference 4
//***************************************************************************
template <typename T>
bool operator <=(const etl::optional<T>& lhs, const etl::optional<T>& rhs)
{
if (!bool(lhs))
{
return true;
}
else if (!bool(rhs))
{
return false;
}
else
{
return lhs.value() <= rhs.value();
}
}
//***************************************************************************
/// greater than operator. cppreference 5
//***************************************************************************
template <typename T>
bool operator >(const etl::optional<T>& lhs, const etl::optional<T>& 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 <typename T>
bool operator >=(const etl::optional<T>& lhs, const etl::optional<T>& rhs)
{
if (!bool(rhs))
{
return true;
}
else if (!bool(lhs))
{
return false;
}
else
{
return lhs.value() >= rhs.value();
}
}
//***************************************************************************
/// Equality operator. cppreference 7
//***************************************************************************
template <typename T>
bool operator ==(const etl::optional<T>& lhs, etl::nullopt_t)
@ -378,25 +448,43 @@ bool operator ==(const etl::optional<T>& lhs, etl::nullopt_t)
}
//***************************************************************************
/// Equality operator.
/// Equality operator. cppreference 8
//***************************************************************************
template <typename T>
bool operator ==(etl::nullopt_t, const etl::optional<T>& rhs)
{
return !bool(rhs);
}
//***************************************************************************
/// Inequality operator. cppreference 9
//***************************************************************************
template <typename T>
bool operator !=(const etl::optional<T>& lhs, etl::nullopt_t)
{
return !(lhs == etl::nullopt);
}
//***************************************************************************
/// Inequality operator. cppreference 10
//***************************************************************************
template <typename T>
bool operator !=(etl::nullopt_t , const etl::optional<T>& rhs)
{
return !(etl::nullopt == rhs);
}
//***************************************************************************
/// Less than operator. cppreference 11
//***************************************************************************
template <typename T>
bool operator <(const etl::optional<T>&, etl::nullopt_t)
{
return false;
}
//***************************************************************************
/// Less than operator.
//***************************************************************************
template <typename T>
bool operator <(const etl::optional<T>& lhs, etl::nullopt_t)
{
return !bool(lhs);
}
//***************************************************************************
/// Less than operator.
/// Less than operator. cppreference 12
//***************************************************************************
template <typename T>
bool operator <(etl::nullopt_t, const etl::optional<T>& rhs)
@ -405,32 +493,167 @@ bool operator <(etl::nullopt_t, const etl::optional<T>& rhs)
}
//***************************************************************************
/// Equality operator.
//**************************************************************************
/// Less than equal operator. cppreference 13
//***************************************************************************
template <typename T>
bool operator ==(const etl::optional<T>& lhs, const T& rhs)
bool operator <=(const etl::optional<T>& lhs, etl::nullopt_t)
{
return !bool(lhs);
}
//***************************************************************************
/// Less than equal operator. cppreference 14
//***************************************************************************
template <typename T>
bool operator <=(etl::nullopt_t, const etl::optional<T>&)
{
return true;
}
//***************************************************************************
/// Greater than operator. cppreference 15
//***************************************************************************
template <typename T>
bool operator >(const etl::optional<T>& lhs, etl::nullopt_t)
{
return bool(lhs);
}
//***************************************************************************
/// Greater than operator. cppreference 16
//***************************************************************************
template <typename T>
bool operator >(etl::nullopt_t, const etl::optional<T>&)
{
return false;
}
//***************************************************************************
/// Greater than equal operator. cppreference 17
//***************************************************************************
template <typename T>
bool operator >=(const etl::optional<T>&, etl::nullopt_t)
{
return true;
}
//***************************************************************************
/// Greater than equal operator. cppreference 18
//***************************************************************************
template <typename T>
bool operator >=(etl::nullopt_t, const etl::optional<T>& rhs)
{
return !bool(rhs);
}
//***************************************************************************
/// Equality operator. cppreference 19
//**************************************************************************
template <typename T, typename U>
bool operator ==(const etl::optional<T>& lhs, const U& rhs)
{
return bool(lhs) ? lhs.value() == rhs : false;
}
//***************************************************************************
/// Equality operator.
/// Inequality operator. cppreference 21
//**************************************************************************
template <typename T>
bool operator ==(const T& value, const etl::optional<T>& rhs)
template <typename T, typename U>
bool operator !=(const etl::optional<T>& lhs, const U& rhs)
{
return bool(rhs) ? rhs.value() == value : false;
return !(lhs == rhs);
}
//***************************************************************************
/// Less than operator.
/// Equality operator. cppreference 20
//**************************************************************************
template <typename T, typename U>
bool operator ==(const U& lhs, const etl::optional<T>& rhs)
{
return bool(rhs) ? rhs.value() == lhs : false;
}
//***************************************************************************
template <typename T>
bool operator <(const etl::optional<T>& lhs, const T& rhs)
/// Inequality operator. cppreference 22
//**************************************************************************
template <typename T, typename U>
bool operator !=(const U& lhs, const etl::optional<T>& rhs)
{
return !(lhs == rhs);
}
//***************************************************************************
/// Less than operator. cppreference 23
//***************************************************************************
template <typename T, typename U>
bool operator <(const etl::optional<T>& lhs, const U& rhs)
{
return bool(lhs) ? lhs.value() < rhs : true;
}
//***************************************************************************
/// Less than operator. cppreference 24
//***************************************************************************
template <typename T, typename U>
bool operator <(const U& lhs, const etl::optional<T>& rhs)
{
return bool(rhs) ? lhs < rhs.value() : false;
}
//***************************************************************************
/// Less than equal operator. cppreference 25
//***************************************************************************
template <typename T, typename U>
bool operator <=(const etl::optional<T>& lhs, const U& rhs)
{
return bool(lhs) ? lhs.value() <= rhs : true;
}
//***************************************************************************
/// Less than equal operator. cppreference 26
//***************************************************************************
template <typename T, typename U>
bool operator <=(const U& lhs, const etl::optional<T>& rhs)
{
return bool(rhs) ? lhs <= rhs.value() : false;
}
//***************************************************************************
/// Greater than operator. cppreference 27
//***************************************************************************
template <typename T, typename U>
bool operator >(const etl::optional<T>& lhs, const U& rhs)
{
return bool(lhs) ? lhs.value() > rhs : false;
}
//***************************************************************************
/// Greater than operator. cppreference 28
//***************************************************************************
template <typename T, typename U>
bool operator >(const U& lhs, const etl::optional<T>& rhs)
{
return bool(rhs) ? lhs > rhs.value() : true;
}
//***************************************************************************
/// Greater than equal operator. cppreference 29
//***************************************************************************
template <typename T, typename U>
bool operator >=(const etl::optional<T>& lhs, const U& rhs)
{
return bool(lhs) ? lhs.value() >= rhs : false;
}
//***************************************************************************
/// Greater than equal operator. cppreference 30
//***************************************************************************
template <typename T, typename U>
bool operator >=(const U& lhs, const etl::optional<T>& rhs)
{
return bool(rhs) ? lhs >= rhs.value() : true;
}
//***************************************************************************
/// Make an optional.
//***************************************************************************

View File

@ -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.

View File

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

View File

@ -114,24 +114,71 @@ namespace
etl::optional<Data> 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<Data> data1;
etl::optional<Data> 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<Data> data1;
etl::optional<Data> 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<Data> data1;
etl::optional<Data> 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<Data> data1;
etl::optional<Data> 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<Data> data1;
etl::optional<Data> 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);
}
//*************************************************************************