Merge branch 'development' into feature/Add-more-type_list-features

# Conflicts:
#	include/etl/utility.h
This commit is contained in:
John Wellbelove 2026-02-19 19:03:41 +00:00
commit 52e57bc8b6
5 changed files with 202 additions and 38 deletions

View File

@ -1136,7 +1136,7 @@ namespace etl
///\return <b>true</b> if the arrays are equal, otherwise <b>false</b>
//*************************************************************************
template <typename T, size_t SIZE>
bool operator ==(const etl::array<T, SIZE>& lhs, const etl::array<T, SIZE>& rhs)
ETL_CONSTEXPR14 bool operator ==(const etl::array<T, SIZE>& lhs, const etl::array<T, SIZE>& rhs)
{
return etl::equal(lhs.cbegin(), lhs.cend(), rhs.cbegin());
}
@ -1148,7 +1148,7 @@ namespace etl
///\return <b>true</b> if the arrays are not equal, otherwise <b>false</b>
//*************************************************************************
template <typename T, size_t SIZE>
bool operator !=(const etl::array<T, SIZE>& lhs, const etl::array<T, SIZE>& rhs)
ETL_CONSTEXPR14 bool operator !=(const etl::array<T, SIZE>& lhs, const etl::array<T, SIZE>& rhs)
{
return !(lhs == rhs);
}

View File

@ -944,7 +944,7 @@ namespace etl
{
TLink* current = &first;
((current->etl_next = &links, static_cast<TLink&>(links).etl_previous = current, current = &links), ...);
return current;
}
@ -1303,16 +1303,30 @@ namespace etl
typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value, void>::type
link_rotate_left(TLink& parent, TLink& leaf)
{
parent.etl_right = leaf.etl_left;
TLink* grandparent = parent.etl_parent;
if (parent.etl_right != ETL_NULLPTR)
{
parent.etl_right->etl_parent = &parent;
}
parent.etl_right = leaf.etl_left;
leaf.etl_parent = parent.etl_parent;
parent.etl_parent = &leaf;
leaf.etl_left = &parent;
if (parent.etl_right != ETL_NULLPTR)
{
parent.etl_right->etl_parent = &parent;
}
leaf.etl_parent = grandparent;
parent.etl_parent = &leaf;
leaf.etl_left = &parent;
if (grandparent != ETL_NULLPTR)
{
if (grandparent->etl_left == &parent)
{
grandparent->etl_left = &leaf;
}
else if (grandparent->etl_right == &parent)
{
grandparent->etl_right = &leaf;
}
}
}
//***********************************
@ -1358,19 +1372,32 @@ namespace etl
typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value, void>::type
link_rotate_right(TLink& parent, TLink& leaf)
{
parent.etl_left = leaf.etl_right;
TLink* grandparent = parent.etl_parent;
if (parent.etl_left != ETL_NULLPTR)
{
parent.etl_left->etl_parent = &parent;
}
parent.etl_left = leaf.etl_right;
leaf.etl_parent = parent.etl_parent;
parent.etl_parent = &leaf;
leaf.etl_right = &parent;
if (parent.etl_left != ETL_NULLPTR)
{
parent.etl_left->etl_parent = &parent;
}
leaf.etl_parent = grandparent;
parent.etl_parent = &leaf;
leaf.etl_right = &parent;
if (grandparent != ETL_NULLPTR)
{
if (grandparent->etl_left == &parent)
{
grandparent->etl_left = &leaf;
}
else if (grandparent->etl_right == &parent)
{
grandparent->etl_right = &leaf;
}
}
}
template <typename TLink>
typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value, void>::type
link_rotate_right(TLink* parent, TLink* leaf)

View File

@ -53,6 +53,17 @@ namespace etl
template <typename... TTypes>
struct type_list;
template <typename T>
struct is_type_list : etl::false_type {};
template <typename... TTypes>
struct is_type_list<etl::type_list<TTypes...>> : etl::true_type {};
#if ETL_USING_CPP17
template <typename T>
inline constexpr bool is_type_list_v = is_type_list<T>::value;
#endif
//***************************************************************************
/// Check if a type is an etl::type_list.
//***************************************************************************

View File

@ -631,6 +631,16 @@ namespace
CHECK(data1 == data2);
}
//*************************************************************************
TEST(test_equal_constexpr)
{
ETL_CONSTEXPR14 Data data1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
ETL_CONSTEXPR14 Data data2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
ETL_CONSTEXPR14 bool result = (data1 == data2);
CHECK(result);
}
//*************************************************************************
TEST(test_not_equal)
{
@ -640,6 +650,16 @@ namespace
CHECK(data1 != data2);
}
//*************************************************************************
TEST(test_not_equal_constexpr)
{
ETL_CONSTEXPR14 Data data1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
ETL_CONSTEXPR14 Data data2 = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
ETL_CONSTEXPR14 bool result = (data1 != data2);
CHECK(result);
}
//*************************************************************************
TEST(test_less_than)
{

View File

@ -554,7 +554,7 @@ namespace
CHECK(data1.FLink0::etl_next == &data2);
CHECK(data2.FLink0::etl_next == nullptr);
CHECK(data3.FLink0::etl_next == nullptr);
etl::link_clear_range(*start);
CHECK(data0.FLink0::etl_next == &data3);
CHECK(data1.FLink0::etl_next == nullptr);
@ -882,11 +882,11 @@ namespace
BData data2(2);
BData data3(3);
// Use reference interface
// Use reference interface
data0.BLink0::set_next(data1);
data1.BLink0::set_next(data2);
data2.BLink0::set_next(data3);
data1.BLink0::set_previous(data0);
data2.BLink0::set_previous(data1);
data3.BLink0::set_previous(data2);
@ -1625,17 +1625,45 @@ namespace
etl::link_right(a, c);
etl::link_left(a, e);
// r //
// / //
// b //
// / \ //
// d a //
// / \ //
// e c //
etl::link_rotate_left(b, a);
// r //
// / //
// a //
// / \ //
// b c //
// / \ //
// d e //
CHECK(r.etl_left == &a);
CHECK(a.etl_parent == &r);
CHECK(b.etl_parent == &a);
CHECK(e.etl_parent == &b);
CHECK(d.etl_parent == &b);
CHECK(c.etl_parent == &a);
CHECK(a.etl_left == &b);
CHECK(a.etl_right == &c);
CHECK(b.etl_parent == &a);
CHECK(b.etl_left == &d);
CHECK(b.etl_right == &e);
CHECK(d.etl_parent == &b);
CHECK(d.etl_left == nullptr);
CHECK(d.etl_right == nullptr);
CHECK(c.etl_parent == &a);
CHECK(c.etl_left == nullptr);
CHECK(c.etl_right == nullptr);
CHECK(e.etl_parent == &b);
CHECK(e.etl_left == nullptr);
CHECK(e.etl_right == nullptr);
}
//*************************************************************************
@ -1656,16 +1684,41 @@ namespace
etl::link_left(b, d);
etl::link_right(a, c);
// r //
// / //
// b //
// / \ //
// d a //
// \ //
// c //
etl::link_rotate_left(b, a);
// r //
// / //
// a //
// / \ //
// b c //
// / //
// d //
CHECK(r.etl_left == &a);
CHECK(a.etl_parent == &r);
CHECK(b.etl_parent == &a);
CHECK(d.etl_parent == &b);
CHECK(c.etl_parent == &a);
CHECK(a.etl_left == &b);
CHECK(a.etl_right == &c);
CHECK(b.etl_parent == &a);
CHECK(b.etl_left == &d);
CHECK(b.etl_right == nullptr);
CHECK(d.etl_parent == &b);
CHECK(d.etl_left == nullptr);
CHECK(d.etl_right == nullptr);
CHECK(c.etl_parent == &a);
CHECK(c.etl_left == nullptr);
CHECK(c.etl_right == nullptr);
}
//*************************************************************************
@ -1684,21 +1737,49 @@ namespace
e.clear();
etl::link_left(r, a);
etl::link_left(a, b);
etl::link_left(b, d);
etl::link_right(a, c);
etl::link_left(b, d);
etl::link_right(b, e);
// r //
// / //
// a //
// / \ //
// b c //
// / \ //
// d e //
etl::link_rotate_right(a, b);
// r //
// / //
// b //
// / \ //
// d a //
// / \ //
// e c //
CHECK(r.etl_left == &b);
CHECK(b.etl_parent == &r);
CHECK(d.etl_parent == &b);
CHECK(a.etl_parent == &b);
CHECK(e.etl_parent == &a);
CHECK(c.etl_parent == &a);
CHECK(b.etl_left == &d);
CHECK(b.etl_right == &a);
CHECK(d.etl_parent == &b);
CHECK(d.etl_left == nullptr);
CHECK(d.etl_right == nullptr);
CHECK(a.etl_parent == &b);
CHECK(a.etl_left == &e);
CHECK(a.etl_right == &c);
CHECK(c.etl_parent == &a);
CHECK(c.etl_left == nullptr);
CHECK(c.etl_right == nullptr);
CHECK(e.etl_parent == &a);
CHECK(e.etl_left == nullptr);
CHECK(e.etl_right == nullptr);
}
//*************************************************************************
@ -1719,16 +1800,41 @@ namespace
etl::link_left(b, d);
etl::link_right(a, c);
// r //
// / //
// a //
// / \ //
// b c //
// / //
// d //
etl::link_rotate_right(a, b);
// r //
// / //
// b //
// / \ //
// d a //
// \ //
// c //
CHECK(r.etl_left == &b);
CHECK(b.etl_parent == &r);
CHECK(d.etl_parent == &b);
CHECK(a.etl_parent == &b);
CHECK(c.etl_parent == &a);
CHECK(b.etl_left == &d);
CHECK(b.etl_right == &a);
CHECK(d.etl_parent == &b);
CHECK(d.etl_left == nullptr);
CHECK(d.etl_right == nullptr);
CHECK(a.etl_parent == &b);
CHECK(a.etl_left == nullptr);
CHECK(a.etl_right == &c);
CHECK(c.etl_parent == &a);
CHECK(c.etl_left == nullptr);
CHECK(c.etl_right == nullptr);
}
}
}