27 # ifndef TPL_BINNODE_H 28 # define TPL_BINNODE_H 32 # include <ahAssert.H> 115 Empty_Node() noexcept { }
117 Empty_Node(SentinelCtor) noexcept { }
119 void reset() noexcept { }
121 Empty_Node & get_data()
123 throw std::domain_error(
"Empty_Node has not data");
127 # define INIT_CLASS_BINNODE(Name, height, Control_Data) \ 128 template <typename Key> \ 129 class Name : public Control_Data \ 132 static const size_t MaxHeight = height; \ 133 static Name * const NullPtr; \ 134 typedef Key key_type; \ 135 typedef Key Key_Type; \ 145 Key & get_key() noexcept { return key; } \ 146 const Key & get_key() const noexcept { return key; } \ 147 Name *& getL() noexcept { return lLink; } \ 148 Name *& getR() noexcept { return rLink; } \ 149 const Name * getL() const noexcept { return lLink; } \ 150 const Name * getR() const noexcept { return rLink; } \ 151 Name(const Key& k) noexcept(noexcept(Key(key))) \ 152 : key(k), lLink(NullPtr), rLink(NullPtr) \ 154 static_assert(std::is_copy_constructible<Key>::value, \ 155 "No copy constructor for Key"); \ 157 Name(Key && k) noexcept(noexcept(std::swap(key, k))) \ 158 : key(std::move(k)), lLink(NullPtr), rLink(NullPtr) \ 160 static_assert(std::is_move_constructible<Key>::value, \ 161 "No move constructor for Key"); \ 163 Name(const Control_Data & control_data, const Key & k) \ 164 noexcept(noexcept(Key(k))) \ 165 : Control_Data(control_data), \ 166 key(k), lLink(NullPtr), rLink(NullPtr) \ 170 Name(const Name & node) noexcept(noexcept(Key(node.key))) \ 171 : Control_Data(node), \ 172 key(node.key), lLink(NullPtr), rLink(NullPtr) \ 177 noexcept(noexcept(std::forward<Key>(node).key)) \ 178 : Control_Data(std::forward<Control_Data>(node)), \ 179 key(std::forward<Key>(node).key), lLink(NullPtr), rLink(NullPtr) \ 183 Name(const Control_Data & control_data) noexcept : \ 184 Control_Data(control_data), \ 185 lLink(NullPtr), rLink(NullPtr) \ 189 Name() noexcept(std::is_nothrow_constructible<Key>::value) \ 190 : lLink(NullPtr), rLink(NullPtr) \ 192 static_assert(std::is_default_constructible<Key>::value, \ 193 "No default constructor for Key"); \ 195 void reset() noexcept \ 197 Control_Data::reset(); \ 198 rLink = lLink = NullPtr; \ 200 static Name * key_to_node(Key & __key) noexcept \ 202 Name * node_zero = 0; \ 203 size_t offset = (size_t) &(node_zero->key); \ 204 unsigned long addr = (unsigned long)(&__key); \ 205 return (Name*) (addr - offset); \ 232 # define DECLARE_BINNODE(Name, height, Control_Data) \ 233 INIT_CLASS_BINNODE(Name, height, Control_Data) \ 235 template <typename Key> Name<Key> * const Name<Key>::NullPtr = nullptr; \ 236 INIT_CLASS_BINNODE(Name##Vtl, height, Control_Data) \ 237 virtual ~Name##Vtl() { } \ 239 template <typename Key> Name##Vtl<Key> * \ 240 const Name##Vtl<Key>::NullPtr = nullptr 272 # define DECLARE_BINNODE_SENTINEL(Name, height, Control_Data) \ 273 INIT_CLASS_BINNODE(Name, height, Control_Data) \ 274 Name(SentinelCtor) : \ 275 Control_Data(sentinelCtor), lLink(NullPtr), rLink(NullPtr) {} \ 276 static Name sentinel_node; \ 278 template <typename Key> \ 279 Name<Key> Name<Key>::sentinel_node(sentinelCtor); \ 280 template <typename Key> \ 281 Name<Key> * const Name<Key>::NullPtr = &Name<Key>::sentinel_node; \ 282 INIT_CLASS_BINNODE(Name##Vtl, height, Control_Data) \ 283 virtual ~Name##Vtl() { } \ 285 Name##Vtl(SentinelCtor) : \ 286 Control_Data(sentinelCtor), lLink(NullPtr), rLink(NullPtr) {} \ 287 static Name##Vtl sentinel_node; \ 289 template <typename Key> \ 290 Name##Vtl<Key> Name##Vtl<Key>::sentinel_node(sentinelCtor); \ 291 template <typename Key> \ 292 Name##Vtl<Key> * const Name##Vtl<Key>::NullPtr = \ 293 &Name##Vtl<Key>::sentinel_node 298 template <
class Node>
inline Node *&
LLINK(Node * p) noexcept
307 template <
class Node>
inline Node *&
RLINK(Node * p) noexcept
317 template <
class Node>
inline 318 typename Node::Key_Type &
KEY(Node * p) noexcept {
return p->get_key(); }
Node::Key_Type & KEY(Node *p) noexcept
Definition: tpl_binNode.H:318
Node *& LLINK(Node *p) noexcept
Definition: tpl_binNode.H:298
Node for binary search tree.
#define DECLARE_BINNODE(Name, height, Control_Data)
Definition: tpl_binNode.H:232
Node *& RLINK(Node *p) noexcept
Definition: tpl_binNode.H:307