mirror of
https://github.com/ETLCPP/etl.git
synced 2026-04-30 19:09:10 +08:00
Merge branch 'development' into feature/Add-more-type_list-features
# Conflicts: # include/etl/utility.h
This commit is contained in:
commit
52e57bc8b6
@ -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);
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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.
|
||||
//***************************************************************************
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user