ffi-radix_tree 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +39 -0
- data/Rakefile +19 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/ext/ffi/radixtree/Rakefile +62 -0
- data/ffi-radix_tree.gemspec +40 -0
- data/lib/ffi/radix_tree.rb +129 -0
- data/lib/ffi/radix_tree/version.rb +5 -0
- data/vendor/radixtree/CMakeLists.txt +10 -0
- data/vendor/radixtree/COPYING +21 -0
- data/vendor/radixtree/ffi_radix_tree.cpp +101 -0
- data/vendor/radixtree/radix_tree.hpp +536 -0
- data/vendor/radixtree/radix_tree_it.hpp +117 -0
- data/vendor/radixtree/radix_tree_node.hpp +53 -0
- metadata +134 -0
@@ -0,0 +1,117 @@
|
|
1
|
+
#ifndef RADIX_TREE_IT
|
2
|
+
#define RADIX_TREE_IT
|
3
|
+
|
4
|
+
#include <iterator>
|
5
|
+
|
6
|
+
// forward declaration
|
7
|
+
template <typename K, typename T> class radix_tree;
|
8
|
+
template <typename K, typename T> class radix_tree_node;
|
9
|
+
|
10
|
+
template <typename K, typename T>
|
11
|
+
class radix_tree_it : public std::iterator<std::forward_iterator_tag, std::pair<K, T> > {
|
12
|
+
friend class radix_tree<K, T>;
|
13
|
+
|
14
|
+
public:
|
15
|
+
radix_tree_it() : m_pointee(0) { }
|
16
|
+
radix_tree_it(const radix_tree_it& r) : m_pointee(r.m_pointee) { }
|
17
|
+
radix_tree_it& operator=(const radix_tree_it& r) { m_pointee = r.m_pointee; return *this; }
|
18
|
+
~radix_tree_it() { }
|
19
|
+
|
20
|
+
std::pair<const K, T>& operator* () const;
|
21
|
+
std::pair<const K, T>* operator-> () const;
|
22
|
+
const radix_tree_it<K, T>& operator++ ();
|
23
|
+
radix_tree_it<K, T> operator++ (int);
|
24
|
+
// const radix_tree_it<K, T>& operator-- ();
|
25
|
+
bool operator!= (const radix_tree_it<K, T> &lhs) const;
|
26
|
+
bool operator== (const radix_tree_it<K, T> &lhs) const;
|
27
|
+
|
28
|
+
private:
|
29
|
+
radix_tree_node<K, T> *m_pointee;
|
30
|
+
radix_tree_it(radix_tree_node<K, T> *p) : m_pointee(p) { }
|
31
|
+
|
32
|
+
radix_tree_node<K, T>* increment(radix_tree_node<K, T>* node) const;
|
33
|
+
radix_tree_node<K, T>* descend(radix_tree_node<K, T>* node) const;
|
34
|
+
};
|
35
|
+
|
36
|
+
template <typename K, typename T>
|
37
|
+
radix_tree_node<K, T>* radix_tree_it<K, T>::increment(radix_tree_node<K, T>* node) const
|
38
|
+
{
|
39
|
+
radix_tree_node<K, T>* parent = node->m_parent;
|
40
|
+
|
41
|
+
if (parent == NULL)
|
42
|
+
return NULL;
|
43
|
+
|
44
|
+
typename radix_tree_node<K, T>::it_child it = parent->m_children.find(node->m_key);
|
45
|
+
assert(it != parent->m_children.end());
|
46
|
+
++it;
|
47
|
+
|
48
|
+
if (it == parent->m_children.end())
|
49
|
+
return increment(parent);
|
50
|
+
else
|
51
|
+
return descend(it->second);
|
52
|
+
}
|
53
|
+
|
54
|
+
template <typename K, typename T>
|
55
|
+
radix_tree_node<K, T>* radix_tree_it<K, T>::descend(radix_tree_node<K, T>* node) const
|
56
|
+
{
|
57
|
+
if (node->m_is_leaf)
|
58
|
+
return node;
|
59
|
+
|
60
|
+
typename radix_tree_node<K, T>::it_child it = node->m_children.begin();
|
61
|
+
|
62
|
+
assert(it != node->m_children.end());
|
63
|
+
|
64
|
+
return descend(it->second);
|
65
|
+
}
|
66
|
+
|
67
|
+
template <typename K, typename T>
|
68
|
+
std::pair<const K, T>& radix_tree_it<K, T>::operator* () const
|
69
|
+
{
|
70
|
+
return *m_pointee->m_value;
|
71
|
+
}
|
72
|
+
|
73
|
+
template <typename K, typename T>
|
74
|
+
std::pair<const K, T>* radix_tree_it<K, T>::operator-> () const
|
75
|
+
{
|
76
|
+
return m_pointee->m_value;
|
77
|
+
}
|
78
|
+
|
79
|
+
template <typename K, typename T>
|
80
|
+
bool radix_tree_it<K, T>::operator!= (const radix_tree_it<K, T> &lhs) const
|
81
|
+
{
|
82
|
+
return m_pointee != lhs.m_pointee;
|
83
|
+
}
|
84
|
+
|
85
|
+
template <typename K, typename T>
|
86
|
+
bool radix_tree_it<K, T>::operator== (const radix_tree_it<K, T> &lhs) const
|
87
|
+
{
|
88
|
+
return m_pointee == lhs.m_pointee;
|
89
|
+
}
|
90
|
+
|
91
|
+
template <typename K, typename T>
|
92
|
+
const radix_tree_it<K, T>& radix_tree_it<K, T>::operator++ ()
|
93
|
+
{
|
94
|
+
if (m_pointee != NULL) // it is undefined behaviour to dereference iterator that is out of bounds...
|
95
|
+
m_pointee = increment(m_pointee);
|
96
|
+
return *this;
|
97
|
+
}
|
98
|
+
|
99
|
+
template <typename K, typename T>
|
100
|
+
radix_tree_it<K, T> radix_tree_it<K, T>::operator++ (int)
|
101
|
+
{
|
102
|
+
radix_tree_it<K, T> copy(*this);
|
103
|
+
++(*this);
|
104
|
+
return copy;
|
105
|
+
}
|
106
|
+
|
107
|
+
/*
|
108
|
+
template <typename K, typename T>
|
109
|
+
const radix_tree_it<K, T>& radix_tree_it<K, T>::operator-- ()
|
110
|
+
{
|
111
|
+
assert(m_pointee != NULL);
|
112
|
+
|
113
|
+
return *this;
|
114
|
+
}
|
115
|
+
*/
|
116
|
+
|
117
|
+
#endif // RADIX_TREE_IT
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#ifndef RADIX_TREE_NODE_HPP
|
2
|
+
#define RADIX_TREE_NODE_HPP
|
3
|
+
|
4
|
+
#include <map>
|
5
|
+
|
6
|
+
template <typename K, typename T>
|
7
|
+
class radix_tree_node {
|
8
|
+
friend class radix_tree<K, T>;
|
9
|
+
friend class radix_tree_it<K, T>;
|
10
|
+
|
11
|
+
typedef std::pair<const K, T> value_type;
|
12
|
+
typedef typename std::map<K, radix_tree_node<K, T>* >::iterator it_child;
|
13
|
+
|
14
|
+
private:
|
15
|
+
radix_tree_node() : m_children(), m_parent(NULL), m_value(NULL), m_depth(0), m_is_leaf(false), m_key() { }
|
16
|
+
radix_tree_node(const value_type &val);
|
17
|
+
radix_tree_node(const radix_tree_node&); // delete
|
18
|
+
radix_tree_node& operator=(const radix_tree_node&); // delete
|
19
|
+
|
20
|
+
~radix_tree_node();
|
21
|
+
|
22
|
+
std::map<K, radix_tree_node<K, T>*> m_children;
|
23
|
+
radix_tree_node<K, T> *m_parent;
|
24
|
+
value_type *m_value;
|
25
|
+
int m_depth;
|
26
|
+
bool m_is_leaf;
|
27
|
+
K m_key;
|
28
|
+
};
|
29
|
+
|
30
|
+
template <typename K, typename T>
|
31
|
+
radix_tree_node<K, T>::radix_tree_node(const value_type &val) :
|
32
|
+
m_children(),
|
33
|
+
m_parent(NULL),
|
34
|
+
m_value(NULL),
|
35
|
+
m_depth(0),
|
36
|
+
m_is_leaf(false),
|
37
|
+
m_key()
|
38
|
+
{
|
39
|
+
m_value = new value_type(val);
|
40
|
+
}
|
41
|
+
|
42
|
+
template <typename K, typename T>
|
43
|
+
radix_tree_node<K, T>::~radix_tree_node()
|
44
|
+
{
|
45
|
+
it_child it;
|
46
|
+
for (it = m_children.begin(); it != m_children.end(); ++it) {
|
47
|
+
delete it->second;
|
48
|
+
}
|
49
|
+
delete m_value;
|
50
|
+
}
|
51
|
+
|
52
|
+
|
53
|
+
#endif // RADIX_TREE_NODE_HPP
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ffi-radix_tree
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brandon Dewitt
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-10-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: msgpack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ffi
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.15'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.15'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '10.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '10.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '5.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5.0'
|
83
|
+
description: " radix tree implementation in c++ with FFI bindings "
|
84
|
+
email:
|
85
|
+
- brandonsdewitt@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions:
|
88
|
+
- ext/ffi/radixtree/Rakefile
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- ".gitignore"
|
92
|
+
- ".travis.yml"
|
93
|
+
- Gemfile
|
94
|
+
- LICENSE.txt
|
95
|
+
- README.md
|
96
|
+
- Rakefile
|
97
|
+
- bin/console
|
98
|
+
- bin/setup
|
99
|
+
- ext/ffi/radixtree/Rakefile
|
100
|
+
- ffi-radix_tree.gemspec
|
101
|
+
- lib/ffi/radix_tree.rb
|
102
|
+
- lib/ffi/radix_tree/version.rb
|
103
|
+
- vendor/radixtree/CMakeLists.txt
|
104
|
+
- vendor/radixtree/COPYING
|
105
|
+
- vendor/radixtree/ffi_radix_tree.cpp
|
106
|
+
- vendor/radixtree/radix_tree.hpp
|
107
|
+
- vendor/radixtree/radix_tree_it.hpp
|
108
|
+
- vendor/radixtree/radix_tree_node.hpp
|
109
|
+
homepage: https://www.github.com/abrandoned/ffi-radix_tree
|
110
|
+
licenses:
|
111
|
+
- MIT
|
112
|
+
metadata:
|
113
|
+
allowed_push_host: https://rubygems.org
|
114
|
+
post_install_message:
|
115
|
+
rdoc_options: []
|
116
|
+
require_paths:
|
117
|
+
- lib
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
requirements: []
|
129
|
+
rubyforge_project:
|
130
|
+
rubygems_version: 2.6.13
|
131
|
+
signing_key:
|
132
|
+
specification_version: 4
|
133
|
+
summary: radix tree implementation in c++ with FFI bindings
|
134
|
+
test_files: []
|