datastructures 0.1.0
Loading...
Searching...
No Matches
_avl_common.ipp
Go to the documentation of this file.
1
7
8#pragma once
9
10#include "_avl_common.hpp"
11
12#include <memory>
13
14namespace datastructures {
15namespace detail {
16
17// ==== Destructor ====
18
19template <class TKey, class TItem, class TKeyComp, class TAlloc, class TNode>
21
22// ==== Memory Management Functions ====
23
24template <class TKey, class TItem, class TKeyComp, class TAlloc, class TNode>
25template <class T>
26 requires(!std::is_invocable_v<T>)
29 auto node = node_alloc_traits::allocate(allocator, 1);
30
31 try {
32 node_alloc_traits::construct(allocator, std::to_address(node),
33 std::forward<T>(item));
34 } catch (...) {
35 node_alloc_traits::deallocate(allocator, node, 1);
36 throw;
37 }
38
39 return node;
40}
41
42template <class TKey, class TItem, class TKeyComp, class TAlloc, class TNode>
43template <class TCallback>
44 requires std::is_invocable_v<TCallback>
47 TCallback &&callback) {
48 auto node = node_alloc_traits::allocate(allocator, 1);
49
50 try {
51 node_alloc_traits::construct(allocator, std::to_address(node),
52 callback());
53 } catch (...) {
54 node_alloc_traits::deallocate(allocator, node, 1);
55 throw;
56 }
57
58 return node;
59}
60
61template <class TKey, class TItem, class TKeyComp, class TAlloc, class TNode>
63 node_ptr node) noexcept {
64 node_alloc_traits::destroy(allocator, std::to_address(node));
65 node_alloc_traits::deallocate(allocator, node, 1);
66}
67
68// ==== Access Operations ====
69
70template <class TKey, class TItem, class TKeyComp, class TAlloc, class TNode>
73 node_ptr node) noexcept {
74 if (node == nullptr) {
75 return nullptr;
76 }
77 while (node->left != nullptr) {
78 node = node->left;
79 }
80 return node;
81}
82
83template <class TKey, class TItem, class TKeyComp, class TAlloc, class TNode>
86 node_ptr node) noexcept {
87 if (node == nullptr) {
88 return nullptr;
89 }
90 while (node->right != nullptr) {
91 node = node->right;
92 }
93 return node;
94}
95
96} // namespace detail
97} // namespace datastructures
Header for functions and classes common to all avl trees.
Base class for avl trees.
Definition _avl_common.hpp:76
static node_ptr min_from(node_ptr node) noexcept
Finds the minimum value starting at the given node.
Definition _avl_common.ipp:72
static node_ptr max_from(node_ptr node) noexcept
Finds the maximum value starting at the given node.
Definition _avl_common.ipp:85
avl_node_ptr< node_type, allocator_type > node_ptr
The node pointer type.
Definition _avl_common.hpp:90
node_ptr create_node(T &&item)
Constructs a new node with the given item.
Definition _avl_common.ipp:28
void destroy_node(node_ptr node) noexcept
Destroys the node and frees the memory.
Definition _avl_common.ipp:62
Declarations of the persistent map.
Definition _avl.hpp:14