ffi-radix_tree 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []