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.
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
- typedef std::string String;
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
@@ -0,0 +1,17 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __XOT_TIME_H__
4
+ #define __XOT_TIME_H__
5
+
6
+
7
+ namespace Xot
8
+ {
9
+
10
+
11
+ double time (bool local = true);
12
+
13
+
14
+ }// Xot
15
+
16
+
17
+ #endif//EOH
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
@@ -2,7 +2,8 @@
2
2
 
3
3
 
4
4
  require 'xot/module'
5
- require 'xot/load_path'
5
+ require 'xot/bit_flag'
6
+ require 'xot/block_util'
6
7
  require 'xot/hookable'
7
8
  require 'xot/setter'
8
- require 'xot/block_util'
9
+ require 'xot/invoker'
@@ -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
@@ -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
@@ -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
- extend module ModuleInfo
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 include_dirs ()
18
- %w[include].map {|dir| root_dir dir}
21
+ def include_dir ()
22
+ root_dir 'include'
19
23
  end
20
24
 
21
- def lib_dirs ()
22
- %w[lib].map {|dir| root_dir dir}
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# ModuleInfo
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, "%").result binding
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, "w") do |output|
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 (n, sep = "", &block)
42
- raise "block not given." unless block
43
- return "" if n == 0
44
- (1..n).map(&block).join(sep)
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 "empty conversion." if convs.empty?
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+$/ then val.to_i
62
- when 'true' then true
63
- when 'false' then false
64
- else val
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} " + "-" * 50
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 cocoa? ()
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