Class: FFI::RadixTree::Tree
- Inherits:
-
Object
- Object
- FFI::RadixTree::Tree
- Defined in:
- lib/ffi/radix_tree.rb
Instance Method Summary collapse
- #erase(key) ⇒ Object
- #get(key) ⇒ Object
- #greedy_match(string) ⇒ Object
- #greedy_substring_match(string) ⇒ Object
- #has_key?(key) ⇒ Boolean (also: #key?)
-
#initialize ⇒ Tree
constructor
A new instance of Tree.
- #longest_prefix(string) ⇒ Object
- #longest_prefix_and_value(string) ⇒ Object
- #longest_prefix_value(string) ⇒ Object
- #push(key, value) ⇒ Object
- #push_or_update(key, value) ⇒ Object
Constructor Details
#initialize ⇒ Tree
Returns a new instance of Tree.
92 93 94 95 |
# File 'lib/ffi/radix_tree.rb', line 92 def initialize @ptr = ::FFI::AutoPointer.new(::FFI::RadixTree.create, ::FFI::RadixTree.method(:destroy)) @first_character_present = {} end |
Instance Method Details
#erase(key) ⇒ Object
132 133 134 |
# File 'lib/ffi/radix_tree.rb', line 132 def erase(key) ::FFI::RadixTree.erase(@ptr, key) end |
#get(key) ⇒ Object
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/ffi/radix_tree.rb', line 136 def get(key) return nil unless @first_character_present[key[0]] byte_pointer = get_response = nil ::FFI::MemoryPointer.new(:int) do |byte_length| byte_pointer = ::FFI::RadixTree.fetch(@ptr, key, byte_length) bytesize = byte_length.read_int if bytesize && bytesize > 0 bytes = byte_pointer.get_bytes(0, bytesize) get_response = ::MessagePack.unpack(bytes) end end get_response ensure ::FFI::RadixTree.match_free(byte_pointer) if byte_pointer end |
#greedy_match(string) ⇒ Object
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
# File 'lib/ffi/radix_tree.rb', line 202 def greedy_match(string) return [] unless @first_character_present[string[0]] array_pointer = nil match_sizes_pointer = nil array_size = 0 get_response = [] ::FFI::MemoryPointer.new(:pointer) do |match_array| ::FFI::MemoryPointer.new(:pointer) do |match_sizes_array| array_size = ::FFI::RadixTree.greedy_match(@ptr, string, match_array, match_sizes_array) if array_size > 0 match_sizes_pointer = match_sizes_array.read_pointer match_sizes = match_sizes_pointer.get_array_of_int(0, array_size) array_pointer = match_array.read_pointer char_arrays = array_pointer.get_array_of_pointer(0, array_size) char_arrays.each_with_index do |ptr, index| get_response << ::MessagePack.unpack(ptr.get_bytes(0, match_sizes[index])) end end end end get_response ensure ::FFI::RadixTree.multi_match_free(array_pointer, array_size) if array_pointer ::FFI::RadixTree.match_sizes_free(match_sizes_pointer) if match_sizes_pointer end |
#greedy_substring_match(string) ⇒ Object
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
# File 'lib/ffi/radix_tree.rb', line 230 def greedy_substring_match(string) array_pointer = nil match_sizes_pointer = nil array_size = 0 get_response = [] ::FFI::MemoryPointer.new(:pointer) do |match_array| ::FFI::MemoryPointer.new(:pointer) do |match_sizes_array| array_size = ::FFI::RadixTree.greedy_substring_match(@ptr, string, match_array, match_sizes_array) if array_size > 0 match_sizes_pointer = match_sizes_array.read_pointer match_sizes = match_sizes_pointer.get_array_of_int(0, array_size) array_pointer = match_array.read_pointer char_arrays = array_pointer.get_array_of_pointer(0, array_size) char_arrays.each_with_index do |ptr, index| get_response << ::MessagePack.unpack(ptr.get_bytes(0, match_sizes[index])) end end end end get_response ensure ::FFI::RadixTree.multi_match_free(array_pointer, array_size) if array_pointer ::FFI::RadixTree.match_sizes_free(match_sizes_pointer) if match_sizes_pointer end |
#has_key?(key) ⇒ Boolean Also known as: key?
97 98 99 |
# File 'lib/ffi/radix_tree.rb', line 97 def has_key?(key) ::FFI::RadixTree.has_key(@ptr, key) end |
#longest_prefix(string) ⇒ Object
155 156 157 158 159 160 161 162 |
# File 'lib/ffi/radix_tree.rb', line 155 def longest_prefix(string) return nil unless @first_character_present[string[0]] value, p_out = ::FFI::RadixTree.longest_prefix(@ptr, string) value.force_encoding("UTF-8") if value value ensure ::FFI::RadixTree.match_free(p_out) if p_out end |
#longest_prefix_and_value(string) ⇒ Object
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/ffi/radix_tree.rb', line 164 def longest_prefix_and_value(string) return [nil, nil] unless @first_character_present[string[0]] byte_pointer = prefix_response = get_response = nil ::FFI::MemoryPointer.new(:int) do |byte_length| ::FFI::MemoryPointer.new(:int) do |prefix_length| byte_pointer = ::FFI::RadixTree.longest_prefix_and_value(@ptr, string, byte_length, prefix_length) bytesize = byte_length.read_int if bytesize && bytesize > 0 prefix_size = prefix_length.read_int get_response = byte_pointer.get_bytes(0, bytesize) prefix_response = get_response[0..(prefix_size - 1)] get_response = ::MessagePack.unpack(get_response[prefix_size..-1]) end end end [prefix_response, get_response] ensure ::FFI::RadixTree.match_free(byte_pointer) if byte_pointer end |
#longest_prefix_value(string) ⇒ Object
187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'lib/ffi/radix_tree.rb', line 187 def longest_prefix_value(string) return nil unless @first_character_present[string[0]] byte_pointer = get_response = nil ::FFI::MemoryPointer.new(:int) do |byte_length| byte_pointer = ::FFI::RadixTree.longest_prefix_value(@ptr, string, byte_length) bytesize = byte_length.read_int get_response = ::MessagePack.unpack(byte_pointer.get_bytes(0, bytesize)) if bytesize && bytesize > 0 end get_response ensure ::FFI::RadixTree.match_free(byte_pointer) if byte_pointer end |
#push(key, value) ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/ffi/radix_tree.rb', line 103 def push(key, value) push_response = nil @first_character_present[key[0]] = true storage_data = ::MessagePack.pack(value) bytesize = storage_data.bytesize ::FFI::MemoryPointer.new(:char, bytesize, true) do |memory_buffer| memory_buffer.put_bytes(0, storage_data) push_response = ::FFI::RadixTree.insert(@ptr, key, memory_buffer, bytesize) end push_response end |
#push_or_update(key, value) ⇒ Object
117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/ffi/radix_tree.rb', line 117 def push_or_update(key, value) response = nil @first_character_present[key[0]] = true storage_data = ::MessagePack.pack(value) bytesize = storage_data.bytesize ::FFI::MemoryPointer.new(:char, bytesize, true) do |memory_buffer| memory_buffer.put_bytes(0, storage_data) response = ::FFI::RadixTree.update(@ptr, key, memory_buffer, bytesize) response ||= ::FFI::RadixTree.insert(@ptr, key, memory_buffer, bytesize) end response end |