xot 0.1.12 → 0.1.19
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 +5 -5
- data/LICENSE +21 -0
- data/README.md +1 -1
- data/Rakefile +8 -13
- data/VERSION +1 -1
- data/ext/xot/extconf.rb +2 -3
- data/ext/xot/tester.cpp +55 -7
- data/include/xot.h +5 -3
- data/include/xot/debug.h +6 -1
- data/include/xot/defs.h +2 -3
- data/include/xot/exception.h +18 -6
- data/include/xot/noncopyable.h +30 -0
- data/include/xot/pimpl.h +10 -18
- data/include/xot/ref.h +25 -58
- data/include/xot/string.h +9 -0
- data/include/xot/time.h +3 -1
- data/include/xot/util.h +68 -13
- data/lib/xot.rb +5 -1
- data/lib/xot/bit_flag.rb +28 -15
- data/lib/xot/bit_flag_accessor.rb +78 -0
- data/lib/xot/bit_util.rb +19 -0
- data/lib/xot/const_symbol_accessor.rb +59 -0
- data/lib/xot/extconf.rb +8 -7
- data/lib/xot/module.rb +4 -19
- data/lib/xot/rake.rb +302 -127
- data/lib/xot/rake/alias_task.rb +34 -0
- data/lib/xot/rake/escalation.rb +32 -0
- data/lib/xot/rake/util.rb +310 -0
- data/lib/xot/setter.rb +2 -1
- data/lib/xot/universal_accessor.rb +40 -0
- data/src/debug.cpp +3 -3
- data/src/string.cpp +33 -2
- data/src/time.cpp +16 -8
- data/test/test_bit_flag.rb +1 -10
- data/test/test_bit_flag_accessor.rb +64 -0
- data/test/test_bit_util.rb +18 -0
- data/test/test_const_symbol_accessor.rb +56 -0
- data/test/test_universal_accessor.rb +51 -0
- data/xot.gemspec +3 -6
- metadata +28 -45
- data/task/ext.rake +0 -76
- data/task/gem.rake +0 -51
- data/task/lib.rake +0 -92
- data/task/mac.rake +0 -45
- data/task/test.rake +0 -35
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require 'rake/task'
|
5
|
+
|
6
|
+
|
7
|
+
module Xot
|
8
|
+
|
9
|
+
|
10
|
+
module Rake
|
11
|
+
|
12
|
+
|
13
|
+
class AliasTask < ::Rake::Task
|
14
|
+
|
15
|
+
def timestamp ()
|
16
|
+
prerequisite_tasks.map {|pre| pre.timestamp}.max || ::Rake::EARLY
|
17
|
+
end
|
18
|
+
|
19
|
+
end# AliasTask
|
20
|
+
|
21
|
+
|
22
|
+
end# Rake
|
23
|
+
|
24
|
+
|
25
|
+
end# Xot
|
26
|
+
|
27
|
+
|
28
|
+
module Rake
|
29
|
+
module DSL
|
30
|
+
def alias_task (*args, &block)
|
31
|
+
Xot::Rake::AliasTask.define_task *args, &block
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require 'rake'
|
5
|
+
|
6
|
+
|
7
|
+
module Rake
|
8
|
+
class Application
|
9
|
+
|
10
|
+
alias invoke_task_org invoke_task
|
11
|
+
|
12
|
+
def invoke_task (*args, &block)
|
13
|
+
invoke_task_org *args, &block
|
14
|
+
rescue RuntimeError => e
|
15
|
+
if e.message =~ /don't\s+know\s+.*\s+task\s+/i
|
16
|
+
escalate_tasks
|
17
|
+
else
|
18
|
+
raise
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def escalate_tasks ()
|
23
|
+
Dir.chdir '..' do
|
24
|
+
cmd = "rake #{ARGV.join ' '}"
|
25
|
+
$stderr.puts "(in #{Dir.pwd}) #{cmd}"
|
26
|
+
system cmd
|
27
|
+
end
|
28
|
+
exit 0
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,310 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require 'erb'
|
5
|
+
require 'rbconfig'
|
6
|
+
|
7
|
+
|
8
|
+
module Xot
|
9
|
+
|
10
|
+
|
11
|
+
module Rake
|
12
|
+
|
13
|
+
VERSION_NAME = 'VERSION'
|
14
|
+
|
15
|
+
def modules ()
|
16
|
+
env(:MODULES, []).map {|m| m::Module}
|
17
|
+
end
|
18
|
+
|
19
|
+
def target ()
|
20
|
+
modules.last
|
21
|
+
end
|
22
|
+
|
23
|
+
def target_name ()
|
24
|
+
env :MODNAME, target.name.downcase
|
25
|
+
end
|
26
|
+
|
27
|
+
def inc_dir ()
|
28
|
+
env :INCDIR, 'include'
|
29
|
+
end
|
30
|
+
|
31
|
+
def src_dir ()
|
32
|
+
env :SRCDIR, 'src'
|
33
|
+
end
|
34
|
+
|
35
|
+
def lib_dir ()
|
36
|
+
env :LIBDIR, 'lib'
|
37
|
+
end
|
38
|
+
|
39
|
+
def doc_dir ()
|
40
|
+
env :DOCDIR, 'doc'
|
41
|
+
end
|
42
|
+
|
43
|
+
def ext_dir ()
|
44
|
+
env :EXTDIR, "ext/#{target_name}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def ext_lib_dir ()
|
48
|
+
env :EXTLIBDIR, "lib/#{target_name}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_dir ()
|
52
|
+
env :TESTDIR, 'test'
|
53
|
+
end
|
54
|
+
|
55
|
+
def vendor_dir ()
|
56
|
+
env :VENDORDIR, 'vendor'
|
57
|
+
end
|
58
|
+
|
59
|
+
def inc_dirs ()
|
60
|
+
env_array(:INCDIRS, []) + modules.reverse.map {|m| m.inc_dir}.flatten
|
61
|
+
end
|
62
|
+
|
63
|
+
def src_dirs ()
|
64
|
+
env_array :SRCDIRS, []
|
65
|
+
end
|
66
|
+
|
67
|
+
def src_exts ()
|
68
|
+
env_array(:SRCEXTS, []) + %w[c cc cpp m mm]
|
69
|
+
end
|
70
|
+
|
71
|
+
def excludes ()
|
72
|
+
env_array :EXCLUDES, []
|
73
|
+
end
|
74
|
+
|
75
|
+
def excluded? (path)
|
76
|
+
excludes.any? {|s| path =~ %r{#{s}}}
|
77
|
+
end
|
78
|
+
|
79
|
+
def glob (*patterns)
|
80
|
+
paths = []
|
81
|
+
patterns.each do |pattern|
|
82
|
+
paths.concat Dir.glob(pattern)
|
83
|
+
end
|
84
|
+
paths
|
85
|
+
end
|
86
|
+
|
87
|
+
def filter_file (path, &block)
|
88
|
+
File.write path, block.call(File.read path)
|
89
|
+
end
|
90
|
+
|
91
|
+
def cd_sh (dir, cmd)
|
92
|
+
Dir.chdir dir do
|
93
|
+
$stderr.puts "(in #{Dir.pwd})"
|
94
|
+
sh cmd
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def modified_files (dir: '.', hash: '@')
|
99
|
+
`git diff --name-only #{hash} -- #{dir}`.lines.map &:chomp
|
100
|
+
end
|
101
|
+
|
102
|
+
def version_path (dir = nil)
|
103
|
+
dir ? "#{dir}/#{VERSION_NAME}" : VERSION_NAME
|
104
|
+
end
|
105
|
+
|
106
|
+
def get_version (dir = nil)
|
107
|
+
File.readlines(version_path dir).first.chomp
|
108
|
+
end
|
109
|
+
|
110
|
+
def bump_version (index, version = get_version)
|
111
|
+
nums = version.split('.').map &:to_i
|
112
|
+
nums << 0 until nums.size > index
|
113
|
+
nums[index] += 1
|
114
|
+
nums.map!.with_index {|num, i| i > index ? 0 : num}
|
115
|
+
nums.pop while nums.last == 0 && nums.size >= 3
|
116
|
+
nums.join '.'
|
117
|
+
end
|
118
|
+
|
119
|
+
def bump_version_file (index, dir: nil)
|
120
|
+
newver = bump_version index, get_version(dir)
|
121
|
+
File.write version_path(dir), newver
|
122
|
+
newver
|
123
|
+
end
|
124
|
+
|
125
|
+
def update_and_tag_version (index, dir: nil, &block)
|
126
|
+
raise 'modified files exist' unless modified_files.empty?
|
127
|
+
|
128
|
+
message = ENV['message']
|
129
|
+
raise 'no message' unless message
|
130
|
+
|
131
|
+
newver = bump_version_file index, dir: dir
|
132
|
+
raise 'version is not updated' unless modified_files == [version_path(dir)]
|
133
|
+
|
134
|
+
block.call if block
|
135
|
+
|
136
|
+
sh %( git add -u )
|
137
|
+
sh %( git commit -m "#{message}" )
|
138
|
+
sh %( git tag -a -m "#{message}" v#{newver} )
|
139
|
+
end
|
140
|
+
|
141
|
+
def compile_erb (path, out)
|
142
|
+
open(path) do |input|
|
143
|
+
open(out, 'w') do |output|
|
144
|
+
output.write compile_erb_str(input.read)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
#rescue
|
148
|
+
end
|
149
|
+
|
150
|
+
def compile_erb_str (str)
|
151
|
+
ERB.new(str, nil, '%').result binding
|
152
|
+
end
|
153
|
+
|
154
|
+
def params (max, sep = '', &block)
|
155
|
+
raise 'block not given.' unless block
|
156
|
+
return '' if max == 0
|
157
|
+
(1..max).map(&block).join(sep)
|
158
|
+
end
|
159
|
+
|
160
|
+
def make_path_map (paths, ext_map)
|
161
|
+
paths = paths.map do |path|
|
162
|
+
newpath = ext_map.inject path do |value, (from, to)|
|
163
|
+
value.sub /#{from.gsub('.', '\.')}$/, to
|
164
|
+
end
|
165
|
+
raise "map to same path" if path == newpath
|
166
|
+
[path, newpath]
|
167
|
+
end
|
168
|
+
Hash[*paths.flatten]
|
169
|
+
end
|
170
|
+
|
171
|
+
def get_env (name, defval = nil)
|
172
|
+
val = ENV[name.to_s] || Object.const_get(name) rescue defval
|
173
|
+
val.dup rescue val
|
174
|
+
end
|
175
|
+
|
176
|
+
def env (name, defval = nil)
|
177
|
+
case val = get_env(name, defval)
|
178
|
+
when /^\d+$/ then val.to_i
|
179
|
+
when 'true', true then true
|
180
|
+
when 'false', false then false
|
181
|
+
when nil then nil
|
182
|
+
else val
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def env_array (name, defval = nil)
|
187
|
+
val = get_env name, defval
|
188
|
+
val = val.strip.split(/\s+/) if val.kind_of? String
|
189
|
+
val
|
190
|
+
end
|
191
|
+
|
192
|
+
def append_env (name, *args)
|
193
|
+
ENV[name] = (ENV[name] || '') + " #{args.join ' '}"
|
194
|
+
end
|
195
|
+
|
196
|
+
def make_cppflags (flags = '', defs = [], incdirs = [])
|
197
|
+
s = flags.dup
|
198
|
+
s += make_cppflags_defs(defs) .map {|s| " -D#{s}"}.join
|
199
|
+
s += make_cppflags_incdirs(incdirs).map {|s| " -I#{s}"}.join
|
200
|
+
s
|
201
|
+
end
|
202
|
+
|
203
|
+
def make_cppflags_defs (defs = [])
|
204
|
+
a = defs.dup
|
205
|
+
a << $~[0].upcase if RUBY_PLATFORM =~ /mswin|ming|cygwin|darwin/i
|
206
|
+
a << (debug? ? '_DEBUG' : 'NDEBUG')
|
207
|
+
a << 'WIN32' if win32?
|
208
|
+
a << 'OSX' if osx?
|
209
|
+
a << 'IOS' if ios?
|
210
|
+
a
|
211
|
+
end
|
212
|
+
|
213
|
+
def make_cppflags_incdirs (dirs = [])
|
214
|
+
dirs.dup + ruby_inc_dirs
|
215
|
+
end
|
216
|
+
|
217
|
+
def ruby_inc_dirs ()
|
218
|
+
root = RbConfig::CONFIG['rubyhdrdir']
|
219
|
+
[root, RbConfig::CONFIG['rubyarchhdrdir'] || "#{root}/#{RUBY_PLATFORM}"]
|
220
|
+
end
|
221
|
+
|
222
|
+
def make_cflags (flags = '')
|
223
|
+
warning_opts = %w[
|
224
|
+
no-unknown-pragmas
|
225
|
+
no-deprecated-register
|
226
|
+
no-reserved-user-defined-literal
|
227
|
+
]
|
228
|
+
s = flags.dup
|
229
|
+
s << warning_opts.map {|s| " -W#{s}"}.join
|
230
|
+
s << ' -std=c++11' if gcc?
|
231
|
+
s << ' -std=c++11 -stdlib=libc++ -mmacosx-version-min=10.7' if clang?
|
232
|
+
s << ' ' + RbConfig::CONFIG['debugflags'] if debug?
|
233
|
+
s.gsub! /-O\d?\w*/, '-O0' if debug?
|
234
|
+
s
|
235
|
+
end
|
236
|
+
|
237
|
+
def make_ldflags (flags = '', libdirs = [], frameworks = [])
|
238
|
+
s = flags.dup
|
239
|
+
s << libdirs.map {|s| " -L#{s}"}.join
|
240
|
+
s << frameworks.map {|s| " -framework #{s}"}.join
|
241
|
+
s
|
242
|
+
end
|
243
|
+
|
244
|
+
def debug (state)
|
245
|
+
ENV['DEBUG'] = state.to_s
|
246
|
+
end
|
247
|
+
|
248
|
+
def debug? ()
|
249
|
+
env :DEBUG, false
|
250
|
+
end
|
251
|
+
|
252
|
+
def win32? ()
|
253
|
+
RUBY_PLATFORM =~ /mswin|ming|cygwin/
|
254
|
+
end
|
255
|
+
|
256
|
+
def mswin? ()
|
257
|
+
RUBY_PLATFORM =~ /mswin/
|
258
|
+
end
|
259
|
+
|
260
|
+
def ming? ()
|
261
|
+
RUBY_PLATFORM =~ /ming/
|
262
|
+
end
|
263
|
+
|
264
|
+
def cygwin? ()
|
265
|
+
RUBY_PLATFORM =~ /cygwin/
|
266
|
+
end
|
267
|
+
|
268
|
+
def osx? ()
|
269
|
+
RUBY_PLATFORM =~ /darwin/
|
270
|
+
end
|
271
|
+
|
272
|
+
def ios? ()
|
273
|
+
false
|
274
|
+
end
|
275
|
+
|
276
|
+
def gcc? ()
|
277
|
+
RbConfig::CONFIG['CXX'] =~ /(^|\s)g\+\+/i
|
278
|
+
end
|
279
|
+
|
280
|
+
def clang? ()
|
281
|
+
RbConfig::CONFIG['CXX'] =~ /(^|\s)clang/i
|
282
|
+
end
|
283
|
+
|
284
|
+
def cxx ()
|
285
|
+
env :CXX, RbConfig::CONFIG['CXX'] || 'g++'
|
286
|
+
end
|
287
|
+
|
288
|
+
def ar ()
|
289
|
+
env :AR, RbConfig::CONFIG['AR'] || 'ar'
|
290
|
+
end
|
291
|
+
|
292
|
+
def cppflags ()
|
293
|
+
flags = env :CPPFLAGS, RbConfig::CONFIG['CPPFLAGS']
|
294
|
+
make_cppflags flags, defs, inc_dirs
|
295
|
+
end
|
296
|
+
|
297
|
+
def cxxflags ()
|
298
|
+
flags = env :CXXFLAGS, RbConfig::CONFIG['CXXFLAGS']
|
299
|
+
make_cflags flags
|
300
|
+
end
|
301
|
+
|
302
|
+
def arflags ()
|
303
|
+
env :ARFLAGS, RbConfig::CONFIG['ARFLAGS'] || 'crs'
|
304
|
+
end
|
305
|
+
|
306
|
+
|
307
|
+
end# Rake
|
308
|
+
|
309
|
+
|
310
|
+
end# Xot
|
data/lib/xot/setter.rb
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
module Xot
|
5
|
+
|
6
|
+
|
7
|
+
module UniversalAccessor
|
8
|
+
|
9
|
+
def universal_accessor (*names, **names_with_options)
|
10
|
+
names.each {|name| define_universal_accessor name}
|
11
|
+
names_with_options.each {|name, opts| define_universal_accessor name, opts}
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def define_universal_accessor (name, options = {})
|
17
|
+
set = "ua_set_#{name}__"
|
18
|
+
get = "ua_get_#{name}__"
|
19
|
+
class_eval <<-END
|
20
|
+
alias_method :#{set}, options[:writer] || :#{name}=
|
21
|
+
alias_method :#{get}, options[:reader] || :#{name}
|
22
|
+
private :#{set}, :#{get}
|
23
|
+
def #{name} (*args)
|
24
|
+
#{set} *args unless args.empty?
|
25
|
+
#{get}
|
26
|
+
end
|
27
|
+
END
|
28
|
+
end
|
29
|
+
|
30
|
+
end# UniversalAccessor
|
31
|
+
|
32
|
+
|
33
|
+
end# Xot
|
34
|
+
|
35
|
+
|
36
|
+
class Module
|
37
|
+
|
38
|
+
include Xot::UniversalAccessor
|
39
|
+
|
40
|
+
end# Module
|
data/src/debug.cpp
CHANGED
@@ -14,14 +14,14 @@ namespace Xot
|
|
14
14
|
{
|
15
15
|
|
16
16
|
|
17
|
-
#ifdef
|
17
|
+
#ifdef XOT_USE_DOUT
|
18
18
|
|
19
19
|
void
|
20
20
|
dout (const char* format, ...)
|
21
21
|
{
|
22
22
|
va_list args;
|
23
23
|
va_start(args, format);
|
24
|
-
|
24
|
+
fprintf(stderr, "%s", stringf(format, args).c_str());
|
25
25
|
va_end(args);
|
26
26
|
}
|
27
27
|
|
@@ -30,7 +30,7 @@ namespace Xot
|
|
30
30
|
{
|
31
31
|
va_list args;
|
32
32
|
va_start(args, format);
|
33
|
-
|
33
|
+
fprintf(stderr, "%s\n", stringf(format, args).c_str());
|
34
34
|
va_end(args);
|
35
35
|
}
|
36
36
|
|