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.
@@ -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: []