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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b300601324c88ccfa6fc6e1c7c2aee5780dab91a
4
+ data.tar.gz: 3a1084e6aa373e275acdeda17ddc825151266ed4
5
+ SHA512:
6
+ metadata.gz: ff596b6f8d92698e58f2aab19c98234251a2bf4ad9489b9f11a04a637d23ac88aee5a7e61c3f2ea90d9c6cefbc9bcf32cdd9d8d512a5da31b156c5c3e45ff7bd
7
+ data.tar.gz: ea6adff9f5dba95b7403da54c0e6c7f075c82d1e0c2d8dbad987a7c426dac7eaaf9a5626118e9c6490113c855fedd71825521203aaf224c5d173fa95ddc862bb
File without changes
data/Rakefile CHANGED
@@ -1,9 +1,9 @@
1
1
  # -*- mode: ruby; coding: utf-8 -*-
2
2
 
3
3
 
4
- File.expand_path('../lib', __FILE__).tap do |path|
5
- $:.unshift path if !$:.include?(path) && File.directory?(path)
6
- end
4
+ %w[.]
5
+ .map {|s| File.expand_path "../#{s}/lib", __FILE__}
6
+ .each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
7
7
 
8
8
  require 'xot/rake'
9
9
  require 'xot/module'
@@ -11,8 +11,9 @@ require 'xot/module'
11
11
  include Xot::Rake
12
12
 
13
13
 
14
- MODULE = Xot
15
- DLNAME = 'tester'
14
+ MODULES = [Xot].map {|m| m.const_get :Module}
15
+ MODULE = MODULES.last
16
+ DLNAME = 'tester'
16
17
 
17
18
 
18
19
  task :default => :build
@@ -22,4 +23,4 @@ task :build => :lib
22
23
  empty_task :test
23
24
 
24
25
 
25
- Xot.load_tasks
26
+ MODULES.each {|m| m.load_tasks :lib, :ext, :test, :gem}
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.6
1
+ 0.1.7
data/ext/xot/extconf.rb CHANGED
@@ -1,59 +1,20 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
 
4
- File.expand_path('../../../lib', __FILE__).tap do |path|
5
- $:.unshift path if !$:.include?(path) && File.directory?(path)
6
- end
4
+ %w[.]
5
+ .map {|s| File.expand_path "../../../#{s}/lib", __FILE__}
6
+ .each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
7
7
 
8
8
  require 'mkmf'
9
- require 'xot/rake'
9
+ require 'xot/extconf'
10
10
  require 'xot/module'
11
11
 
12
- include Xot::Rake
13
-
14
-
15
- debug = env :DEBUG, false
16
-
17
-
18
- DEFS = []
19
- INCDIRS = %w[
20
- /opt/local/include
21
- /opt/include
22
- ]
23
- LIBDIRS = []
24
-
25
- HEADERS = %w[
26
- boost/noncopyable.hpp
27
- ruby.h
28
- xot.h
29
- ]
30
- LIBS = %w[
31
- stdc++
32
- xot
33
- ]
34
-
35
12
 
36
- DEFS << '_DEBUG' if debug
37
- DEFS << 'NDEBUG' unless debug
38
- DEFS << 'WINDOWS' << 'WIN32' if win32?
39
- DEFS << 'COCOA' if cocoa?
40
- DEFS << $~[0].upcase if RUBY_PLATFORM =~ /mswin|ming|cygwin|darwin/i
13
+ Xot::ExtConf.new Xot do
14
+ setup do
15
+ headers << 'boost/noncopyable.hpp' << 'ruby.h'
16
+ end
41
17
 
42
- $CPPFLAGS << DEFS.map {|s| " -D#{s}"}.join
43
- $CPPFLAGS << INCDIRS.map {|s| " -I#{s}"}.join
44
- $LDFLAGS << LIBDIRS.map {|s| " -L#{s}"}.join
45
- $CFLAGS << ' --stdlib=libc++' if clang?
46
-
47
- RbConfig::CONFIG.each do |key, val|
48
- {'gcc' => 'g++', 'clang' => 'clang++'}.each {|from, to| val.gsub! from, to}
18
+ dir_config 'boost'
19
+ create_makefile 'xot/tester'
49
20
  end
50
-
51
-
52
- dir_config 'boost'
53
- dir_config 'xot', Xot.root_dir
54
-
55
- exit 1 unless HEADERS.all? {|s| have_header(s)}
56
- exit 1 unless LIBS.all? {|s| have_library(s)}
57
-
58
-
59
- create_makefile 'xot/tester'
data/ext/xot/tester.cpp CHANGED
@@ -1,9 +1,102 @@
1
1
  #include <ruby.h>
2
2
 
3
3
 
4
+ #include "xot.h"
5
+
6
+
7
+ template <typename EXCEPTION>
8
+ static bool
9
+ test_exception (bool should_catch = true)
10
+ {
11
+ try
12
+ {
13
+ throw EXCEPTION("");
14
+ }
15
+ catch (EXCEPTION& e)
16
+ {
17
+ if (!should_catch) return false;
18
+ }
19
+ catch (...)
20
+ {
21
+ if (should_catch) return false;
22
+ }
23
+
24
+ Xot::String s = "Exception Message";
25
+ EXCEPTION e(s);
26
+ if (e.what() != s) return false;
27
+
28
+ return true;
29
+ }
30
+
31
+ static bool
32
+ test_exception ()
33
+ {
34
+ if (!test_exception<Xot::XotError>()) return false;
35
+ if (!test_exception<Xot::InvalidStateError>()) return false;
36
+ if (!test_exception<Xot::SystemError>()) return false;
37
+ if (!test_exception<Xot::NotImplementedError>()) return false;
38
+ if (!test_exception<std::invalid_argument>()) return false;
39
+ if (!test_exception<std::out_of_range>()) return false;
40
+ return true;
41
+ }
42
+
43
+ struct RefObj : public Xot::RefCountable<> {};
44
+
45
+ static bool
46
+ test_ref ()
47
+ {
48
+ if (!(Xot::Ref<RefObj>(NULL) == Xot::Ref<RefObj>(NULL))) return false;
49
+ if (!(Xot::Ref<RefObj>(NULL) != Xot::Ref<RefObj>(new RefObj))) return false;
50
+
51
+ if (!(Xot::Ref<RefObj>(NULL) == Xot::Ref<const RefObj>(NULL))) return false;
52
+ if (!(Xot::Ref<RefObj>(NULL) != Xot::Ref<const RefObj>(new RefObj))) return false;
53
+
54
+ if (!(Xot::Ref<const RefObj>(NULL) == Xot::Ref<RefObj>(NULL))) return false;
55
+ if (!(Xot::Ref<const RefObj>(NULL) != Xot::Ref<RefObj>(new RefObj))) return false;
56
+
57
+ if (!(Xot::Ref<const RefObj>(NULL) == Xot::Ref<const RefObj>(NULL))) return false;
58
+ if (!(Xot::Ref<const RefObj>(NULL) != Xot::Ref<const RefObj>(new RefObj))) return false;
59
+
60
+ if (!(Xot::Ref<RefObj>(NULL) == (RefObj*) NULL)) return false;
61
+ if (!(Xot::Ref<RefObj>(NULL) != new RefObj)) return false;
62
+ return true;
63
+ }
64
+
65
+ static bool
66
+ test_util ()
67
+ {
68
+ if (!(Xot::clip(10, 100, 50) == 50)) return false;
69
+ if (!(Xot::clip(10, 100, 10) == 10)) return false;
70
+ if (!(Xot::clip(10, 100, 100) == 100)) return false;
71
+ if (!(Xot::clip(10, 100, 0) == 10)) return false;
72
+ if (!(Xot::clip(10, 100, 200) == 100)) return false;
73
+
74
+ int value;
75
+ int* p = &value;
76
+ if (!(Xot::get_pointer_flag(p) == false)) return false;
77
+
78
+ p = Xot::set_pointer_flag(p);
79
+ if (!(Xot::get_pointer_flag(p) == true)) return false;
80
+
81
+ p = Xot::set_pointer_flag(p, false);
82
+ if (!(Xot::get_pointer_flag(p) == false)) return false;
83
+
84
+ p = Xot::set_pointer_flag(p, true);
85
+ if (!(Xot::get_pointer_flag(p) == true)) return false;
86
+
87
+ if (!( p != &value)) return false;
88
+ if (!(Xot::set_pointer_flag(p, false) == &value)) return false;
89
+
90
+ return true;
91
+ }
92
+
93
+
4
94
  static VALUE
5
95
  test_native (VALUE self)
6
96
  {
97
+ if (!test_exception()) return false;
98
+ if (!test_ref()) return false;
99
+ if (!test_util()) return false;
7
100
  return true;
8
101
  }
9
102
 
data/include/xot.h CHANGED
@@ -6,8 +6,11 @@
6
6
 
7
7
  #include <xot/defs.h>
8
8
  #include <xot/string.h>
9
- #include <xot/pimpl.h>
9
+ #include <xot/exception.h>
10
10
  #include <xot/ref.h>
11
+ #include <xot/pimpl.h>
12
+ #include <xot/time.h>
13
+ #include <xot/util.h>
11
14
  #include <xot/debug.h>
12
15
 
13
16
 
@@ -0,0 +1,70 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __XOT_EXCEPTION_H__
4
+ #define __XOT_EXCEPTION_H__
5
+
6
+
7
+ #include <stdexcept>
8
+ #include <xot/string.h>
9
+
10
+
11
+ namespace Xot
12
+ {
13
+
14
+
15
+ class XotError : public std::runtime_error
16
+ {
17
+ typedef std::runtime_error Super;
18
+ public: XotError (const char* str = NULL);
19
+ };
20
+
21
+
22
+ class InvalidStateError : public XotError
23
+ {
24
+ typedef XotError Super;
25
+ public: InvalidStateError (const char* str = NULL);
26
+ };
27
+
28
+
29
+ class SystemError : public XotError
30
+ {
31
+ typedef XotError Super;
32
+ public: SystemError (const char* str = NULL);
33
+ };
34
+
35
+
36
+ class NotImplementedError : public XotError
37
+ {
38
+ typedef XotError Super;
39
+ public: NotImplementedError (const char* str = NULL);
40
+ };
41
+
42
+
43
+ String error_text (const char* file, int line, const char* str);
44
+
45
+
46
+ namespace ErrorFunctions
47
+ {
48
+
49
+ void xot_error (const char* file, int line, const char* format = NULL, ...);
50
+
51
+ void argument_error (const char* file, int line, const char* format = NULL, ...);
52
+
53
+ void index_error (const char* file, int line, const char* format = NULL, ...);
54
+
55
+ void invalid_state_error (const char* file, int line, const char* format = NULL, ...);
56
+
57
+ void system_error (const char* file, int line, const char* format = NULL, ...);
58
+
59
+ void not_implemented_error (const char* file, int line, const char* format = NULL, ...);
60
+
61
+ }// ErrorFunctions
62
+
63
+
64
+ using namespace ErrorFunctions;
65
+
66
+
67
+ }// Xot
68
+
69
+
70
+ #endif//EOH
data/include/xot/ref.h CHANGED
@@ -4,10 +4,18 @@
4
4
  #define __XOT_REF_H__
5
5
 
6
6
 
7
+ #ifdef check // by OSX's AssertMacros.h
8
+ #undef check
9
+ #endif
10
+
11
+ #include <limits.h>
7
12
  #include <assert.h>
8
13
  #include <typeinfo>
9
14
  #include <boost/noncopyable.hpp>
15
+ #include <boost/type_traits.hpp>
16
+ #include <boost/utility/enable_if.hpp>
10
17
  #include <xot/defs.h>
18
+ #include <xot/exception.h>
11
19
  #include <xot/debug.h>
12
20
 
13
21
 
@@ -22,32 +30,32 @@ namespace Xot
22
30
 
23
31
 
24
32
  template <typename SuperClass = EmptyClass>
25
- class RefCountable : public SuperClass
33
+ class RefCountable : public SuperClass, public boost::noncopyable
26
34
  {
27
35
 
28
36
  public:
29
37
 
30
- virtual void retain ()
38
+ virtual void retain (void* data = NULL) const
31
39
  {
32
- reference(+1);
40
+ refc_update_count(+1);
33
41
 
34
42
  #ifdef XOT_REF_DEBUG
35
43
  doutln(
36
44
  "%s: %d -> %d",
37
- typeid(this).name(), count() - 1, count());
45
+ typeid(this).name(), refc_count() - 1, refc_count());
38
46
  #endif
39
47
  }
40
48
 
41
- virtual void release ()
49
+ virtual void release (void* data = NULL) const
42
50
  {
43
- assert(count() >= 0);
44
- bool del = !retained() || reference(-1) == 0;
51
+ assert(refc_count() >= 0);
52
+ bool del = !refc_retained() || refc_update_count(-1) == 0;
45
53
 
46
54
  #ifdef XOT_REF_DEBUG
47
55
  doutln(
48
56
  "%s: %d -> %d, refcount:%s, delete:%s",
49
- typeid(this).name(), count() + 1, count(),
50
- retained() ? "yes" : "no", del ? "yes" : "no");
57
+ typeid(this).name(), refc_count() + 1, refc_count(),
58
+ refc_retained() ? "yes" : "no", del ? "yes" : "no");
51
59
  #endif
52
60
 
53
61
  if (del) delete this;
@@ -56,7 +64,6 @@ namespace Xot
56
64
  protected:
57
65
 
58
66
  RefCountable ()
59
- : refcount(0)
60
67
  {
61
68
  }
62
69
 
@@ -64,44 +71,78 @@ namespace Xot
64
71
  {
65
72
  }
66
73
 
67
- private:
74
+ virtual int refc_count () const
75
+ {
76
+ return refc.count;
77
+ }
68
78
 
69
- int refcount;
79
+ virtual bool refc_retained () const
80
+ {
81
+ return refc.aux & 0x1;
82
+ }
70
83
 
71
- bool retained () const
84
+ virtual int refc_update_count (int add) const
72
85
  {
73
- return refcount & 0x1;
86
+ assert(add != 0);
87
+ if (add >= 0) refc.aux |= 0x1;// bit for retained flag.
88
+
89
+ int c = refc.count + add;
90
+ if (c < 0)
91
+ invalid_state_error(__FILE__, __LINE__);
92
+ if (c > USHRT_MAX)
93
+ xot_error(__FILE__, __LINE__, "refc.count overflow.");
94
+
95
+ return refc.count = c;
74
96
  }
75
97
 
76
- int count () const
98
+ virtual ushort refc_aux () const
77
99
  {
78
- return refcount >> 1;
100
+ return refc.aux >> 1;
79
101
  }
80
102
 
81
- int reference (int add)
103
+ virtual void refc_set_aux (ushort aux) const
82
104
  {
83
- assert(add != 0);
84
- int c = count() + add;
85
- refcount = c << 1 | 0x1;// bit for retained flag.
86
- return c;
105
+ if ((0x1 << 15) & aux)
106
+ argument_error(__FILE__, __LINE__);
107
+
108
+ refc.aux = (refc.aux & 0x1) | (aux << 1);
87
109
  }
88
110
 
89
- RefCountable (const RefCountable&);
111
+ private:
90
112
 
91
- RefCountable& operator = (const RefCountable&);
113
+ mutable struct Data
114
+ {
115
+
116
+ ushort count, aux;
117
+
118
+ Data () : count(0), aux(0) {}
119
+
120
+ } refc;
92
121
 
93
122
  };// RefCountable
94
123
 
95
124
 
96
- template <typename T>
125
+ template <typename T, typename = void>
97
126
  class Ref
98
127
  {
99
128
 
100
129
  typedef Ref<T> This;
101
130
 
131
+ typedef T Value;
132
+
133
+ typedef const T ConstValue;
134
+
135
+ typedef T& Reference;
136
+
137
+ typedef const T& ConstReference;
138
+
139
+ typedef T* Pointer;
140
+
141
+ typedef const T* ConstPointer;
142
+
102
143
  public:
103
144
 
104
- Ref (T* ptr = NULL)
145
+ Ref (Pointer ptr = NULL)
105
146
  : ptr(ptr)
106
147
  {
107
148
  if (ptr) ptr->retain();
@@ -113,13 +154,13 @@ namespace Xot
113
154
  if (ptr) ptr->retain();
114
155
  }
115
156
 
116
- Ref& operator = (T* ptr)
157
+ This& operator = (Pointer ptr)
117
158
  {
118
159
  reset(ptr);
119
160
  return *this;
120
161
  }
121
162
 
122
- Ref& operator = (const This& obj)
163
+ This& operator = (const This& obj)
123
164
  {
124
165
  if (&obj == this) return *this;
125
166
  reset(obj.ptr);
@@ -131,7 +172,7 @@ namespace Xot
131
172
  if (ptr) ptr->release();
132
173
  }
133
174
 
134
- void reset (T* ptr = NULL)
175
+ void reset (Pointer ptr = NULL)
135
176
  {
136
177
  if (this->ptr == ptr) return;
137
178
  if (this->ptr) this->ptr->release();
@@ -139,41 +180,130 @@ namespace Xot
139
180
  if (this->ptr) this->ptr->retain();
140
181
  }
141
182
 
142
- T* get () {return ptr;}
183
+ Pointer get () {return ptr;}
184
+
185
+ ConstPointer get () const {return ptr;}
186
+
187
+ Pointer operator -> () {return get();}
188
+
189
+ ConstPointer operator -> () const {return get();}
190
+
191
+ Reference operator * () {return *get();}
192
+
193
+ ConstReference operator * () const {return *get();}
194
+
195
+ operator Pointer () {return get();}
196
+
197
+ operator ConstPointer () const {return get();}
198
+
199
+ bool operator == (Pointer ptr) const {return this->ptr == ptr;}
200
+
201
+ bool operator != (Pointer ptr) const {return !operator==(ptr);}
202
+
203
+ bool operator == (ConstPointer ptr) const {return this->ptr == ptr;}
204
+
205
+ bool operator != (ConstPointer ptr) const {return !operator==(ptr);}
206
+
207
+ bool operator == (const This& obj) const {return ptr == obj.ptr;}
208
+
209
+ bool operator != (const This& obj) const {return !operator==(obj);}
210
+
211
+ bool operator < (const This& obj) const {return ptr < obj.ptr;}
212
+
213
+ operator bool () const {return ptr != NULL;}
214
+
215
+ bool operator ! () const {return !operator bool();}
216
+
217
+ private:
218
+
219
+ Pointer ptr;
143
220
 
144
- const T* get () const {return ptr;}
221
+ };// Ref
222
+
223
+
224
+ template <typename T>
225
+ class Ref<T, typename boost::enable_if<boost::is_const<T> >::type>
226
+ {
227
+
228
+ typedef Ref<T> This;
229
+
230
+ typedef typename boost::remove_const<T>::type Value;
231
+
232
+ typedef T ConstValue;
233
+
234
+ typedef Value& Reference;
235
+
236
+ typedef const Value& ConstReference;
237
+
238
+ typedef Value* Pointer;
239
+
240
+ typedef const Value* ConstPointer;
241
+
242
+ public:
243
+
244
+ Ref (ConstPointer ptr = NULL)
245
+ : ptr(ptr)
246
+ {
247
+ if (ptr) ptr->retain();
248
+ }
249
+
250
+ Ref (const This& obj)
251
+ : ptr(obj.ptr)
252
+ {
253
+ if (ptr) ptr->retain();
254
+ }
145
255
 
146
- T* operator -> () {return get();}
256
+ This& operator = (ConstPointer ptr)
257
+ {
258
+ reset(ptr);
259
+ return *this;
260
+ }
147
261
 
148
- const T* operator -> () const {return get();}
262
+ This& operator = (const This& obj)
263
+ {
264
+ if (&obj == this) return *this;
265
+ reset(obj.ptr);
266
+ return *this;
267
+ }
149
268
 
150
- T& operator * () {return *get();}
269
+ ~Ref ()
270
+ {
271
+ if (ptr) ptr->release();
272
+ }
151
273
 
152
- const T& operator * () const {return *get();}
274
+ void reset (ConstPointer ptr = NULL)
275
+ {
276
+ if (this->ptr == ptr) return;
277
+ if (this->ptr) this->ptr->release();
278
+ this->ptr = ptr;
279
+ if (this->ptr) this->ptr->retain();
280
+ }
153
281
 
154
- operator T* () {return get();}
282
+ ConstPointer get () const {return ptr;}
155
283
 
156
- operator const T* () const {return get();}
284
+ ConstPointer operator -> () const {return get();}
157
285
 
158
- bool operator == (T* ptr) const {return this->ptr == ptr;}
286
+ ConstReference operator * () const {return *get();}
159
287
 
160
- bool operator != (T* ptr) const {return !operator==(ptr);}
288
+ operator ConstPointer () const {return get();}
161
289
 
162
- bool operator == (const T* ptr) const {return this->ptr == ptr;}
290
+ bool operator == (ConstPointer ptr) const {return this->ptr == ptr;}
163
291
 
164
- bool operator != (const T* ptr) const {return !operator==(ptr);}
292
+ bool operator != (ConstPointer ptr) const {return !operator==(ptr);}
165
293
 
166
294
  bool operator == (const This& obj) const {return ptr == obj.ptr;}
167
295
 
168
296
  bool operator != (const This& obj) const {return !operator==(obj);}
169
297
 
298
+ bool operator < (const This& obj) const {return ptr < obj.ptr;}
299
+
170
300
  operator bool () const {return ptr != NULL;}
171
301
 
172
302
  bool operator ! () const {return !operator bool();}
173
303
 
174
304
  private:
175
305
 
176
- T* ptr;
306
+ ConstPointer ptr;
177
307
 
178
308
  };// Ref
179
309