xot 0.1.12 → 0.1.13
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/README.md +1 -1
- data/Rakefile +7 -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 -0
- 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 +250 -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 +24 -42
- 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,250 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require 'erb'
|
5
|
+
require 'rbconfig'
|
6
|
+
|
7
|
+
|
8
|
+
module Xot
|
9
|
+
|
10
|
+
|
11
|
+
module Rake
|
12
|
+
|
13
|
+
|
14
|
+
def modules ()
|
15
|
+
env(:MODULES, []).map {|m| m::Module}
|
16
|
+
end
|
17
|
+
|
18
|
+
def target ()
|
19
|
+
modules.last
|
20
|
+
end
|
21
|
+
|
22
|
+
def target_name ()
|
23
|
+
env :MODNAME, target.name.downcase
|
24
|
+
end
|
25
|
+
|
26
|
+
def inc_dir ()
|
27
|
+
env :INCDIR, 'include'
|
28
|
+
end
|
29
|
+
|
30
|
+
def src_dir ()
|
31
|
+
env :SRCDIR, 'src'
|
32
|
+
end
|
33
|
+
|
34
|
+
def lib_dir ()
|
35
|
+
env :LIBDIR, 'lib'
|
36
|
+
end
|
37
|
+
|
38
|
+
def doc_dir ()
|
39
|
+
env :DOCDIR, 'doc'
|
40
|
+
end
|
41
|
+
|
42
|
+
def ext_dir ()
|
43
|
+
env :EXTDIR, "ext/#{target_name}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def ext_lib_dir ()
|
47
|
+
env :EXTLIBDIR, "lib/#{target_name}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_dir ()
|
51
|
+
env :TESTDIR, 'test'
|
52
|
+
end
|
53
|
+
|
54
|
+
def vendor_dir ()
|
55
|
+
env :VENDORDIR, 'vendor'
|
56
|
+
end
|
57
|
+
|
58
|
+
def inc_dirs ()
|
59
|
+
env_array(:INCDIRS, []) + modules.reverse.map {|m| m.inc_dir}.flatten
|
60
|
+
end
|
61
|
+
|
62
|
+
def src_dirs ()
|
63
|
+
env_array :SRCDIRS, []
|
64
|
+
end
|
65
|
+
|
66
|
+
def src_exts ()
|
67
|
+
env_array(:SRCEXTS, []) + %w[c cc cpp m mm]
|
68
|
+
end
|
69
|
+
|
70
|
+
def excludes ()
|
71
|
+
env_array :EXCLUDES, []
|
72
|
+
end
|
73
|
+
|
74
|
+
def excluded? (path)
|
75
|
+
excludes.any? {|s| path =~ %r{#{s}}}
|
76
|
+
end
|
77
|
+
|
78
|
+
def glob (*patterns)
|
79
|
+
paths = []
|
80
|
+
patterns.each do |pattern|
|
81
|
+
paths.concat Dir.glob(pattern)
|
82
|
+
end
|
83
|
+
paths
|
84
|
+
end
|
85
|
+
|
86
|
+
def compile_erb (path, out)
|
87
|
+
open(path) do |input|
|
88
|
+
open(out, 'w') do |output|
|
89
|
+
output.write compile_erb_str(input.read)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
#rescue
|
93
|
+
end
|
94
|
+
|
95
|
+
def compile_erb_str (str)
|
96
|
+
ERB.new(str, nil, '%').result binding
|
97
|
+
end
|
98
|
+
|
99
|
+
def params (max, sep = '', &block)
|
100
|
+
raise 'block not given.' unless block
|
101
|
+
return '' if max == 0
|
102
|
+
(1..max).map(&block).join(sep)
|
103
|
+
end
|
104
|
+
|
105
|
+
def make_path_map (paths, ext_map)
|
106
|
+
paths = paths.map do |path|
|
107
|
+
newpath = ext_map.inject path do |value, (from, to)|
|
108
|
+
value.sub /#{from.gsub('.', '\.')}$/, to
|
109
|
+
end
|
110
|
+
raise "map to same path" if path == newpath
|
111
|
+
[path, newpath]
|
112
|
+
end
|
113
|
+
Hash[*paths.flatten]
|
114
|
+
end
|
115
|
+
|
116
|
+
def get_env (name, defval = nil)
|
117
|
+
val = ENV[name.to_s] || Object.const_get(name) rescue defval
|
118
|
+
val.dup rescue val
|
119
|
+
end
|
120
|
+
|
121
|
+
def env (name, defval = nil)
|
122
|
+
case val = get_env(name, defval)
|
123
|
+
when /^\d+$/ then val.to_i
|
124
|
+
when 'true', true then true
|
125
|
+
when 'false', false then false
|
126
|
+
when nil then nil
|
127
|
+
else val
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def env_array (name, defval = nil)
|
132
|
+
val = get_env name, defval
|
133
|
+
val = val.strip.split(/\s+/) if val.kind_of? String
|
134
|
+
val
|
135
|
+
end
|
136
|
+
|
137
|
+
def append_env (name, *args)
|
138
|
+
ENV[name] = (ENV[name] || '') + " #{args.join ' '}"
|
139
|
+
end
|
140
|
+
|
141
|
+
def make_cppflags (flags = '', defs = [], incdirs = [])
|
142
|
+
s = flags.dup
|
143
|
+
s += make_cppflags_defs(defs) .map {|s| " -D#{s}"}.join
|
144
|
+
s += make_cppflags_incdirs(incdirs).map {|s| " -I#{s}"}.join
|
145
|
+
s
|
146
|
+
end
|
147
|
+
|
148
|
+
def make_cppflags_defs (defs = [])
|
149
|
+
a = defs.dup
|
150
|
+
a << $~[0].upcase if RUBY_PLATFORM =~ /mswin|ming|cygwin|darwin/i
|
151
|
+
a << (debug? ? '_DEBUG' : 'NDEBUG')
|
152
|
+
a << 'WIN32' if win32?
|
153
|
+
a << 'OSX' if osx?
|
154
|
+
a << 'IOS' if ios?
|
155
|
+
a
|
156
|
+
end
|
157
|
+
|
158
|
+
def make_cppflags_incdirs (dirs = [])
|
159
|
+
dirs.dup + ruby_inc_dirs
|
160
|
+
end
|
161
|
+
|
162
|
+
def ruby_inc_dirs ()
|
163
|
+
root = RbConfig::CONFIG['rubyhdrdir']
|
164
|
+
[root, RbConfig::CONFIG['rubyarchhdrdir'] || "#{root}/#{RUBY_PLATFORM}"]
|
165
|
+
end
|
166
|
+
|
167
|
+
def make_cflags (flags = '')
|
168
|
+
s = flags.dup
|
169
|
+
s << ' -Wno-unknown-pragmas -Wno-reserved-user-defined-literal'
|
170
|
+
s << ' -std=c++11' if gcc?
|
171
|
+
s << ' -std=c++11 -stdlib=libc++ -mmacosx-version-min=10.7' if clang?
|
172
|
+
s << ' ' + RbConfig::CONFIG['debugflags'] if debug?
|
173
|
+
s.gsub! /-O\d?\w*/, '-O0' if debug?
|
174
|
+
s
|
175
|
+
end
|
176
|
+
|
177
|
+
def make_ldflags (flags = '', libdirs = [], frameworks = [])
|
178
|
+
s = flags.dup
|
179
|
+
s << libdirs.map {|s| " -L#{s}"}.join
|
180
|
+
s << frameworks.map {|s| " -framework #{s}"}.join
|
181
|
+
s
|
182
|
+
end
|
183
|
+
|
184
|
+
def debug (state)
|
185
|
+
ENV['DEBUG'] = state.to_s
|
186
|
+
end
|
187
|
+
|
188
|
+
def debug? ()
|
189
|
+
env :DEBUG, false
|
190
|
+
end
|
191
|
+
|
192
|
+
def win32? ()
|
193
|
+
RUBY_PLATFORM =~ /mswin|ming|cygwin/
|
194
|
+
end
|
195
|
+
|
196
|
+
def mswin? ()
|
197
|
+
RUBY_PLATFORM =~ /mswin/
|
198
|
+
end
|
199
|
+
|
200
|
+
def ming? ()
|
201
|
+
RUBY_PLATFORM =~ /ming/
|
202
|
+
end
|
203
|
+
|
204
|
+
def cygwin? ()
|
205
|
+
RUBY_PLATFORM =~ /cygwin/
|
206
|
+
end
|
207
|
+
|
208
|
+
def osx? ()
|
209
|
+
RUBY_PLATFORM =~ /darwin/
|
210
|
+
end
|
211
|
+
|
212
|
+
def ios? ()
|
213
|
+
false
|
214
|
+
end
|
215
|
+
|
216
|
+
def gcc? ()
|
217
|
+
RbConfig::CONFIG['CXX'] =~ /(^|\s)g\+\+/i
|
218
|
+
end
|
219
|
+
|
220
|
+
def clang? ()
|
221
|
+
RbConfig::CONFIG['CXX'] =~ /(^|\s)clang/i
|
222
|
+
end
|
223
|
+
|
224
|
+
def cxx ()
|
225
|
+
env :CXX, RbConfig::CONFIG['CXX'] || 'g++'
|
226
|
+
end
|
227
|
+
|
228
|
+
def ar ()
|
229
|
+
env :AR, RbConfig::CONFIG['AR'] || 'ar'
|
230
|
+
end
|
231
|
+
|
232
|
+
def cppflags ()
|
233
|
+
flags = env :CPPFLAGS, RbConfig::CONFIG['CPPFLAGS']
|
234
|
+
make_cppflags flags, defs, inc_dirs
|
235
|
+
end
|
236
|
+
|
237
|
+
def cxxflags ()
|
238
|
+
flags = env :CXXFLAGS, RbConfig::CONFIG['CXXFLAGS']
|
239
|
+
make_cflags flags
|
240
|
+
end
|
241
|
+
|
242
|
+
def arflags ()
|
243
|
+
env :ARFLAGS, RbConfig::CONFIG['ARFLAGS'] || 'crs'
|
244
|
+
end
|
245
|
+
|
246
|
+
|
247
|
+
end# Rake
|
248
|
+
|
249
|
+
|
250
|
+
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
|
|
data/src/string.cpp
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
#include <stdio.h>
|
5
|
-
#include <
|
5
|
+
#include <algorithm>
|
6
|
+
#include <memory>
|
6
7
|
|
7
8
|
|
8
9
|
namespace Xot
|
@@ -18,6 +19,36 @@ namespace Xot
|
|
18
19
|
{
|
19
20
|
}
|
20
21
|
|
22
|
+
String
|
23
|
+
String::upcase () const
|
24
|
+
{
|
25
|
+
String s = c_str();
|
26
|
+
std::transform(
|
27
|
+
s.begin(), s.end(), s.begin(),
|
28
|
+
[](int c) {return toupper(c);});
|
29
|
+
return s;
|
30
|
+
}
|
31
|
+
|
32
|
+
String
|
33
|
+
String::downcase () const
|
34
|
+
{
|
35
|
+
String s = c_str();
|
36
|
+
std::transform(
|
37
|
+
s.begin(), s.end(), s.begin(),
|
38
|
+
[](int c) {return tolower(c);});
|
39
|
+
return s;
|
40
|
+
}
|
41
|
+
|
42
|
+
String
|
43
|
+
String::strip () const
|
44
|
+
{
|
45
|
+
String s = c_str();
|
46
|
+
auto isspace = [](int c) {return std::isspace(c);};
|
47
|
+
auto head = std::find_if_not(s.begin(), s.end(), isspace);
|
48
|
+
auto tail = std::find_if( head, s.end(), isspace);
|
49
|
+
return String(head, tail);
|
50
|
+
}
|
51
|
+
|
21
52
|
String::operator const char* () const
|
22
53
|
{
|
23
54
|
return c_str();
|
@@ -67,7 +98,7 @@ namespace Xot
|
|
67
98
|
return &stack[0];
|
68
99
|
|
69
100
|
int bufsize = BUFSIZE;// vscprintf(format, args);
|
70
|
-
|
101
|
+
std::unique_ptr<char[]> heap;
|
71
102
|
while (true)
|
72
103
|
{
|
73
104
|
bufsize *= 2;
|