xot 0.1.6 → 0.1.7

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