xot 0.1.6 → 0.1.7
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/{ChangeLog → README.md} +0 -0
- data/Rakefile +7 -6
- data/VERSION +1 -1
- data/ext/xot/extconf.rb +10 -49
- data/ext/xot/tester.cpp +93 -0
- data/include/xot.h +4 -1
- data/include/xot/exception.h +70 -0
- data/include/xot/ref.h +171 -41
- data/include/xot/string.h +35 -16
- data/include/xot/time.h +17 -0
- data/include/xot/util.h +26 -0
- data/lib/xot.rb +3 -2
- data/lib/xot/bit_flag.rb +52 -0
- data/lib/xot/extconf.rb +59 -0
- data/lib/xot/invoker.rb +48 -0
- data/lib/xot/module.rb +11 -7
- data/lib/xot/rake.rb +99 -14
- data/lib/xot/setter.rb +5 -6
- data/lib/xot/test.rb +20 -0
- data/src/debug.cpp +5 -1
- data/src/exception.cpp +89 -0
- data/src/string.cpp +39 -0
- data/src/time.cpp +24 -0
- data/task/ext.rake +13 -27
- data/task/lib.rake +20 -36
- data/task/mac.rake +45 -0
- data/test/helper.rb +6 -3
- data/test/test_bit_flag.rb +66 -0
- data/test/test_invoker.rb +41 -0
- data/test/test_setter.rb +3 -2
- data/xot.gemspec +3 -4
- metadata +26 -26
- data/.gitignore +0 -14
- data/README +0 -0
- data/lib/xot/load_path.rb +0 -28
- data/src/defs.cpp +0 -6
- data/task/git.rake +0 -32
- data/task/submodule.rake +0 -51
data/include/xot/string.h
CHANGED
@@ -8,11 +8,45 @@
|
|
8
8
|
#include <string>
|
9
9
|
|
10
10
|
|
11
|
+
#define XOT_STRINGF(format, result) \
|
12
|
+
Xot::String result; \
|
13
|
+
do \
|
14
|
+
{ \
|
15
|
+
if (format) \
|
16
|
+
{ \
|
17
|
+
va_list args; \
|
18
|
+
va_start(args, format); \
|
19
|
+
result = Xot::stringf(format, args); \
|
20
|
+
va_end(args); \
|
21
|
+
} \
|
22
|
+
} \
|
23
|
+
while (false)
|
24
|
+
|
25
|
+
|
11
26
|
namespace Xot
|
12
27
|
{
|
13
28
|
|
14
29
|
|
15
|
-
|
30
|
+
class String : public std::string
|
31
|
+
{
|
32
|
+
|
33
|
+
typedef std::string Super;
|
34
|
+
|
35
|
+
public:
|
36
|
+
|
37
|
+
String ();
|
38
|
+
|
39
|
+
String (const char* str);
|
40
|
+
|
41
|
+
operator const char* () const;
|
42
|
+
|
43
|
+
friend String operator + (const String& lhs, const String& rhs);
|
44
|
+
|
45
|
+
friend String operator + (const String& lhs, const char* rhs);
|
46
|
+
|
47
|
+
friend String operator + (const char* lhs, const String& rhs);
|
48
|
+
|
49
|
+
};// String
|
16
50
|
|
17
51
|
|
18
52
|
String stringf (const char* format, ...);
|
@@ -25,19 +59,4 @@ namespace Xot
|
|
25
59
|
}// Xot
|
26
60
|
|
27
61
|
|
28
|
-
#define XOT_STRINGF(format, result) \
|
29
|
-
Xot::String result; \
|
30
|
-
do \
|
31
|
-
{ \
|
32
|
-
if (format) \
|
33
|
-
{ \
|
34
|
-
va_list args; \
|
35
|
-
va_start(args, format); \
|
36
|
-
result = Xot::stringf(format, args); \
|
37
|
-
va_end(args); \
|
38
|
-
} \
|
39
|
-
} \
|
40
|
-
while (false)
|
41
|
-
|
42
|
-
|
43
62
|
#endif//EOH
|
data/include/xot/time.h
ADDED
data/include/xot/util.h
CHANGED
@@ -4,6 +4,9 @@
|
|
4
4
|
#define __XOT_UTIL_H__
|
5
5
|
|
6
6
|
|
7
|
+
#include <stdint.h>
|
8
|
+
|
9
|
+
|
7
10
|
namespace Xot
|
8
11
|
{
|
9
12
|
|
@@ -20,6 +23,29 @@ namespace Xot
|
|
20
23
|
}
|
21
24
|
|
22
25
|
|
26
|
+
template <typename T>
|
27
|
+
inline T* set_pointer_flag (T* pointer, bool flag = true)
|
28
|
+
{
|
29
|
+
uintptr_t intval = *(uintptr_t*) &pointer;
|
30
|
+
if (flag) intval |= 0x1;
|
31
|
+
else intval &= ~0x1;
|
32
|
+
return *(T**) &intval;
|
33
|
+
}
|
34
|
+
|
35
|
+
template <typename T>
|
36
|
+
inline const T* set_pointer_flag (const T* pointer, bool flag = true)
|
37
|
+
{
|
38
|
+
return set_pointer_flag(const_cast<T*>(pointer), flag);
|
39
|
+
}
|
40
|
+
|
41
|
+
template <typename T>
|
42
|
+
inline bool get_pointer_flag (const T* pointer)
|
43
|
+
{
|
44
|
+
uintptr_t intval = *(uintptr_t*) &pointer;
|
45
|
+
return intval & 0x1;
|
46
|
+
}
|
47
|
+
|
48
|
+
|
23
49
|
}// Xot
|
24
50
|
|
25
51
|
|
data/lib/xot.rb
CHANGED
data/lib/xot/bit_flag.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
module Xot
|
5
|
+
|
6
|
+
|
7
|
+
class BitFlag
|
8
|
+
|
9
|
+
def initialize (none = 0, &block)
|
10
|
+
@bit2sym, @sym2bit = {}, {none: none, no: none}
|
11
|
+
BlockUtil.instance_eval_or_block_call self, &block if block
|
12
|
+
end
|
13
|
+
|
14
|
+
def flag (symbol, bit)
|
15
|
+
@sym2bit[symbol] = bit
|
16
|
+
@bit2sym[bit] = symbol if bit.to_s(2).count('1') == 1
|
17
|
+
end
|
18
|
+
|
19
|
+
def bits2symbols (bits)
|
20
|
+
array = []
|
21
|
+
bits.to_s(2).reverse.each_char.with_index do |char, index|
|
22
|
+
next unless char == '1'
|
23
|
+
bit = BitFlag.bit index
|
24
|
+
symbol = @bit2sym[bit]
|
25
|
+
raise "unknown bit for flag." unless symbol
|
26
|
+
array << symbol
|
27
|
+
end
|
28
|
+
array
|
29
|
+
end
|
30
|
+
|
31
|
+
def symbols2bits (*symbols)
|
32
|
+
symbols.map {|sym| sym2bit sym}.reduce(0) {|a, b| a | b}
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.bit (*args)
|
36
|
+
bits = 0
|
37
|
+
args.each {|n| bits |= 0x1 << n}
|
38
|
+
bits
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def sym2bit (symbol)
|
44
|
+
bit = @sym2bit[symbol]
|
45
|
+
raise 'unknown symbol for flag.' unless bit
|
46
|
+
bit
|
47
|
+
end
|
48
|
+
|
49
|
+
end# BitFlag
|
50
|
+
|
51
|
+
|
52
|
+
end# Xot
|
data/lib/xot/extconf.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require 'xot/rake'
|
5
|
+
require 'xot/block_util'
|
6
|
+
|
7
|
+
|
8
|
+
module Xot
|
9
|
+
|
10
|
+
|
11
|
+
class ExtConf
|
12
|
+
|
13
|
+
include Xot::Rake
|
14
|
+
|
15
|
+
attr_reader :modules, :defs, :include_dirs, :lib_dirs, :headers, :libs, :local_libs, :frameworks
|
16
|
+
|
17
|
+
def initialize (*modules, &block)
|
18
|
+
@modules = modules.map {|m| m.const_get :Module}
|
19
|
+
@defs, @include_dirs, @lib_dirs, @headers, @libs, @local_libs, @frameworks =
|
20
|
+
([[]] * 7).map &:dup
|
21
|
+
Xot::BlockUtil.instance_eval_or_block_call self, &block if block
|
22
|
+
end
|
23
|
+
|
24
|
+
def debug ()
|
25
|
+
env :DEBUG, false
|
26
|
+
end
|
27
|
+
|
28
|
+
def setup ()
|
29
|
+
yield if block_given?
|
30
|
+
|
31
|
+
modules.each do |m|
|
32
|
+
name = m.name.downcase
|
33
|
+
headers << "#{name}.h"
|
34
|
+
libs << name
|
35
|
+
end
|
36
|
+
|
37
|
+
local_libs << (clang? ? 'c++' : 'stdc++')
|
38
|
+
|
39
|
+
$CPPFLAGS = cppflags $CPPFLAGS, defs, include_dirs
|
40
|
+
$CFLAGS = cflags $CFLAGS + ' -x c++'
|
41
|
+
$LDFLAGS = ldflags $LDFLAGS, lib_dirs, frameworks
|
42
|
+
$LOCAL_LIBS << local_libs.map {|s| " -l#{s}"}.join
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_makefile (*args)
|
46
|
+
modules.each do |m|
|
47
|
+
dir_config m.name.downcase, m.include_dir, m.lib_dir
|
48
|
+
end
|
49
|
+
|
50
|
+
exit 1 unless headers.all? {|s| have_header s}
|
51
|
+
exit 1 unless libs.all? {|s| have_library s, 't'}
|
52
|
+
|
53
|
+
super
|
54
|
+
end
|
55
|
+
|
56
|
+
end# ExtConf
|
57
|
+
|
58
|
+
|
59
|
+
end# Xot
|
data/lib/xot/invoker.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
|
7
|
+
module Xot
|
8
|
+
|
9
|
+
|
10
|
+
module Invoker
|
11
|
+
|
12
|
+
def initialize ()
|
13
|
+
end
|
14
|
+
|
15
|
+
def handlers (create = false)
|
16
|
+
if create
|
17
|
+
@handlers ||= []
|
18
|
+
else
|
19
|
+
@handlers ? @handlers : []
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def add_handler (handler)
|
24
|
+
return unless handler
|
25
|
+
a = self.handlers true
|
26
|
+
a.push handler unless a.include? handler
|
27
|
+
end
|
28
|
+
|
29
|
+
def remove_handler (handler)
|
30
|
+
return unless handler
|
31
|
+
self.handlers.delete handler
|
32
|
+
end
|
33
|
+
|
34
|
+
def invoke (name, attributes = {}, options = {})
|
35
|
+
only = options[:only]
|
36
|
+
only = [only] if only && !only.kind_of?(Array)
|
37
|
+
handlers = only ? only : @handlers
|
38
|
+
return unless handlers
|
39
|
+
|
40
|
+
handlers.each do |handler|
|
41
|
+
handler.send name, OpenStruct.new(attributes) if handler.respond_to? name
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end# Invoker
|
46
|
+
|
47
|
+
|
48
|
+
end# Xot
|
data/lib/xot/module.rb
CHANGED
@@ -4,7 +4,11 @@
|
|
4
4
|
module Xot
|
5
5
|
|
6
6
|
|
7
|
-
|
7
|
+
module Module
|
8
|
+
|
9
|
+
def name ()
|
10
|
+
super.split('::')[-2]
|
11
|
+
end
|
8
12
|
|
9
13
|
def version ()
|
10
14
|
open(root_dir 'VERSION') {|f| f.readline.chomp}
|
@@ -14,12 +18,12 @@ module Xot
|
|
14
18
|
File.expand_path "../../../#{path}", __FILE__
|
15
19
|
end
|
16
20
|
|
17
|
-
def
|
18
|
-
|
21
|
+
def include_dir ()
|
22
|
+
root_dir 'include'
|
19
23
|
end
|
20
24
|
|
21
|
-
def
|
22
|
-
|
25
|
+
def lib_dir ()
|
26
|
+
root_dir 'lib'
|
23
27
|
end
|
24
28
|
|
25
29
|
def task_dir ()
|
@@ -37,9 +41,9 @@ module Xot
|
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
40
|
-
self
|
44
|
+
extend self
|
41
45
|
|
42
|
-
end#
|
46
|
+
end# Module
|
43
47
|
|
44
48
|
|
45
49
|
end# Xot
|
data/lib/xot/rake.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
require 'erb'
|
5
|
+
require 'rbconfig'
|
5
6
|
require 'pp'
|
6
7
|
|
7
8
|
|
@@ -26,26 +27,26 @@ module Xot
|
|
26
27
|
end
|
27
28
|
|
28
29
|
def erb (str)
|
29
|
-
ERB.new(str, nil,
|
30
|
+
ERB.new(str, nil, '%').result binding
|
30
31
|
end
|
31
32
|
|
32
33
|
def compile (path, out)
|
33
34
|
open(path) do |input|
|
34
|
-
open(out,
|
35
|
+
open(out, 'w') do |output|
|
35
36
|
output.write erb(input.read)
|
36
37
|
end
|
37
38
|
end
|
38
39
|
#rescue
|
39
40
|
end
|
40
41
|
|
41
|
-
def params (
|
42
|
-
raise
|
43
|
-
return
|
44
|
-
(1..
|
42
|
+
def params (max, sep = '', &block)
|
43
|
+
raise 'block not given.' unless block
|
44
|
+
return '' if max == 0
|
45
|
+
(1..max).map(&block).join(sep)
|
45
46
|
end
|
46
47
|
|
47
48
|
def convertions (paths, convs)
|
48
|
-
raise
|
49
|
+
raise 'empty conversion.' if convs.empty?
|
49
50
|
paths = paths.map do |path|
|
50
51
|
convpath = path
|
51
52
|
convs.each do |from, to|
|
@@ -56,17 +57,69 @@ module Xot
|
|
56
57
|
Hash[*paths.flatten]
|
57
58
|
end
|
58
59
|
|
59
|
-
def env (name, defval = nil)
|
60
|
+
def env (name, defval = nil, to = nil)
|
60
61
|
case val = (ENV[name.to_s] || Object.const_get(name) rescue defval)
|
61
|
-
when /^\d+$/
|
62
|
-
when 'true' then true
|
63
|
-
when 'false' then false
|
64
|
-
|
62
|
+
when /^\d+$/ then val.to_i
|
63
|
+
when 'true', true then true
|
64
|
+
when 'false', false then false
|
65
|
+
when nil then nil
|
66
|
+
when Numeric then val
|
67
|
+
else
|
68
|
+
val = val.split /\s+/ if to == :array && val.respond_to?(:split)
|
69
|
+
val.dup
|
65
70
|
end
|
66
71
|
end
|
67
72
|
|
73
|
+
def ruby_incdirs ()
|
74
|
+
root = RbConfig::CONFIG['rubyhdrdir']
|
75
|
+
[root, RbConfig::CONFIG['rubyarchhdrdir'] || "#{root}/#{RUBY_PLATFORM}"]
|
76
|
+
end
|
77
|
+
|
78
|
+
def cppflags (flags = '', defs = [], incdirs = [])
|
79
|
+
s = flags.dup
|
80
|
+
s << cppflags_defs(defs) .map {|s| " -D#{s}"}.join
|
81
|
+
s << cppflags_incdirs(incdirs).map {|s| " -I#{s}"}.join
|
82
|
+
s
|
83
|
+
end
|
84
|
+
|
85
|
+
def cppflags_defs (defs = [])
|
86
|
+
a = defs
|
87
|
+
a << $~[0].upcase if RUBY_PLATFORM =~ /mswin|ming|cygwin|darwin/i
|
88
|
+
a << (debug? ? '_DEBUG' : 'NDEBUG')
|
89
|
+
a << 'WIN32' if win32?
|
90
|
+
a << 'OSX' if osx?
|
91
|
+
a << 'IOS' if ios?
|
92
|
+
a
|
93
|
+
end
|
94
|
+
|
95
|
+
def cppflags_incdirs (dirs = [])
|
96
|
+
a = dirs.dup
|
97
|
+
a += ruby_incdirs
|
98
|
+
a
|
99
|
+
end
|
100
|
+
|
101
|
+
def cflags (flags = '')
|
102
|
+
s = flags.dup
|
103
|
+
s << ' -Wno-unknown-pragmas'
|
104
|
+
s << ' ' << RbConfig::CONFIG['debugflags'] if debug?
|
105
|
+
s << ' -stdlib=libc++ -mmacosx-version-min=10.7' if clang?
|
106
|
+
s.gsub! /-O\d?/, '-O0' if debug?
|
107
|
+
s
|
108
|
+
end
|
109
|
+
|
110
|
+
def ldflags (flags = '', libdirs = [], frameworks = [])
|
111
|
+
s = flags.dup
|
112
|
+
s << libdirs.map {|s| " -L#{s}"}.join
|
113
|
+
s << frameworks.map {|s| " -framework #{s}"}.join
|
114
|
+
s
|
115
|
+
end
|
116
|
+
|
68
117
|
def header (mod)
|
69
|
-
puts "-- #{mod.to_s.capitalize} " +
|
118
|
+
puts "-- #{mod.to_s.capitalize} " + '-' * 50
|
119
|
+
end
|
120
|
+
|
121
|
+
def debug? ()
|
122
|
+
env :DEBUG, false
|
70
123
|
end
|
71
124
|
|
72
125
|
def win32? ()
|
@@ -85,10 +138,14 @@ module Xot
|
|
85
138
|
RUBY_PLATFORM =~ /cygwin/
|
86
139
|
end
|
87
140
|
|
88
|
-
def
|
141
|
+
def osx? ()
|
89
142
|
RUBY_PLATFORM =~ /darwin/
|
90
143
|
end
|
91
144
|
|
145
|
+
def ios? ()
|
146
|
+
false
|
147
|
+
end
|
148
|
+
|
92
149
|
def clang? ()
|
93
150
|
RbConfig::CONFIG['CXX'] =~ /clang/
|
94
151
|
end
|
@@ -98,3 +155,31 @@ module Xot
|
|
98
155
|
|
99
156
|
|
100
157
|
end# Xot
|
158
|
+
|
159
|
+
|
160
|
+
if Kernel.const_defined? :Rake
|
161
|
+
module Rake
|
162
|
+
class Application
|
163
|
+
alias invoke_task_org invoke_task
|
164
|
+
|
165
|
+
def invoke_task (*args, &block)
|
166
|
+
invoke_task_org *args, &block
|
167
|
+
rescue RuntimeError => e
|
168
|
+
if e.message =~ /don't\s+know\s+.*\s+task\s+/i
|
169
|
+
escalate_tasks
|
170
|
+
else
|
171
|
+
raise
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def escalate_tasks ()
|
176
|
+
Dir.chdir '..' do
|
177
|
+
cmd = "rake #{ARGV.join ' '}"
|
178
|
+
$stderr.puts "(in #{Dir.pwd}) #{cmd}"
|
179
|
+
system cmd
|
180
|
+
end
|
181
|
+
exit 0
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|