etl::optional C++ compatibility updates

This commit is contained in:
John Wellbelove 2024-02-15 10:50:45 +00:00
parent 3cbc73e0c9
commit ea74d2f02f
3 changed files with 114 additions and 93 deletions

View File

@ -138,7 +138,7 @@ namespace etl
/// Copy constructor.
//***************************************************************************
ETL_CONSTEXPR20_STL
optional_impl(const optional_impl& other)
optional_impl(const optional_impl<T>& other)
{
if (other.has_value())
{
@ -152,7 +152,7 @@ namespace etl
/// Move constructor.
//***************************************************************************
ETL_CONSTEXPR20_STL
optional_impl(optional_impl&& other)
optional_impl(optional_impl<T>&& other)
{
if (other.has_value())
{
@ -208,7 +208,7 @@ namespace etl
/// Assignment operator from optional_impl.
//***************************************************************************
ETL_CONSTEXPR20_STL
optional_impl& operator =(const optional_impl& other)
optional_impl& operator =(const optional_impl<T>& other)
{
if (this != &other)
{
@ -711,7 +711,7 @@ namespace etl
/// Copy constructor.
//***************************************************************************
ETL_CONSTEXPR14
optional_impl(const optional_impl& other)
optional_impl(const optional_impl<T>& other)
{
if (other.has_value())
{
@ -772,7 +772,7 @@ namespace etl
/// Assignment operator from optional_impl.
//***************************************************************************
ETL_CONSTEXPR14
optional_impl& operator =(const optional_impl& other)
optional_impl& operator =(const optional_impl<T>& other)
{
if (this != &other)
{
@ -1277,7 +1277,7 @@ namespace etl
template <typename U = T, ETL_OPTIONAL_ENABLE_CPP14>
ETL_CONSTEXPR14
optional(etl::nullopt_t)
: impl_t(etl::nullopt_t{})
: impl_t(etl::nullopt)
{
}
@ -1287,7 +1287,7 @@ namespace etl
template <typename U = T, ETL_OPTIONAL_ENABLE_CPP20_STL>
ETL_CONSTEXPR20_STL
optional(etl::nullopt_t)
: impl_t(etl::nullopt_t{})
: impl_t(etl::nullopt)
{
}
#else
@ -1295,7 +1295,7 @@ namespace etl
/// Constructor with nullopt.
//***************************************************************************
optional(etl::nullopt_t)
: impl_t(etl::nullopt_t{})
: impl_t(etl::nullopt)
{
}
#endif
@ -1415,7 +1415,7 @@ namespace etl
ETL_CONSTEXPR14
optional& operator =(etl::nullopt_t)
{
impl_t::operator=(etl::nullopt_t{});
impl_t::operator=(etl::nullopt);
return *this;
}
@ -1427,7 +1427,7 @@ namespace etl
ETL_CONSTEXPR20_STL
optional& operator =(etl::nullopt_t)
{
impl_t::operator=(etl::nullopt_t{});
impl_t::operator=(etl::nullopt);
return *this;
}
@ -1437,7 +1437,7 @@ namespace etl
//***************************************************************************
optional& operator =(etl::nullopt_t)
{
impl_t::operator=(etl::nullopt_t{});
impl_t::operator=(etl::nullopt);
return *this;
}

View File

@ -53,6 +53,7 @@ std::ostream& operator << (std::ostream& os, const etl::optional<Data>& data)
namespace
{
#include "etl/private/diagnostic_unused_function_push.h"
//*************************************************************************
struct NonTrivial
{
@ -65,21 +66,6 @@ namespace
return lhs.a < rhs.a;
}
constexpr friend bool operator <=(const NonTrivial& lhs, const NonTrivial& rhs)
{
return lhs.a <= rhs.a;
}
constexpr friend bool operator >(const NonTrivial& lhs, const NonTrivial& rhs)
{
return lhs.a > rhs.a;
}
constexpr friend bool operator >=(const NonTrivial& lhs, const NonTrivial& rhs)
{
return lhs.a >= rhs.a;
}
constexpr friend bool operator ==(const NonTrivial& lhs, const NonTrivial& rhs)
{
return lhs.a == rhs.a;
@ -87,6 +73,7 @@ namespace
int a;
};
#include "etl/private/diagnostic_pop.h"
SUITE(test_optional)
{
@ -294,9 +281,9 @@ namespace
constexpr bool eq2 = (data1 == etl::nullopt);
constexpr bool eq3 = (etl::nullopt == data1);
CHECK(eq1);
CHECK(eq2);
CHECK(eq3);
CHECK_FALSE(eq1);
CHECK_FALSE(eq2);
CHECK_FALSE(eq3);
}
#endif
@ -311,9 +298,9 @@ namespace
constexpr bool eq2 = (data1 == etl::nullopt);
constexpr bool eq3 = (etl::nullopt == data1);
CHECK(eq1);
CHECK(eq2);
CHECK(eq3);
CHECK_FALSE(eq1);
CHECK_FALSE(eq2);
CHECK_FALSE(eq3);
}
#endif
@ -361,13 +348,13 @@ namespace
constexpr etl::optional<NonTrivial> data1(1);
constexpr etl::optional<NonTrivial> data2(2);
constexpr bool eq1 = (data1 == data2);
constexpr bool eq2 = (data1 == etl::nullopt);
constexpr bool eq3 = (etl::nullopt == data1);
constexpr bool eq1 = (data1 != data2);
constexpr bool eq2 = (data1 != etl::nullopt);
constexpr bool eq3 = (etl::nullopt != data1);
CHECK(eq1);
CHECK(eq2);
CHECK(eq3);
CHECK_TRUE(eq1);
CHECK_TRUE(eq2);
CHECK_TRUE(eq3);
}
#endif
@ -382,9 +369,9 @@ namespace
constexpr bool neq2 = (data1 != etl::nullopt);
constexpr bool neq3 = (etl::nullopt != data1);
CHECK(neq1);
CHECK(neq2);
CHECK(neq3);
CHECK_TRUE(neq1);
CHECK_TRUE(neq2);
CHECK_TRUE(neq3);
}
#endif
@ -431,12 +418,14 @@ namespace
constexpr etl::optional<NonTrivial> data2(2);
constexpr bool lt1 = (data1 < data2);
constexpr bool lt2 = (data1 < etl::nullopt);
constexpr bool lt3 = (etl::nullopt < data1);
constexpr bool lt2 = (data2 < data1);
constexpr bool lt3 = (data1 < etl::nullopt);
constexpr bool lt4 = (etl::nullopt < data1);
CHECK(lt1);
CHECK(lt2);
CHECK(lt3);
CHECK_TRUE(lt1);
CHECK_FALSE(lt2);
CHECK_FALSE(lt3);
CHECK_TRUE(lt4);
}
#endif
@ -448,12 +437,14 @@ namespace
constexpr etl::optional<int> data2(2);
constexpr bool lt1 = (data1 < data2);
constexpr bool lt2 = (data1 < etl::nullopt);
constexpr bool lt3 = (etl::nullopt < data1);
constexpr bool lt2 = (data2 < data1);
constexpr bool lt3 = (data1 < etl::nullopt);
constexpr bool lt4 = (etl::nullopt < data1);
CHECK(lt1);
CHECK(lt2);
CHECK(lt3);
CHECK_TRUE(lt1);
CHECK_FALSE(lt2);
CHECK_FALSE(lt3);
CHECK_TRUE(lt4);
}
#endif
@ -498,13 +489,15 @@ namespace
constexpr etl::optional<NonTrivial> data1(1);
constexpr etl::optional<NonTrivial> data2(2);
constexpr bool lteq1 = (data1 <= data2);
constexpr bool lteq2 = (data1 <= etl::nullopt);
constexpr bool lteq3 = (etl::nullopt <= data1);
constexpr bool lt1 = (data1 <= data2);
constexpr bool lt2 = (data2 <= data1);
constexpr bool lt3 = (data1 <= etl::nullopt);
constexpr bool lt4 = (etl::nullopt <= data1);
CHECK(lteq1);
CHECK(lteq2);
CHECK(lteq3);
CHECK_TRUE(lt1);
CHECK_FALSE(lt2);
CHECK_FALSE(lt3);
CHECK_TRUE(lt4);
}
#endif
@ -515,13 +508,15 @@ namespace
constexpr etl::optional<int> data1(1);
constexpr etl::optional<int> data2(2);
constexpr bool lteq1 = (data1 <= data2);
constexpr bool lteq2 = (data1 <= etl::nullopt);
constexpr bool lteq3 = (etl::nullopt <= data1);
constexpr bool lt1 = (data1 <= data2);
constexpr bool lt2 = (data2 <= data1);
constexpr bool lt3 = (data1 <= etl::nullopt);
constexpr bool lt4 = (etl::nullopt <= data1);
CHECK(lteq1);
CHECK(lteq2);
CHECK(lteq3);
CHECK_TRUE(lt1);
CHECK_FALSE(lt2);
CHECK_FALSE(lt3);
CHECK_TRUE(lt4);
}
#endif
@ -564,13 +559,15 @@ namespace
constexpr etl::optional<NonTrivial> data1(1);
constexpr etl::optional<NonTrivial> data2(2);
constexpr bool gteq1 = (data1 > data2);
constexpr bool gteq2 = (data1 > etl::nullopt);
constexpr bool gteq3 = (etl::nullopt > data1);
constexpr bool gt1 = (data1 > data2);
constexpr bool gt2 = (data2 > data1);
constexpr bool gt3 = (data1 > etl::nullopt);
constexpr bool gt4 = (etl::nullopt > data1);
CHECK(gteq1);
CHECK(gteq2);
CHECK(gteq3);
CHECK_FALSE(gt1);
CHECK_TRUE(gt2);
CHECK_TRUE(gt3);
CHECK_FALSE(gt4);
}
#endif
@ -581,13 +578,15 @@ namespace
constexpr etl::optional<int> data1(1);
constexpr etl::optional<int> data2(2);
constexpr bool gteq1 = (data1 > data2);
constexpr bool gteq2 = (data1 > etl::nullopt);
constexpr bool gteq3 = (etl::nullopt > data1);
constexpr bool gt1 = (data1 > data2);
constexpr bool gt2 = (data2 > data1);
constexpr bool gt3 = (data1 > etl::nullopt);
constexpr bool gt4 = (etl::nullopt > data1);
CHECK(gteq1);
CHECK(gteq2);
CHECK(gteq3);
CHECK_FALSE(gt1);
CHECK_TRUE(gt2);
CHECK_TRUE(gt3);
CHECK_FALSE(gt4);
}
#endif
@ -632,13 +631,15 @@ namespace
constexpr etl::optional<NonTrivial> data1(1);
constexpr etl::optional<NonTrivial> data2(2);
constexpr bool gteq1 = (data1 >= data2);
constexpr bool gteq2 = (data1 >= etl::nullopt);
constexpr bool gteq3 = (etl::nullopt >= data1);
constexpr bool gte1 = (data1 >= data2);
constexpr bool gte2 = (data2 >= data1);
constexpr bool gte3 = (data1 >= etl::nullopt);
constexpr bool gte4 = (etl::nullopt >= data1);
CHECK(gteq1);
CHECK(gteq2);
CHECK(gteq3);
CHECK_FALSE(gte1);
CHECK_TRUE(gte2);
CHECK_TRUE(gte3);
CHECK_FALSE(gte4);
}
#endif
@ -649,13 +650,15 @@ namespace
constexpr etl::optional<int> data1(1);
constexpr etl::optional<int> data2(2);
constexpr bool gteq1 = (data1 >= data2);
constexpr bool gteq2 = (data1 >= etl::nullopt);
constexpr bool gteq3 = (etl::nullopt >= data1);
constexpr bool gte1 = (data1 >= data2);
constexpr bool gte2 = (data2 >= data1);
constexpr bool gte3 = (data1 >= etl::nullopt);
constexpr bool gte4 = (etl::nullopt >= data1);
CHECK(gteq1);
CHECK(gteq2);
CHECK(gteq3);
CHECK_FALSE(gte1);
CHECK_TRUE(gte2);
CHECK_TRUE(gte3);
CHECK_FALSE(gte4);
}
#endif

View File

@ -3340,12 +3340,6 @@
<None Include="..\..\appveyor.yml">
<Filter>Resource Files\CI\Appveyor</Filter>
</None>
<None Include="..\..\.github\workflows\clang.yml">
<Filter>Resource Files\CI\Github</Filter>
</None>
<None Include="..\..\.github\workflows\gcc.yml">
<Filter>Resource Files\CI\Github</Filter>
</None>
<None Include="..\..\.clang-format">
<Filter>Resource Files</Filter>
</None>
@ -3412,6 +3406,30 @@
<None Include="..\..\scripts\update_version.py">
<Filter>Tests\Scripts</Filter>
</None>
<None Include="..\..\.github\workflows\clang-c++11.yml">
<Filter>Resource Files\CI\Github</Filter>
</None>
<None Include="..\..\.github\workflows\clang-c++14.yml">
<Filter>Resource Files\CI\Github</Filter>
</None>
<None Include="..\..\.github\workflows\clang-c++17.yml">
<Filter>Resource Files\CI\Github</Filter>
</None>
<None Include="..\..\.github\workflows\clang-c++20.yml">
<Filter>Resource Files\CI\Github</Filter>
</None>
<None Include="..\..\.github\workflows\gcc-c++11.yml">
<Filter>Resource Files\CI\Github</Filter>
</None>
<None Include="..\..\.github\workflows\gcc-c++14.yml">
<Filter>Resource Files\CI\Github</Filter>
</None>
<None Include="..\..\.github\workflows\gcc-c++17.yml">
<Filter>Resource Files\CI\Github</Filter>
</None>
<None Include="..\..\.github\workflows\gcc-c++20.yml">
<Filter>Resource Files\CI\Github</Filter>
</None>
</ItemGroup>
<ItemGroup>
<Text Include="..\..\support\Release notes.txt">