20 memcpy (&u32,
_data,
sizeof (u32));
32 memcpy (&u32,
_data +
sizeof (uint32_t),
sizeof (u32));
44 memcpy (&u32,
_data + 2 *
sizeof (uint32_t),
sizeof (u32));
55 return _data + 3 *
sizeof (uint32_t);
108 sizeof (node_.
_data));
112 unsigned char first_byte_,
126 return !(*
this == other_);
131 const size_t node_size = 3 *
sizeof (uint32_t) + prefix_length_
132 + edgecount_ * (1 +
sizeof (
void *));
133 unsigned char *new_data =
134 static_cast<unsigned char *
> (realloc (
_data, node_size));
143 const size_t node_size = 3 *
sizeof (uint32_t) + prefix_length_
144 + edgecount_ * (1 +
sizeof (
void *));
146 unsigned char *
data =
static_cast<unsigned char *
> (malloc (node_size));
175 size_t prefix_bytes_matched_,
177 size_t parent_edge_index_,
181 _key_bytes_matched (key_bytes_matched_),
182 _prefix_bytes_matched (prefix_bytes_matched_),
183 _edge_index (edge_index_),
184 _parent_edge_index (parent_edge_index_),
185 _current_node (current_),
186 _parent_node (parent_),
187 _grandparent_node (grandparent_)
193 bool is_lookup_ =
false)
const
199 node_t parent_node = current_node;
200 node_t grandparent_node = current_node;
202 size_t key_byte_index = 0;
204 size_t prefix_byte_index = 0;
206 size_t edge_index = 0;
208 size_t parent_edge_index = 0;
211 const unsigned char *
const prefix = current_node.
prefix ();
214 for (prefix_byte_index = 0;
215 prefix_byte_index < prefix_length && key_byte_index < key_size_;
216 ++prefix_byte_index, ++key_byte_index) {
217 if (
prefix[prefix_byte_index] != key_[key_byte_index])
223 if (is_lookup_ && prefix_byte_index == prefix_length
225 key_byte_index = key_size_;
231 if (prefix_byte_index != prefix_length || key_byte_index == key_size_)
236 node_t next_node = current_node;
237 for (
size_t i = 0, edgecount = current_node.
edgecount ();
i < edgecount;
240 parent_edge_index = edge_index;
242 next_node = current_node.
node_at (
i);
247 if (next_node == current_node)
249 grandparent_node = parent_node;
250 parent_node = current_node;
251 current_node = next_node;
254 return match_result_t (key_byte_index, prefix_byte_index, edge_index,
255 parent_edge_index, current_node, parent_node,
264 const size_t edge_index = match_result.
_edge_index;
268 if (key_bytes_matched != key_size_) {
275 key_node.
set_prefix (key_ + key_bytes_matched);
290 (current_node.
edgecount () - 1) * sizeof (
void *));
294 key_[key_bytes_matched], key_node);
299 _root._data = current_node.
_data;
301 parent_node.
set_node_at (edge_index, current_node);
319 key_node.
set_prefix (key_ + key_bytes_matched);
330 current_node.
resize (prefix_bytes_matched, 2);
339 parent_node.
set_node_at (edge_index, current_node);
361 current_node.
resize (prefix_bytes_matched, 1);
371 parent_node.
set_node_at (edge_index, current_node);
380 return current_node.
refcount () == 1;
388 const size_t edge_index = match_result.
_edge_index;
394 if (key_bytes_matched != key_size_
405 if (current_node == _root)
408 const size_t outgoing_edges = current_node.
edgecount ();
409 if (outgoing_edges > 1)
414 if (outgoing_edges == 1) {
421 const uint32_t old_prefix_length = current_node.
prefix_length ();
422 current_node.
resize (old_prefix_length +
child.prefix_length (),
426 memcpy (current_node.
prefix () + old_prefix_length,
child.prefix (),
427 child.prefix_length ());
435 parent_node.
set_node_at (edge_index, current_node);
440 && parent_node != _root) {
450 const uint32_t old_prefix_length = parent_node.
prefix_length ();
455 memcpy (parent_node.
prefix () + old_prefix_length,
463 free (current_node.
_data);
464 free (other_child.
_data);
465 grandparent_node.
set_node_at (parent_edge_index, parent_node);
477 const size_t last_index = parent_node.
edgecount () - 1;
478 const unsigned char last_byte = parent_node.
first_byte_at (last_index);
480 parent_node.
set_edge_at (edge_index, last_byte, last_node);
486 parent_node.
edgecount () * sizeof (
void *));
494 free (current_node.
_data);
497 _root._data = parent_node.
_data;
499 grandparent_node.
set_node_at (parent_edge_index, parent_node);
505 if (_root.refcount () > 0)
517 std::vector<unsigned char> &
buffer_,
518 void (*func_) (
unsigned char *
data_,
size_t size_,
void *arg_),
523 std::copy (node_.
prefix (), node_.
prefix () + prefix_length,
531 for (
size_t i = 0, edgecount = node_.
edgecount ();
i < edgecount; ++
i) {
534 buffer_.resize (
static_cast<uint32_t
> (
buffer_.size () - prefix_length));
538 void (*func_) (
unsigned char *
data_,
size_t size_,
void *arg_),
void *arg_)
540 if (_root.refcount () > 0)
541 func_ (
NULL, 0, arg_);
543 std::vector<unsigned char>
buffer;
544 for (
size_t i = 0;
i < _root.edgecount (); ++
i)