mirror of
https://github.com/ETLCPP/etl.git
synced 2026-10-28 18:07:10 +08:00
Add full set of operators to etl::optional
This commit is contained in:
parent
d1adfab03c
commit
d3493d601d
@ -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.
|
||||
|
||||
271
src/optional.h
271
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<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.
|
||||
//***************************************************************************
|
||||
|
||||
@ -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.
|
||||
|
||||
20
test/data.h
20
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;
|
||||
};
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user