diff --git a/include/etl/array.h b/include/etl/array.h
index efb2ce04..f1624209 100644
--- a/include/etl/array.h
+++ b/include/etl/array.h
@@ -1136,7 +1136,7 @@ namespace etl
///\return true if the arrays are equal, otherwise false
//*************************************************************************
template
- bool operator ==(const etl::array& lhs, const etl::array& rhs)
+ ETL_CONSTEXPR14 bool operator ==(const etl::array& lhs, const etl::array& rhs)
{
return etl::equal(lhs.cbegin(), lhs.cend(), rhs.cbegin());
}
@@ -1148,7 +1148,7 @@ namespace etl
///\return true if the arrays are not equal, otherwise false
//*************************************************************************
template
- bool operator !=(const etl::array& lhs, const etl::array& rhs)
+ ETL_CONSTEXPR14 bool operator !=(const etl::array& lhs, const etl::array& rhs)
{
return !(lhs == rhs);
}
diff --git a/include/etl/intrusive_links.h b/include/etl/intrusive_links.h
index 5c9544bf..69012668 100644
--- a/include/etl/intrusive_links.h
+++ b/include/etl/intrusive_links.h
@@ -944,7 +944,7 @@ namespace etl
{
TLink* current = &first;
((current->etl_next = &links, static_cast(links).etl_previous = current, current = &links), ...);
-
+
return current;
}
@@ -1303,16 +1303,30 @@ namespace etl
typename etl::enable_if >::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 >::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 etl::enable_if >::value, void>::type
link_rotate_right(TLink* parent, TLink* leaf)
diff --git a/include/etl/type_list.h b/include/etl/type_list.h
index 3030efcd..2ef16c6d 100644
--- a/include/etl/type_list.h
+++ b/include/etl/type_list.h
@@ -53,6 +53,17 @@ namespace etl
template
struct type_list;
+ template
+ struct is_type_list : etl::false_type {};
+
+ template
+ struct is_type_list> : etl::true_type {};
+
+#if ETL_USING_CPP17
+ template
+ inline constexpr bool is_type_list_v = is_type_list::value;
+#endif
+
//***************************************************************************
/// Check if a type is an etl::type_list.
//***************************************************************************
diff --git a/test/test_array.cpp b/test/test_array.cpp
index 9edd0719..27eaf674 100644
--- a/test/test_array.cpp
+++ b/test/test_array.cpp
@@ -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)
{
diff --git a/test/test_intrusive_links.cpp b/test/test_intrusive_links.cpp
index c5bb92c8..2407b724 100644
--- a/test/test_intrusive_links.cpp
+++ b/test/test_intrusive_links.cpp
@@ -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);
}
}
}