xot 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|