ztx 0.0.1
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/Gemfile +4 -0
- data/README.md +41 -0
- data/Rakefile +10 -0
- data/doc_src/README.txt +59 -0
- data/ext/Makefile +163 -0
- data/ext/depend +6 -0
- data/ext/extconf.rb +15 -0
- data/ext/ssv.cpp +355 -0
- data/ext/ssv.hpp +93 -0
- data/ext/swig.patch +192 -0
- data/ext/tx.cpp +442 -0
- data/ext/tx.hpp +62 -0
- data/ext/tx_swig.cpp +161 -0
- data/ext/tx_swig.h +90 -0
- data/ext/tx_swig.i +14 -0
- data/ext/tx_swig_wrap.cxx +9883 -0
- data/lib/i386-msvcrt/tx_core.so +0 -0
- data/lib/ztx.rb +210 -0
- data/lib/ztx/version.rb +3 -0
- data/test/test_helper.rb +4 -0
- data/test/ztx_test.rb +11 -0
- metadata +118 -0
|
Binary file
|
data/lib/ztx.rb
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
require "ztx/version"
|
|
2
|
+
require "tx_core"
|
|
3
|
+
require "forwardable"
|
|
4
|
+
|
|
5
|
+
module Tx
|
|
6
|
+
module Util
|
|
7
|
+
module_function
|
|
8
|
+
|
|
9
|
+
# Defines wrapper methods which perform boundary checking of pos and len.
|
|
10
|
+
def def_wrapper_methods(*methods)
|
|
11
|
+
methods.each() do |name|
|
|
12
|
+
define_method(name) do |*args|
|
|
13
|
+
(str, pos, len, *opt) = args
|
|
14
|
+
raise(ArgumentError, "argument pos is negative") if pos && pos < 0
|
|
15
|
+
str_len = bytesize(str)
|
|
16
|
+
pos ||= 0
|
|
17
|
+
pos = str_len if pos > str_len
|
|
18
|
+
len = str_len - pos if !len || len < 0 || len > str_len - pos
|
|
19
|
+
add_encoding(@unsafe.__send__(name, str, pos, len, *opt))
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
if RUBY_VERSION >= "1.9.0"
|
|
25
|
+
|
|
26
|
+
def default_encoding
|
|
27
|
+
return Encoding.default_internal || Encoding::UTF_8
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def add_encoding(obj)
|
|
31
|
+
case obj
|
|
32
|
+
when Array
|
|
33
|
+
obj.each(){ |e| add_encoding(e) }
|
|
34
|
+
when String
|
|
35
|
+
obj.force_encoding(@encoding)
|
|
36
|
+
end
|
|
37
|
+
return obj
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def to_binary(str)
|
|
41
|
+
return str.dup().force_encoding(Encoding::ASCII_8BIT)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def bytesize(str)
|
|
45
|
+
return str.bytesize
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
else
|
|
49
|
+
|
|
50
|
+
def default_encoding
|
|
51
|
+
return nil
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def add_encoding(obj)
|
|
55
|
+
return obj
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def to_binary(str)
|
|
59
|
+
return str
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def bytesize(str)
|
|
63
|
+
return str.length
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Wrapper of UnsafeIndex. Boundary checking of pos/len and some methods are added.
|
|
69
|
+
class Index
|
|
70
|
+
extend(Forwardable)
|
|
71
|
+
extend(Util)
|
|
72
|
+
include(Util)
|
|
73
|
+
include(Enumerable)
|
|
74
|
+
|
|
75
|
+
class << self
|
|
76
|
+
alias open new
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def initialize(arg, encoding = nil)
|
|
80
|
+
if arg.is_a?(UnsafeIndex)
|
|
81
|
+
@unsafe = arg
|
|
82
|
+
else
|
|
83
|
+
@unsafe = UnsafeIndex.new()
|
|
84
|
+
if !@unsafe.open(arg)
|
|
85
|
+
raise(IOError, "failed to open #{arg}")
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
@encoding = encoding || default_encoding()
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
attr_reader(:encoding)
|
|
92
|
+
def_delegators(:@unsafe, :num_keys, :result_log, :error_log)
|
|
93
|
+
def_wrapper_methods(:longest_prefix, :include, :search_prefixes, :search_expansions)
|
|
94
|
+
alias common_prefix_search search_prefixes
|
|
95
|
+
alias predictive_search search_expansions
|
|
96
|
+
alias include? include
|
|
97
|
+
alias size num_keys
|
|
98
|
+
|
|
99
|
+
def inspect()
|
|
100
|
+
return "\#<%p:0x%x>" % [self.class, self.object_id]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def to_a()
|
|
104
|
+
return search_expansions("")
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def each(&block)
|
|
108
|
+
to_a().each(&block)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def scan(str, &block)
|
|
112
|
+
bstr = to_binary(str)
|
|
113
|
+
result = []
|
|
114
|
+
pos = 0
|
|
115
|
+
while pos < bytesize(str)
|
|
116
|
+
plen = longest_prefix(str, pos)
|
|
117
|
+
if plen >= 0
|
|
118
|
+
args = [add_encoding(bstr[pos, plen]), pos]
|
|
119
|
+
block ? yield(*args) : result.push(args)
|
|
120
|
+
end
|
|
121
|
+
pos += plen > 0 ? plen : 1
|
|
122
|
+
end
|
|
123
|
+
return block ? str : result
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def gsub(str, &block)
|
|
127
|
+
bstr = to_binary(str)
|
|
128
|
+
result = add_encoding("")
|
|
129
|
+
prev_pos = 0
|
|
130
|
+
scan(str) do |match, pos|
|
|
131
|
+
result << add_encoding(bstr[prev_pos...pos])
|
|
132
|
+
result << yield(match, pos)
|
|
133
|
+
prev_pos = pos + bytesize(match)
|
|
134
|
+
end
|
|
135
|
+
result << add_encoding(bstr[prev_pos..-1])
|
|
136
|
+
return result
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Wrapper of UnsafeMap. Boundary checking of pos/len and some methods are added.
|
|
141
|
+
class Map
|
|
142
|
+
extend(Forwardable)
|
|
143
|
+
extend(Util)
|
|
144
|
+
include(Util)
|
|
145
|
+
include(Enumerable)
|
|
146
|
+
|
|
147
|
+
class << self
|
|
148
|
+
alias open new
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def initialize(file_pefix, encoding = nil)
|
|
152
|
+
@unsafe = UnsafeMap.new()
|
|
153
|
+
if !@unsafe.open(file_pefix)
|
|
154
|
+
raise(IOError, "failed to open #{file_pefix}.key, #{file_pefix}.val or #{file_pefix}.map")
|
|
155
|
+
end
|
|
156
|
+
@encoding = encoding || default_encoding()
|
|
157
|
+
@key_index = Index.new(@unsafe.key_index, @encoding)
|
|
158
|
+
@value_index = Index.new(@unsafe.value_index, @encoding)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
attr_reader(:key_index, :value_index, :encoding)
|
|
162
|
+
def_wrapper_methods(:has_key, :lookup)
|
|
163
|
+
alias has_key? has_key
|
|
164
|
+
|
|
165
|
+
def inspect()
|
|
166
|
+
return "\#<%p:0x%x>" % [self.class, self.object_id]
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def [](str, pos = 0, len = -1)
|
|
170
|
+
return has_key(str, pos, len) ? lookup(str, pos, len) : nil
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def size
|
|
174
|
+
return self.keys.sizse
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def keys
|
|
178
|
+
return @key_index.search_expansions("")
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def values
|
|
182
|
+
return self.keys.map(){ |k| lookup(k) }
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def each_key(&block)
|
|
186
|
+
return self.keys.each(&block)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def each_value(&block)
|
|
190
|
+
return self.values.each(&block)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def each(&block)
|
|
194
|
+
each_key(){ |k| yield([k, lookup(k)]) }
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def each_pair(&block)
|
|
198
|
+
each_key(){ |k| yield(k, lookup(k)) }
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def scan(str, &block)
|
|
202
|
+
result = []
|
|
203
|
+
@key_index.scan(str) do |key, pos|
|
|
204
|
+
args = [key, pos, lookup(key)]
|
|
205
|
+
block ? yield(*args) : result.push(args)
|
|
206
|
+
end
|
|
207
|
+
return block ? str : result
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
data/lib/ztx/version.rb
ADDED
data/test/test_helper.rb
ADDED
data/test/ztx_test.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: ztx
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Vy Dao Nguyen
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2016-10-14 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bundler
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.12'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.12'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '10.0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '10.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: minitest
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '5.0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '5.0'
|
|
55
|
+
description: Fork of old Tx gem, a library for a compact trie data structure, compatible
|
|
56
|
+
with Ruby 2.2/2.3.
|
|
57
|
+
email:
|
|
58
|
+
- vydn@zigexn.vn
|
|
59
|
+
executables: []
|
|
60
|
+
extensions:
|
|
61
|
+
- ext/extconf.rb
|
|
62
|
+
extra_rdoc_files:
|
|
63
|
+
- doc_src/README.txt
|
|
64
|
+
files:
|
|
65
|
+
- Gemfile
|
|
66
|
+
- README.md
|
|
67
|
+
- Rakefile
|
|
68
|
+
- doc_src/README.txt
|
|
69
|
+
- ext/Makefile
|
|
70
|
+
- ext/depend
|
|
71
|
+
- ext/extconf.rb
|
|
72
|
+
- ext/ssv.cpp
|
|
73
|
+
- ext/ssv.hpp
|
|
74
|
+
- ext/swig.patch
|
|
75
|
+
- ext/tx.cpp
|
|
76
|
+
- ext/tx.hpp
|
|
77
|
+
- ext/tx_swig.cpp
|
|
78
|
+
- ext/tx_swig.h
|
|
79
|
+
- ext/tx_swig.i
|
|
80
|
+
- ext/tx_swig_wrap.cxx
|
|
81
|
+
- lib/i386-msvcrt/tx_core.so
|
|
82
|
+
- lib/ztx.rb
|
|
83
|
+
- lib/ztx/version.rb
|
|
84
|
+
- test/test_helper.rb
|
|
85
|
+
- test/ztx_test.rb
|
|
86
|
+
homepage: https://github.com/vydao/ztx
|
|
87
|
+
licenses:
|
|
88
|
+
- MIT
|
|
89
|
+
metadata: {}
|
|
90
|
+
post_install_message:
|
|
91
|
+
rdoc_options:
|
|
92
|
+
- "--quiet"
|
|
93
|
+
- "--title"
|
|
94
|
+
- tx-ruby Reference
|
|
95
|
+
- "--main"
|
|
96
|
+
- doc_src/README.txt
|
|
97
|
+
require_paths:
|
|
98
|
+
- lib
|
|
99
|
+
- lib/i386-msvcrt
|
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
|
+
requirements:
|
|
102
|
+
- - ">="
|
|
103
|
+
- !ruby/object:Gem::Version
|
|
104
|
+
version: '0'
|
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - ">="
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '0'
|
|
110
|
+
requirements: []
|
|
111
|
+
rubyforge_project:
|
|
112
|
+
rubygems_version: 2.6.7
|
|
113
|
+
signing_key:
|
|
114
|
+
specification_version: 4
|
|
115
|
+
summary: Fork of old Tx gem, a library for a compact trie data structure, compatible
|
|
116
|
+
with Ruby 2.2/2.3.
|
|
117
|
+
test_files: []
|
|
118
|
+
has_rdoc: true
|