1 /*******************************************************************************
2 3 Elastic binary tree node struct template
4 5 Used as mixin in the EBTree classes.
6 7 Copyright:
8 Copyright (c) 2009-2016 dunnhumby Germany GmbH.
9 All rights reserved.
10 11 License:
12 Boost Software License Version 1.0. See LICENSE_BOOST.txt for details.
13 Alternatively, this file may be distributed under the terms of the Tango
14 3-Clause BSD License (see LICENSE_BSD.txt for details).
15 16 *******************************************************************************/17 18 moduleocean.util.container.ebtree.model.Node;
19 20 /*******************************************************************************
21 22 Node struct template
23 24 Template parameters:
25 eb_node = libebtree's internal node type
26 Key = key type (signed/unsigned integer)
27 eb_getkey = Key ( eb_node* node ); returns the key of node.
28 29 eb_next = eb_node* ( eb_node* n ); returns the next node for n or null
30 if n is the last node in the tree.
31 eb_prev = eb_node* ( eb_node* n ); returns the previous node for n or
32 null if n is the first node in the tree.
33 34 eb_next_unique = same as eb_next but skips key duplicates.
35 eb_prev_unique = same as eb_prev but skips key duplicates.
36 37 eb_delete = void ( eb_node* n ); removes n from the tree.
38 39 *******************************************************************************/40 41 structNode ( eb_node, Key, aliaseb_getkey, aliaseb_next, aliaseb_prev,
42 aliaseb_prev_unique, aliaseb_next_unique, aliaseb_delete )
43 {
44 /**************************************************************************
45 46 Node data content.
47 48 **************************************************************************/49 50 privateeb_nodenode_;
51 52 /**************************************************************************
53 54 Obtains the key of this node.
55 56 Returns:
57 key
58 59 **************************************************************************/60 61 publicKeykey ( )
62 {
63 // TODO: Check if this works with signed keys.64 65 // return this.node_.key_;66 returneb_getkey(&this.node_);
67 }
68 69 /**************************************************************************
70 71 Obtains the next node in the tree to which this node is associated.
72 73 Returns:
74 the next node or null if this is the last.
75 76 **************************************************************************/77 78 publictypeof(&this) next ( )
79 {
80 returnthis.ebCall!(eb_next);
81 }
82 83 /**************************************************************************
84 85 Obtains the previous node in the tree to which this node is associated.
86 87 Returns:
88 the previous node or null if this is the first.
89 90 **************************************************************************/91 92 publictypeof(&this) prev ( )
93 {
94 returnthis.ebCall!(eb_prev);
95 }
96 97 /**************************************************************************
98 99 Obtains the next node in the tree to which this node is associated,
100 skipping key duplicates.
101 102 Returns:
103 the next node with a unique key or null if this is the last.
104 105 **************************************************************************/106 107 publictypeof(&this) next_unique ( )
108 {
109 returnthis.ebCall!(eb_next_unique);
110 }
111 112 /**************************************************************************
113 114 Obtains the previous node in the tree to which this node is associated,
115 skipping key duplicates.
116 117 Returns:
118 the previous node with a unique key or null if this is the
119 first.
120 121 **************************************************************************/122 123 publictypeof(&this) prev_unique ( )
124 {
125 returnthis.ebCall!(eb_prev_unique);
126 }
127 128 /**************************************************************************
129 130 Removes this node from the tree to which this it is associated.
131 132 Returns:
133 this instance
134 135 **************************************************************************/136 137 privatetypeof(&this) remove ( )
138 {
139 eb_delete(&this.node_);
140 141 return &this;
142 }
143 144 /**************************************************************************
145 146 Library function call wrapper. Invokes eb_func with this instance as
147 first argument.
148 149 Params:
150 eb_func = library function
151 152 Returns:
153 passes through the return value of eb_func, which may be null.
154 155 **************************************************************************/156 157 privatetypeof(&this) ebCall ( aliaseb_func ) ( )
158 {
159 staticassert (is(typeof(eb_func(&this.node_)) == eb_node*));
160 161 returncast(typeof(&this)) eb_func(&this.node_);
162 }
163 }