31#ifndef ETL_INTRUSIVE_LINKS_INCLUDED
32#define ETL_INTRUSIVE_LINKS_INCLUDED
64 link_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
65 :
exception(reason_, file_name_, line_number_)
77 not_unlinked_exception(string_type file_name_, numeric_type line_number_)
78 : link_exception(ETL_ERROR_TEXT(
"link:still linked", ETL_INTRUSIVE_LINKS_FILE_ID
"A"), file_name_, line_number_)
96 : etl_next(ETL_NULLPTR)
101 forward_link(forward_link* p_next)
107 forward_link(
const forward_link& other)
108 : etl_next(other.etl_next)
113 forward_link& operator =(
const forward_link& other)
115 etl_next = other.etl_next;
123 etl_next = ETL_NULLPTR;
128 bool is_linked()
const
130 return etl_next != ETL_NULLPTR;
135 bool has_next()
const
137 return etl_next != ETL_NULLPTR;
141 void set_next(forward_link* n)
147 void set_next(forward_link& n)
154 forward_link* get_next()
const
159 forward_link* etl_next;
163 template <
typename TLink>
171 template <
typename TLink>
172 inline constexpr bool is_forward_link_v = etl::is_forward_link<TLink>::value;
179 template <
typename TLink>
181 link(TLink& lhs, TLink& rhs)
188 template <
typename TLink>
190 link(TLink* lhs, TLink* rhs)
192 if (lhs != ETL_NULLPTR)
200 template <
typename TLink>
201 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
202 link(TLink& lhs, TLink* rhs)
209 template <
typename TLink>
210 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
211 link(TLink* lhs, TLink& rhs)
213 if (lhs != ETL_NULLPTR)
215 lhs->etl_next = &rhs;
223 template <
typename TLink>
224 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
225 link_splice(TLink& lhs, TLink& rhs)
227 rhs.etl_next = lhs.etl_next;
233 template <
typename TLink>
234 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
235 link_splice(TLink* lhs, TLink* rhs)
237 if (lhs != ETL_NULLPTR)
239 if (rhs != ETL_NULLPTR)
241 rhs->etl_next = lhs->etl_next;
250 template <
typename TLink>
251 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
252 link_splice(TLink& lhs, TLink* rhs)
254 if (rhs != ETL_NULLPTR)
256 rhs->etl_next = lhs.etl_next;
264 template <
typename TLink>
265 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
266 link_splice(TLink* lhs, TLink& rhs)
268 if (lhs != ETL_NULLPTR)
270 rhs.etl_next = lhs->etl_next;
271 lhs->etl_next = &rhs;
277 template <
typename TLink>
278 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
279 link_splice(TLink& lhs, TLink& first, TLink& last)
281 last.etl_next = lhs.etl_next;
282 lhs.etl_next = &first;
287 template <
typename TLink>
288 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
289 link_splice(TLink* lhs, TLink& first, TLink& last)
291 if (lhs != ETL_NULLPTR)
293 last.etl_next = lhs->etl_next;
294 lhs->etl_next = &first;
298 last.etl_next = ETL_NULLPTR;
306 template <
typename TLink>
307 typename etl::enable_if<etl::is_forward_link<TLink>::value, TLink*>::type
308 unlink_after(TLink& node)
310 if (node.etl_next != ETL_NULLPTR)
312 TLink* unlinked_node = node.etl_next;
313 node.etl_next = unlinked_node->etl_next;
314 unlinked_node->clear();
315 return unlinked_node;
318 return node.etl_next;
323 template <
typename TLink>
324 typename etl::enable_if<etl::is_forward_link<TLink>::value, TLink*>::type
325 unlink_after(TLink& before, TLink& last)
327 TLink* first = before.etl_next;
329 if (&before != &last)
331 before.etl_next = last.etl_next;
339 template <
typename TLink>
340 typename etl::enable_if<etl::is_forward_link<TLink>::value,
bool>::type
341 is_linked(TLink& node)
343 return node.is_linked();
347 template <
typename TLink>
348 typename etl::enable_if<etl::is_forward_link<TLink>::value,
bool>::type
349 is_linked(TLink* node)
351 return node->is_linked();
358 template <
typename TLink>
359 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
360 link_clear(TLink& start)
362 start.etl_next = ETL_NULLPTR;
367 template <
typename TLink>
368 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
369 link_clear(TLink* start)
371 if (start != ETL_NULLPTR)
373 etl::link_clear(*start);
381 template <
typename TLink>
382 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
383 link_clear_range(TLink& start)
385 TLink* current = &start;
387 while (current != ETL_NULLPTR)
389 TLink* next = current->etl_next;
397 template <
typename TLink>
398 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
399 link_clear_range(TLink* start)
401 if (start != ETL_NULLPTR)
403 etl::link_clear_range(*start);
411 template <
typename TLink,
typename... TLinks>
412 typename etl::enable_if<etl::is_forward_link<TLink>::value, TLink*>::type
413 create_linked_list(TLink& first, TLinks&... links)
415 TLink* current = &first;
416 ((current->etl_next = &links, current = &links), ...);
424 template <
typename TLink,
typename... TLinks>
425 typename etl::enable_if<etl::is_forward_link<TLink>::value, TLink*>::type
426 create_linked_list(TLink* first, TLinks*... links)
428 if (first != ETL_NULLPTR)
430 return create_linked_list(*first, (*links)...);
441 template <
typename TLink>
442 typename etl::enable_if<etl::is_forward_link<TLink>::value, TLink*>::type
443 create_linked_list(TLink& first)
451 template <
typename TLink,
typename... TLinks>
452 typename etl::enable_if<etl::is_forward_link<TLink>::value, TLink*>::type
453 create_linked_list(TLink& first, TLink& next, TLinks&... links)
455 first.etl_next = &next;
456 return create_linked_list(next,
static_cast<TLink&
>(links)...);
462 template <
typename TLink>
463 typename etl::enable_if<etl::is_forward_link<TLink>::value, TLink*>::type
464 create_linked_list(TLink* first)
466 if (first != ETL_NULLPTR)
468 return create_linked_list(*first);
479 template <
typename TLink,
typename... TLinks>
480 typename etl::enable_if<etl::is_forward_link<TLink>::value, TLink*>::type
481 create_linked_list(TLink* first, TLink* next, TLinks*... links)
483 if (first != ETL_NULLPTR)
485 return create_linked_list(*first, *next,
static_cast<TLink&
>(*links)...);
495 template <
typename TLink>
496 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
497 detach_linked_list(TLink& first)
499 link_clear_range(first);
503 template <
typename TLink>
504 typename etl::enable_if<etl::is_forward_link<TLink>::value,
void>::type
505 detach_linked_list(TLink* first)
507 if (first != ETL_NULLPTR)
509 detach_linked_list(*first);
516 template <
size_t ID_>
517 struct bidirectional_link
526 : etl_previous(ETL_NULLPTR)
527 , etl_next(ETL_NULLPTR)
532 bidirectional_link(bidirectional_link* p_previous, bidirectional_link* p_next)
533 : etl_previous(p_previous)
539 bidirectional_link(
const bidirectional_link& other)
540 : etl_previous(other.etl_previous)
541 , etl_next(other.etl_next)
546 bidirectional_link& operator =(
const bidirectional_link& other)
548 etl_previous = other.etl_previous;
549 etl_next = other.etl_next;
557 etl_previous = ETL_NULLPTR;
558 etl_next = ETL_NULLPTR;
563 bool is_linked()
const
565 return (etl_previous != ETL_NULLPTR) || (etl_next != ETL_NULLPTR);
570 bool has_next()
const
572 return etl_next != ETL_NULLPTR;
577 bool has_previous()
const
579 return etl_previous != ETL_NULLPTR;
583 void set_next(bidirectional_link* n)
589 void set_next(bidirectional_link& n)
596 bidirectional_link* get_next()
const
602 void set_previous(bidirectional_link* n)
608 void set_previous(bidirectional_link& n)
615 bidirectional_link* get_previous()
const
623 using ETL_OR_STD::swap;
624 swap(etl_previous, etl_next);
631 if (etl_previous != ETL_NULLPTR)
633 etl_previous->etl_next = etl_next;
637 if (etl_next != ETL_NULLPTR)
639 etl_next->etl_previous = etl_previous;
645 bidirectional_link* etl_previous;
646 bidirectional_link* etl_next;
650 template <
typename TLink>
658 template <
typename TLink>
659 inline constexpr bool is_bidirectional_link_v = etl::is_bidirectional_link<TLink>::value;
666 template <
typename TLink>
668 link(TLink& lhs, TLink& rhs)
671 rhs.etl_previous = &lhs;
676 template <
typename TLink>
678 link(TLink* lhs, TLink* rhs)
680 if (lhs != ETL_NULLPTR)
685 if (rhs != ETL_NULLPTR)
687 rhs->etl_previous = lhs;
693 template <
typename TLink>
694 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
void>::type
695 link(TLink& lhs, TLink* rhs)
699 if (rhs != ETL_NULLPTR)
701 rhs->etl_previous = &lhs;
707 template <
typename TLink>
708 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
void>::type
709 link(TLink* lhs, TLink& rhs)
711 if (lhs != ETL_NULLPTR)
713 lhs->etl_next = &rhs;
716 rhs.etl_previous = lhs;
721 template <
typename TLink>
722 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
void>::type
723 link_splice(TLink& lhs, TLink& rhs)
725 rhs.etl_next = lhs.etl_next;
726 rhs.etl_previous = &lhs;
728 if (lhs.etl_next != ETL_NULLPTR)
730 lhs.etl_next->etl_previous = &rhs;
740 template <
typename TLink>
741 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
void>::type
742 link_splice(TLink* lhs, TLink* rhs)
744 if (rhs != ETL_NULLPTR)
746 if (lhs != ETL_NULLPTR)
748 rhs->etl_next = lhs->etl_next;
751 rhs->etl_previous = lhs;
754 if (lhs != ETL_NULLPTR)
756 if (lhs->etl_next != ETL_NULLPTR)
758 lhs->etl_next->etl_previous = rhs;
767 template <
typename TLink>
768 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
void>::type
769 link_splice(TLink& lhs, TLink* rhs)
771 if (rhs != ETL_NULLPTR)
773 rhs->etl_next = lhs.etl_next;
774 rhs->etl_previous = &lhs;
777 if (lhs.etl_next != ETL_NULLPTR)
779 lhs.etl_next->etl_previous = rhs;
787 template <
typename TLink>
788 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
void>::type
789 link_splice(TLink* lhs, TLink& rhs)
791 if (lhs != ETL_NULLPTR)
793 rhs.etl_next = lhs->etl_next;
796 rhs.etl_previous = lhs;
798 if (lhs != ETL_NULLPTR)
800 if (lhs->etl_next != ETL_NULLPTR)
802 lhs->etl_next->etl_previous = &rhs;
805 lhs->etl_next = &rhs;
811 template <
typename TLink>
812 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
void>::type
813 link_splice(TLink& lhs, TLink& first, TLink& last)
815 last.etl_next = lhs.etl_next;
816 first.etl_previous = &lhs;
818 if (last.etl_next != ETL_NULLPTR)
820 last.etl_next->etl_previous = &last;
823 lhs.etl_next = &first;
828 template <
typename TLink>
829 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
void>::type
830 link_splice(TLink* lhs, TLink& first, TLink& last)
832 if (lhs != ETL_NULLPTR)
834 last.etl_next = lhs->etl_next;
838 last.etl_next = ETL_NULLPTR;
841 first.etl_previous = lhs;
843 if (last.etl_next != ETL_NULLPTR)
845 last.etl_next->etl_previous = &last;
848 if (lhs != ETL_NULLPTR)
850 lhs->etl_next = &first;
858 template <
typename TLink>
859 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
void>::type
867 template <
typename TLink>
868 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value, TLink&>::type
869 unlink(TLink& first, TLink& last)
877 if (last.etl_next != ETL_NULLPTR)
879 last.etl_next->etl_previous = first.etl_previous;
882 if (first.etl_previous != ETL_NULLPTR)
884 first.etl_previous->etl_next = last.etl_next;
887 first.etl_previous = ETL_NULLPTR;
888 last.etl_next = ETL_NULLPTR;
895 template <
typename TLink>
896 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
bool>::type
897 is_linked(TLink& node)
899 return node.is_linked();
903 template <
typename TLink>
904 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
bool>::type
905 is_linked(TLink* node)
907 return node->is_linked();
914 template <
typename TLink>
915 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
void>::type
916 link_clear_range(TLink& start)
918 TLink* current = &start;
920 while (current != ETL_NULLPTR)
922 TLink* next = current->etl_next;
930 template <
typename TLink>
931 typename etl::enable_if<etl::is_same<TLink, etl::bidirectional_link<TLink::ID> >::value,
void>::type
932 link_clear_range(TLink* start)
934 etl::link_clear_range(*start);
941 template <
typename TLink,
typename... TLinks>
942 typename etl::enable_if<etl::is_bidirectional_link<TLink>::value, TLink*>::type
943 create_linked_list(TLink& first, TLinks&... links)
945 TLink* current = &first;
946 ((current->etl_next = &links,
static_cast<TLink&
>(links).etl_previous = current, current = &links), ...);
954 template <
typename TLink,
typename... TLinks>
955 typename etl::enable_if<etl::is_bidirectional_link<TLink>::value, TLink*>::type
956 create_linked_list(TLink* first, TLinks*... links)
958 TLink* current = first;
959 ((current->etl_next = links,
static_cast<TLink*
>(links)->etl_previous = current, current = links), ...);
967 template <
typename TLink>
968 typename etl::enable_if<etl::is_bidirectional_link<TLink>::value, TLink*>::type
969 create_linked_list(TLink& first)
977 template <
typename TLink,
typename... TLinks>
978 typename etl::enable_if<etl::is_bidirectional_link<TLink>::value, TLink*>::type
979 create_linked_list(TLink& first, TLink& next, TLinks&... links)
981 first.etl_next = &next;
982 next.etl_previous = &first;
984 return create_linked_list(next,
static_cast<TLink&
>(links)...);
990 template <
typename TLink,
typename... TLinks>
991 typename etl::enable_if<etl::is_bidirectional_link<TLink>::value, TLink*>::type
992 create_linked_list(TLink* first, TLink* next, TLinks*... links)
994 if (first != ETL_NULLPTR)
996 return create_linked_list(*first, *next,
static_cast<TLink&
>(*links)...);
1006 template <
typename TLink>
1007 typename etl::enable_if<etl::is_bidirectional_link<TLink>::value,
void>::type
1008 detach_linked_list(TLink& first)
1010 link_clear_range(first);
1014 template <
typename TLink>
1015 typename etl::enable_if<etl::is_bidirectional_link<TLink>::value,
void>::type
1016 detach_linked_list(TLink* first)
1018 if (first != ETL_NULLPTR)
1020 detach_linked_list(*first);
1027 template <
size_t ID_>
1037 : etl_parent(ETL_NULLPTR)
1038 , etl_left(ETL_NULLPTR)
1039 , etl_right(ETL_NULLPTR)
1044 tree_link(tree_link* p_parent, tree_link* p_left, tree_link* p_right)
1045 : etl_parent(p_parent)
1047 , etl_right(p_right)
1052 tree_link(
const tree_link& other)
1053 : etl_parent(other.etl_parent)
1054 , etl_left(other.etl_left)
1055 , etl_right(other.etl_right)
1060 tree_link& operator =(
const tree_link& other)
1062 etl_parent = other.etl_parent;
1063 etl_left = other.etl_left;
1064 etl_right = other.etl_right;
1072 etl_parent = ETL_NULLPTR;
1073 etl_left = ETL_NULLPTR;
1074 etl_right = ETL_NULLPTR;
1078 bool is_linked()
const
1080 return (etl_parent != ETL_NULLPTR) || (etl_left != ETL_NULLPTR) || (etl_right != ETL_NULLPTR);
1085 bool has_parent()
const
1087 return etl_parent != ETL_NULLPTR;
1092 bool has_left()
const
1094 return etl_left != ETL_NULLPTR;
1099 bool has_right()
const
1101 return etl_right != ETL_NULLPTR;
1105 void set_parent(tree_link* p)
1111 void set_left(tree_link* l)
1117 void set_right(tree_link* r)
1123 void set_parent(tree_link& p)
1129 void set_left(tree_link& l)
1135 void set_right(tree_link& r)
1142 tree_link* get_parent()
const
1149 tree_link* get_left()
const
1156 tree_link* get_right()
const
1164 using ETL_OR_STD::swap;
1165 swap(etl_left, etl_right);
1168 tree_link* etl_parent;
1169 tree_link* etl_left;
1170 tree_link* etl_right;
1174 template <
typename TLink>
1182 template <
typename TLink>
1183 inline constexpr bool is_tree_link_v = etl::is_tree_link<TLink>::value;
1191 template <
typename TLink>
1193 link_left(TLink& parent, TLink& leaf)
1195 parent.etl_left = &leaf;
1196 leaf.etl_parent = &parent;
1201 template <
typename TLink>
1203 link_left(TLink* parent, TLink* leaf)
1205 if (parent != ETL_NULLPTR)
1207 parent->etl_left = leaf;
1210 if (leaf != ETL_NULLPTR)
1212 leaf->etl_parent = parent;
1218 template <
typename TLink>
1219 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1220 link_left(TLink& parent, TLink* leaf)
1222 parent.etl_left = leaf;
1224 if (leaf != ETL_NULLPTR)
1226 leaf->etl_parent = &parent;
1232 template <
typename TLink>
1233 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1234 link_left(TLink* parent, TLink& leaf)
1236 if (parent != ETL_NULLPTR)
1238 parent->etl_left = &leaf;
1241 leaf.etl_parent = parent;
1248 template <
typename TLink>
1249 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1250 link_right(TLink& parent, TLink& leaf)
1252 parent.etl_right = &leaf;
1253 leaf.etl_parent = &parent;
1257 template <
typename TLink>
1258 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1259 link_right(TLink* parent, TLink* leaf)
1261 if (parent != ETL_NULLPTR)
1263 parent->etl_right = leaf;
1266 if (leaf != ETL_NULLPTR)
1268 leaf->etl_parent = parent;
1273 template <
typename TLink>
1274 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1275 link_right(TLink& parent, TLink* leaf)
1277 parent.etl_right = leaf;
1279 if (leaf != ETL_NULLPTR)
1281 leaf->etl_parent = &parent;
1286 template <
typename TLink>
1287 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1288 link_right(TLink* parent, TLink& leaf)
1290 if (parent != ETL_NULLPTR)
1292 parent->etl_right = &leaf;
1295 leaf.etl_parent = parent;
1302 template <
typename TLink>
1303 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1304 link_rotate_left(TLink& parent, TLink& leaf)
1306 parent.etl_right = leaf.etl_left;
1308 if (parent.etl_right != ETL_NULLPTR)
1310 parent.etl_right->etl_parent = &parent;
1313 leaf.etl_parent = parent.etl_parent;
1314 parent.etl_parent = &leaf;
1315 leaf.etl_left = &parent;
1320 template <
typename TLink>
1321 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1322 link_rotate_left(TLink* parent, TLink* leaf)
1324 if ((parent != ETL_NULLPTR) && (leaf != ETL_NULLPTR))
1326 link_rotate_left(*parent, *leaf);
1332 template <
typename TLink>
1333 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1334 link_rotate_left(TLink& parent, TLink* leaf)
1336 if (leaf != ETL_NULLPTR)
1338 link_rotate_left(parent, *leaf);
1344 template <
typename TLink>
1345 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1346 link_rotate_left(TLink* parent, TLink& leaf)
1348 if (parent != ETL_NULLPTR)
1350 link_rotate_left(*parent, leaf);
1357 template <
typename TLink>
1358 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1359 link_rotate_right(TLink& parent, TLink& leaf)
1361 parent.etl_left = leaf.etl_right;
1363 if (parent.etl_left != ETL_NULLPTR)
1365 parent.etl_left->etl_parent = &parent;
1368 leaf.etl_parent = parent.etl_parent;
1369 parent.etl_parent = &leaf;
1370 leaf.etl_right = &parent;
1374 template <
typename TLink>
1375 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1376 link_rotate_right(TLink* parent, TLink* leaf)
1378 if ((parent != ETL_NULLPTR) && (leaf != ETL_NULLPTR))
1380 link_rotate_right(*parent, *leaf);
1384 template <
typename TLink>
1385 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1386 link_rotate_right(TLink& parent, TLink* leaf)
1388 if (leaf != ETL_NULLPTR)
1390 link_rotate_right(parent, *leaf);
1395 template <
typename TLink>
1396 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1397 link_rotate_right(TLink* parent, TLink& leaf)
1399 if (parent != ETL_NULLPTR)
1401 link_rotate_right(*parent, leaf);
1410 template <
typename TLink>
1411 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1414 if (parent.etl_left == &leaf)
1416 etl::link_rotate_right(parent, leaf);
1420 etl::link_rotate_left(parent, leaf);
1427 template <
typename TLink>
1431 if ((parent != ETL_NULLPTR) && (leaf != ETL_NULLPTR))
1433 if (parent->etl_left == leaf)
1435 etl::link_rotate_right(*parent, *leaf);
1439 etl::link_rotate_left(*parent, *leaf);
1447 template <
typename TLink>
1451 if (leaf != ETL_NULLPTR)
1453 if (parent.etl_left == leaf)
1455 etl::link_rotate_right(parent, *leaf);
1459 etl::link_rotate_left(parent, *leaf);
1467 template <
typename TLink>
1471 if (parent != ETL_NULLPTR)
1473 if (parent->etl_left == &leaf)
1475 etl::link_rotate_right(*parent, leaf);
1479 etl::link_rotate_left(*parent, leaf);
1485 template <
typename TLink>
1487 link_clear(TLink& node)
1493 template <
typename TLink>
1494 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
void>::type
1495 link_clear(TLink* node)
1501 template <
typename TLink>
1502 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
bool>::type
1503 is_linked(TLink& node)
1505 return node.is_linked();
1509 template <
typename TLink>
1510 typename etl::enable_if<etl::is_same<TLink, etl::tree_link<TLink::ID> >::value,
bool>::type
1511 is_linked(TLink* node)
1513 return node->is_linked();
Link exception.
Definition intrusive_links.h:61
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
Definition exception.h:47
enable_if
Definition type_traits_generator.h:1254
is_same
Definition type_traits_generator.h:1104
bitset_ext
Definition absolute.h:39
ETL_CONSTEXPR14 void swap(etl::typed_storage_ext< T > &lhs, etl::typed_storage_ext< T > &rhs) ETL_NOEXCEPT
Swap two etl::typed_storage_ext.
Definition alignment.h:838
etl::enable_if< etl::is_same< TLink, etl::tree_link< TLink::ID > >::value, void >::type link_rotate(TLink &parent, TLink &leaf)
Automatically detects whether a left or right rotate is expected.
Definition intrusive_links.h:1412
Definition intrusive_links.h:652
Definition intrusive_links.h:165
Definition intrusive_links.h:1176