41#ifndef PB_DS_LEFT_CHILD_NEXT_SIBLING_HEAP_HPP
42#define PB_DS_LEFT_CHILD_NEXT_SIBLING_HEAP_HPP
54#ifdef PB_DS_LC_NS_HEAP_TRACE_
64#define PB_DS_CLASS_T_DEC \
65 template<typename Value_Type, typename Cmp_Fn, typename Node_Metadata, \
66 typename _Alloc, bool Single_Link_Roots>
68#define PB_DS_CLASS_C_DEC \
69 left_child_next_sibling_heap<Value_Type, Cmp_Fn, Node_Metadata, \
70 _Alloc, Single_Link_Roots>
72#define PB_DS_CLASS_T_DEC \
73 template<typename Value_Type, typename Cmp_Fn, typename Node_Metadata, \
76#define PB_DS_CLASS_C_DEC \
77 left_child_next_sibling_heap<Value_Type, Cmp_Fn, Node_Metadata, _Alloc>
81 template<
typename Value_Type,
83 typename Node_Metadata,
86 ,
bool Single_Link_Roots>
101 typedef typename alloc_traits::allocator_type node_allocator;
103 typedef typename alloc_traits::pointer node_pointer;
104 typedef typename alloc_traits::const_pointer node_const_pointer;
105 typedef Node_Metadata node_metadata;
113 simple_value = is_simple<Value_Type>::value
116 typedef integral_constant<int, simple_value> no_throw_copies_t;
120 typedef typename _Alloc::size_type size_type;
121 typedef typename _Alloc::difference_type difference_type;
122 typedef Value_Type value_type;
124 typedef typename __rebind_v::pointer pointer;
125 typedef typename __rebind_v::const_pointer const_pointer;
126 typedef typename __rebind_v::reference reference;
127 typedef typename __rebind_v::const_reference const_reference;
138 typedef Cmp_Fn cmp_fn;
139 typedef _Alloc allocator_type;
146 swap(PB_DS_CLASS_C_DEC&);
150 _GLIBCXX_NODISCARD
inline bool
180#ifdef PB_DS_LC_NS_HEAP_TRACE_
187 get_new_node_for_insert(const_reference);
190 make_child_of(node_pointer, node_pointer);
195 inline static node_pointer
196 parent(node_pointer);
199 swap_with_parent(node_pointer, node_pointer);
202 bubble_to_top(node_pointer);
205 actual_erase_node(node_pointer);
208 clear_imp(node_pointer);
213 template<
typename Pred>
219 assert_valid(
const char*,
int)
const;
222 assert_node_consistent(node_const_pointer,
bool,
const char*,
int)
const;
225 size_under_node(node_const_pointer);
228 degree(node_const_pointer);
231#ifdef PB_DS_LC_NS_HEAP_TRACE_
233 trace_node(node_const_pointer, size_type);
239 assert_iterators(
const char*,
int)
const;
242 assert_size(
const char*,
int)
const;
245 size_from_node(node_const_pointer);
249 recursive_copy_node(node_const_pointer);
252 get_new_node_for_insert(const_reference, false_type);
255 get_new_node_for_insert(const_reference, true_type);
257#ifdef PB_DS_LC_NS_HEAP_TRACE_
258 template<
typename Metadata_>
260 trace_node_metadata(node_const_pointer, type_to_type<Metadata_>);
263 trace_node_metadata(node_const_pointer, type_to_type<null_type>);
266 static node_allocator s_node_allocator;
267 static no_throw_copies_t s_no_throw_copies_ind;
270 node_pointer m_p_root;
283#undef PB_DS_CLASS_C_DEC
284#undef PB_DS_CLASS_T_DEC
GNU extensions for policy-based data structures for public use.
Struct holding two objects of arbitrary type.
Conditional deallocate constructor argument.
Consistent API for accessing allocator-related types.
Const point-type iterator.
Base class for a basic heap.
Const point-type iterator.