carray 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. checksums.yaml +4 -4
  2. data/COPYING +56 -0
  3. data/GPL +340 -0
  4. data/Gemfile +9 -0
  5. data/Gemfile.lock +33 -0
  6. data/LEGAL +50 -0
  7. data/NOTE +73 -0
  8. data/Rakefile +20 -0
  9. data/TODO +5 -0
  10. data/ca_iter_block.c +242 -0
  11. data/ca_iter_dimension.c +287 -0
  12. data/ca_iter_window.c +202 -0
  13. data/ca_obj_array.c +1189 -0
  14. data/ca_obj_bitarray.c +523 -0
  15. data/ca_obj_bitfield.c +636 -0
  16. data/ca_obj_block.c +885 -0
  17. data/ca_obj_fake.c +405 -0
  18. data/ca_obj_farray.c +482 -0
  19. data/ca_obj_field.c +625 -0
  20. data/ca_obj_grid.c +738 -0
  21. data/ca_obj_mapping.c +614 -0
  22. data/ca_obj_object.c +777 -0
  23. data/ca_obj_reduce.c +299 -0
  24. data/ca_obj_refer.c +627 -0
  25. data/ca_obj_repeat.c +640 -0
  26. data/ca_obj_select.c +558 -0
  27. data/ca_obj_shift.c +952 -0
  28. data/ca_obj_transpose.c +582 -0
  29. data/ca_obj_unbound_repeat.c +557 -0
  30. data/ca_obj_window.c +1023 -0
  31. data/carray.h +1381 -0
  32. data/carray_access.c +1798 -0
  33. data/carray_attribute.c +903 -0
  34. data/carray_call_cfunc.c +1107 -0
  35. data/carray_cast.c +1155 -0
  36. data/carray_cast_func.rb +498 -0
  37. data/carray_class.c +132 -0
  38. data/carray_conversion.c +518 -0
  39. data/carray_copy.c +453 -0
  40. data/carray_core.c +1307 -0
  41. data/carray_element.c +572 -0
  42. data/carray_generate.c +681 -0
  43. data/carray_iterator.c +630 -0
  44. data/carray_loop.c +462 -0
  45. data/carray_mask.c +1174 -0
  46. data/carray_math.rb +834 -0
  47. data/carray_numeric.c +257 -0
  48. data/carray_operator.c +582 -0
  49. data/carray_order.c +1040 -0
  50. data/carray_random.c +529 -0
  51. data/carray_sort_addr.c +261 -0
  52. data/carray_stat.c +2102 -0
  53. data/carray_stat_proc.rb +1990 -0
  54. data/carray_test.c +602 -0
  55. data/carray_undef.c +69 -0
  56. data/carray_utils.c +740 -0
  57. data/ext/calculus/carray_calculus.c +792 -0
  58. data/ext/calculus/carray_interp.c +355 -0
  59. data/ext/calculus/extconf.rb +12 -0
  60. data/ext/calculus/lib/autoload/autoload_math_calculus.rb +2 -0
  61. data/ext/calculus/lib/math/calculus.rb +119 -0
  62. data/ext/calculus/lib/math/interp/adapter_interp1d.rb +31 -0
  63. data/ext/dataframe/API.txt +11 -0
  64. data/ext/dataframe/extconf.rb +3 -0
  65. data/ext/dataframe/lib/carray/autoload/autoload_dataframe_dataframe.rb +14 -0
  66. data/ext/dataframe/lib/carray/dataframe/dataframe.rb +1104 -0
  67. data/ext/dataframe/sample/test_uniq_sort.rb +5 -0
  68. data/ext/fortio/extconf.rb +3 -0
  69. data/ext/fortio/lib/carray/autoload/autoload_fortran_format.rb +5 -0
  70. data/ext/fortio/lib/carray/io/fortran_format.rb +43 -0
  71. data/ext/fortio/lib/fortio.rb +3 -0
  72. data/ext/fortio/lib/fortio/fortran_format.rb +603 -0
  73. data/ext/fortio/lib/fortio/fortran_format.tab.rb +536 -0
  74. data/ext/fortio/lib/fortio/fortran_format.y +215 -0
  75. data/ext/fortio/lib/fortio/fortran_namelist.rb +151 -0
  76. data/ext/fortio/lib/fortio/fortran_namelist.tab.rb +470 -0
  77. data/ext/fortio/lib/fortio/fortran_namelist.y +213 -0
  78. data/ext/fortio/lib/fortio/fortran_sequential.rb +345 -0
  79. data/ext/fortio/ruby_fortio.c +182 -0
  80. data/ext/fortio/test/test_H.rb +5 -0
  81. data/ext/fortio/test/test_T.rb +7 -0
  82. data/ext/fortio/test/test_fortran_format.rb +86 -0
  83. data/ext/fortio/test/test_namelist.rb +25 -0
  84. data/ext/fortio/test/test_sequential.rb +13 -0
  85. data/ext/fortio/test/test_sequential2.rb +13 -0
  86. data/ext/fortio/work/test.rb +10 -0
  87. data/ext/fortio/work/test_e.rb +19 -0
  88. data/ext/fortio/work/test_ep.rb +10 -0
  89. data/ext/fortio/work/test_parse.rb +12 -0
  90. data/ext/imagemap/carray_imagemap.c +495 -0
  91. data/ext/imagemap/doc/call_graph.dot +28 -0
  92. data/ext/imagemap/draw.c +567 -0
  93. data/ext/imagemap/extconf.rb +13 -0
  94. data/ext/imagemap/lib/autoload/autoload_graphics_imagemap.rb +1 -0
  95. data/ext/imagemap/lib/graphics/imagemap.rb +273 -0
  96. data/ext/imagemap/lib/image_map.rb +4 -0
  97. data/ext/imagemap/test/swath_index.rb +83 -0
  98. data/ext/imagemap/test/swath_warp.rb +99 -0
  99. data/ext/imagemap/test/test.rb +23 -0
  100. data/ext/imagemap/test/test_image.rb +42 -0
  101. data/ext/imagemap/test/test_line.rb +14 -0
  102. data/ext/imagemap/test/test_rotate.rb +17 -0
  103. data/ext/imagemap/test/test_triangle.rb +20 -0
  104. data/ext/imagemap/test/test_warp.rb +26 -0
  105. data/ext/mathfunc/carray_mathfunc.c +321 -0
  106. data/ext/mathfunc/extconf.rb +18 -0
  107. data/ext/mathfunc/lib/autoload/autoload_math_mathfunc.rb +1 -0
  108. data/ext/mathfunc/lib/math/mathfunc.rb +15 -0
  109. data/ext/mathfunc/test/test_hypot.rb +5 -0
  110. data/ext/mathfunc/test/test_j0.rb +22 -0
  111. data/ext/mathfunc/test/test_jn.rb +8 -0
  112. data/ext/mathfunc/test/test_sph.rb +9 -0
  113. data/ext/narray/README +22 -0
  114. data/ext/narray/ca_wrap_narray.c +491 -0
  115. data/ext/narray/carray_narray.c +21 -0
  116. data/ext/narray/extconf.rb +57 -0
  117. data/ext/narray/lib/autoload/autoload_math_narray.rb +1 -0
  118. data/ext/narray/lib/autoload/autoload_math_narray_miss.rb +11 -0
  119. data/ext/narray/lib/math/narray.rb +17 -0
  120. data/ext/narray/lib/math/narray_miss.rb +45 -0
  121. data/extconf.rb +3 -25
  122. data/lib/carray.rb +28 -0
  123. data/lib/carray/autoload/autoload_base.rb +23 -0
  124. data/lib/carray/autoload/autoload_graphics_gnuplot.rb +2 -0
  125. data/lib/carray/autoload/autoload_io_csv.rb +14 -0
  126. data/lib/carray/autoload/autoload_io_excel.rb +5 -0
  127. data/lib/carray/autoload/autoload_io_imagemagick.rb +6 -0
  128. data/lib/carray/autoload/autoload_io_pg.rb +6 -0
  129. data/lib/carray/autoload/autoload_io_sqlite3.rb +12 -0
  130. data/lib/carray/autoload/autoload_io_table.rb +1 -0
  131. data/lib/carray/autoload/autoload_math_histogram.rb +5 -0
  132. data/lib/carray/autoload/autoload_math_interp.rb +4 -0
  133. data/lib/carray/autoload/autoload_math_recurrence.rb +6 -0
  134. data/lib/carray/autoload/autoload_object_iterator.rb +1 -0
  135. data/lib/carray/autoload/autoload_object_link.rb +1 -0
  136. data/lib/carray/autoload/autoload_object_pack.rb +2 -0
  137. data/lib/carray/base/autoload.rb +94 -0
  138. data/lib/carray/base/basic.rb +1051 -0
  139. data/lib/carray/base/inspect.rb +252 -0
  140. data/lib/carray/base/iterator.rb +367 -0
  141. data/lib/carray/base/math.rb +403 -0
  142. data/lib/carray/base/obsolete.rb +93 -0
  143. data/lib/carray/base/serialize.rb +260 -0
  144. data/lib/carray/base/struct.rb +634 -0
  145. data/lib/carray/graphics/gnuplot.rb +2116 -0
  146. data/lib/carray/info.rb +112 -0
  147. data/lib/carray/io/csv.rb +560 -0
  148. data/lib/carray/io/excel.rb +26 -0
  149. data/lib/carray/io/imagemagick.rb +231 -0
  150. data/lib/carray/io/pg.rb +101 -0
  151. data/lib/carray/io/sqlite3.rb +202 -0
  152. data/lib/carray/io/table.rb +77 -0
  153. data/lib/carray/math/histogram.rb +179 -0
  154. data/lib/carray/math/interp.rb +57 -0
  155. data/lib/carray/math/interp/adapter_gsl_spline.rb +47 -0
  156. data/lib/carray/math/recurrence.rb +95 -0
  157. data/lib/carray/mkmf.rb +145 -0
  158. data/lib/carray/object/ca_obj_iterator.rb +52 -0
  159. data/lib/carray/object/ca_obj_link.rb +52 -0
  160. data/lib/carray/object/ca_obj_pack.rb +101 -0
  161. data/mkmath.rb +731 -0
  162. data/mt19937ar.c +182 -0
  163. data/mt19937ar.h +86 -0
  164. data/rdoc_main.rb +27 -0
  165. data/rdoc_math.rb +5 -0
  166. data/rdoc_stat.rb +31 -0
  167. data/ruby_carray.c +242 -0
  168. data/ruby_ccomplex.c +497 -0
  169. data/ruby_float_func.c +83 -0
  170. data/spec/CABlockIterator/CABlockIterator_spec.rb +113 -0
  171. data/spec/CArray/bug/store_spec.rb +27 -0
  172. data/spec/CArray/index/repeat_spec.rb +10 -0
  173. data/spec/CArray/method/eq_spec.rb +80 -0
  174. data/spec/CArray/method/is_nan_spec.rb +12 -0
  175. data/spec/CArray/method/ne_spec.rb +18 -0
  176. data/spec/CArray/method/round_spec.rb +11 -0
  177. data/spec/CArray/object/_attribute_spec.rb +32 -0
  178. data/spec/CArray/object/s_new_spec.rb +31 -0
  179. data/spec/CArray/serialize/Serialization_spec.rb +89 -0
  180. data/spec/spec_all.rb +11 -0
  181. data/test/test_ALL.rb +50 -0
  182. data/test/test_CABitfield.rb +59 -0
  183. data/test/test_CABlock.rb +208 -0
  184. data/test/test_CAField.rb +40 -0
  185. data/test/test_CAGrid.rb +76 -0
  186. data/test/test_CAMapping.rb +106 -0
  187. data/test/test_CAMmap.rb +11 -0
  188. data/test/test_CARefer.rb +94 -0
  189. data/test/test_CARepeat.rb +66 -0
  190. data/test/test_CASelect.rb +23 -0
  191. data/test/test_CAShift.rb +17 -0
  192. data/test/test_CATranspose.rb +61 -0
  193. data/test/test_CAVirtual.rb +214 -0
  194. data/test/test_CAWindow.rb +55 -0
  195. data/test/test_CAWrap.rb +9 -0
  196. data/test/test_CArray.rb +228 -0
  197. data/test/test_CComplex.rb +83 -0
  198. data/test/test_CScalar.rb +91 -0
  199. data/test/test_attribute.rb +281 -0
  200. data/test/test_block_iterator.rb +17 -0
  201. data/test/test_boolean.rb +99 -0
  202. data/test/test_cast.rb +33 -0
  203. data/test/test_class.rb +85 -0
  204. data/test/test_complex.rb +43 -0
  205. data/test/test_composite.rb +125 -0
  206. data/test/test_convert.rb +79 -0
  207. data/test/test_copy.rb +141 -0
  208. data/test/test_creation.rb +85 -0
  209. data/test/test_element.rb +146 -0
  210. data/test/test_extream.rb +55 -0
  211. data/test/test_generate.rb +75 -0
  212. data/test/test_index.rb +71 -0
  213. data/test/test_mask.rb +578 -0
  214. data/test/test_math.rb +98 -0
  215. data/test/test_narray.rb +64 -0
  216. data/test/test_order.rb +147 -0
  217. data/test/test_random.rb +15 -0
  218. data/test/test_ref_store.rb +211 -0
  219. data/test/test_stat.rb +414 -0
  220. data/test/test_struct.rb +72 -0
  221. data/test/test_virtual.rb +49 -0
  222. data/utils/ca_ase.rb +21 -0
  223. data/utils/ca_methods.rb +15 -0
  224. data/utils/cast_checker.rb +30 -0
  225. data/utils/create_rdoc.sh +9 -0
  226. data/utils/diff_method.rb +52 -0
  227. data/utils/extract_rdoc.rb +27 -0
  228. data/utils/make_tgz.sh +3 -0
  229. data/utils/remove_resource_fork.sh +5 -0
  230. data/version.h +3 -3
  231. metadata +266 -1
@@ -0,0 +1,523 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ ca_obj_bitarray.c
4
+
5
+ This file is part of Ruby/CArray extension library.
6
+ You can redistribute it and/or modify it under the terms of
7
+ the Ruby Licence.
8
+
9
+ Copyright (C) 2005 Hiroki Motoyoshi
10
+
11
+ ---------------------------------------------------------------------------- */
12
+
13
+ #include "carray.h"
14
+
15
+ typedef struct {
16
+ int16_t obj_type;
17
+ int8_t data_type;
18
+ int8_t rank;
19
+ int32_t flags;
20
+ int32_t bytes;
21
+ int32_t elements;
22
+ int32_t *dim;
23
+ char *ptr;
24
+ CArray *mask;
25
+ CArray *parent;
26
+ uint32_t attach;
27
+ uint8_t nosync;
28
+ /* -------------*/
29
+ int32_t bytelen;
30
+ int32_t bitlen;
31
+ } CABitarray;
32
+
33
+ static int8_t CA_OBJ_BITARRAY;
34
+
35
+ static VALUE rb_cCABitarray;
36
+
37
+ /* rdoc:
38
+ class CABitArray < CAVirtual # :nodoc:
39
+ end
40
+ */
41
+
42
+ static uint8_t bits[8] = {
43
+ 1,
44
+ 2,
45
+ 4,
46
+ 8,
47
+ 16,
48
+ 32,
49
+ 64,
50
+ 128
51
+ };
52
+
53
+ /* ------------------------------------------------------------------- */
54
+
55
+ int
56
+ ca_bitarray_setup (CABitarray *ca, CArray *parent)
57
+ {
58
+ int8_t rank;
59
+ int32_t bitlen, elements;
60
+
61
+ /* check arguments */
62
+
63
+ if ( ca_is_complex_type(parent) || ( ca_is_object_type(parent) ) ) {
64
+ rb_raise(rb_eCADataTypeError, "invalid data_type for bitarray");
65
+ }
66
+
67
+ rank = parent->rank + 1;
68
+ bitlen = 8 * parent->bytes;
69
+ elements = bitlen * parent->elements;
70
+
71
+ ca->obj_type = CA_OBJ_BITARRAY;
72
+ ca->data_type = CA_BOOLEAN;
73
+ ca->flags = 0;
74
+ ca->rank = rank;
75
+ ca->bytes = 1;
76
+ ca->elements = elements;
77
+ ca->ptr = NULL;
78
+ ca->mask = NULL;
79
+ ca->dim = ALLOC_N(int32_t, rank);
80
+
81
+ ca->parent = parent;
82
+ ca->attach = 0;
83
+ ca->nosync = 0;
84
+
85
+ ca->bytelen = parent->bytes;
86
+ ca->bitlen = bitlen;
87
+
88
+ memcpy(ca->dim, parent->dim, (rank-1) * sizeof(int32_t));
89
+ ca->dim[rank-1] = bitlen;
90
+
91
+ if ( ca_has_mask(parent) ) {
92
+ ca_create_mask(ca);
93
+ }
94
+
95
+ return 0;
96
+ }
97
+
98
+ CABitarray *
99
+ ca_bitarray_new (CArray *parent)
100
+ {
101
+ CABitarray *ca = ALLOC(CABitarray);
102
+ ca_bitarray_setup(ca, parent);
103
+ return ca;
104
+ }
105
+
106
+ static void
107
+ free_ca_bitarray (void *ap)
108
+ {
109
+ CABitarray *ca = (CABitarray *) ap;
110
+ if ( ca != NULL ) {
111
+ ca_free(ca->mask);
112
+ xfree(ca->dim);
113
+ xfree(ca);
114
+ }
115
+ }
116
+
117
+ static void ca_bitarray_attach (CABitarray *ca);
118
+ static void ca_bitarray_sync (CABitarray *ca);
119
+ static void ca_bitarray_fill (CABitarray *ca, char *ptr);
120
+
121
+ /* ------------------------------------------------------------------- */
122
+
123
+ static void *
124
+ ca_bitarray_func_clone (void *ap)
125
+ {
126
+ CABitarray *ca = (CABitarray *) ap;
127
+ return ca_bitarray_new(ca->parent);
128
+ }
129
+
130
+ static char *
131
+ ca_bitarray_func_ptr_at_addr (void *ap, int32_t addr)
132
+ {
133
+ CABitarray *ca = (CABitarray *) ap;
134
+ if ( ! ca->ptr ) {
135
+ rb_raise(rb_eRuntimeError, "[BUG] ");
136
+ return NULL;
137
+ }
138
+ else {
139
+ return ca->ptr + ca->bytes * addr;
140
+ }
141
+ }
142
+
143
+ static char *
144
+ ca_bitarray_func_ptr_at_index (void *ap, int32_t *idx)
145
+ {
146
+ CABitarray *ca = (CABitarray *) ap;
147
+ if ( ! ca->ptr ) {
148
+ rb_raise(rb_eRuntimeError, "[BUG]");
149
+ return NULL;
150
+ }
151
+ else {
152
+ return ca_func[CA_OBJ_ARRAY].ptr_at_index(ca, idx);
153
+ }
154
+ }
155
+
156
+ static void
157
+ ca_bitarray_func_fetch_index (void *ap, int32_t *idx, void *ptr)
158
+ {
159
+ CABitarray *ca = (CABitarray *) ap;
160
+ int32_t bytes = ca->parent->bytes;
161
+ int32_t offset = idx[ca->rank-1];
162
+ int32_t major, minor;
163
+
164
+ if ( ca_endian == CA_BIG_ENDIAN &&
165
+ ca->parent->bytes != 1 &&
166
+ ( ! ca_is_fixlen_type(ca->parent) ) ) {
167
+ major = bytes - 1 - offset / 8;
168
+ }
169
+ else {
170
+ major = offset / 8;
171
+ }
172
+
173
+ minor = offset % 8;
174
+
175
+ if ( ca->parent->bytes <= 32 ) {
176
+ uint8_t v[32];
177
+ ca_fetch_index(ca->parent, idx, v);
178
+ *(char*) ptr = ( ( v[major] & bits[minor] ) != 0 );
179
+ }
180
+ else {
181
+ uint8_t *v = malloc_with_check(ca->parent->bytes);
182
+ ca_fetch_index(ca->parent, idx, v);
183
+ *(char*) ptr = ( ( v[major] & bits[minor] ) != 0 );
184
+ free(v);
185
+ }
186
+ }
187
+
188
+ static void
189
+ ca_bitarray_func_store_index (void *ap, int32_t *idx, void *ptr)
190
+ {
191
+ CABitarray *ca = (CABitarray *) ap;
192
+ uint8_t test = *(uint8_t *) ptr;
193
+ int32_t offset = idx[ca->rank-1];
194
+ int32_t bytes = ca->parent->bytes;
195
+ int32_t major, minor;
196
+
197
+ if ( ca_endian == CA_BIG_ENDIAN &&
198
+ ca->parent->bytes != 1 &&
199
+ ( ! ca_is_fixlen_type(ca->parent) ) ) {
200
+ major = bytes - 1 - offset / 8;
201
+ }
202
+ else {
203
+ major = offset / 8;
204
+ }
205
+
206
+ minor = offset % 8;
207
+
208
+ if ( ca->parent->bytes <= 32 ) {
209
+ uint8_t v[32];
210
+ ca_fetch_index(ca->parent, idx, v);
211
+ if ( test ) {
212
+ v[major] = ( v[major] & ~bits[minor] ) | bits[minor];
213
+ }
214
+ else {
215
+ v[major] = ( v[major] & ~bits[minor] );
216
+ }
217
+ ca_store_index(ca->parent, idx, v);
218
+ }
219
+ else {
220
+ char *v = malloc_with_check(ca->parent->bytes);
221
+ ca_fetch_index(ca->parent, idx, v);
222
+ if ( test ) {
223
+ v[major] = ( v[major] & ~bits[minor] ) | bits[minor];
224
+ }
225
+ else {
226
+ v[major] = ( v[major] & ~bits[minor] );
227
+ }
228
+ ca_store_index(ca->parent, idx, v);
229
+ free(v);
230
+ }
231
+ }
232
+
233
+ static void
234
+ ca_bitarray_func_allocate (void *ap)
235
+ {
236
+ CABitarray *ca = (CABitarray *) ap;
237
+ ca_attach(ca->parent);
238
+ /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
239
+ ca->ptr = malloc_with_check(ca_length(ca));
240
+ }
241
+
242
+ static void
243
+ ca_bitarray_func_attach (void *ap)
244
+ {
245
+ void ca_bitarray_attach (CABitarray *cb);
246
+
247
+ CABitarray *ca = (CABitarray *) ap;
248
+ ca_attach(ca->parent);
249
+ /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
250
+ ca->ptr = malloc_with_check(ca_length(ca));
251
+ ca_bitarray_attach(ca);
252
+ }
253
+
254
+ static void
255
+ ca_bitarray_func_sync (void *ap)
256
+ {
257
+ CABitarray *ca = (CABitarray *) ap;
258
+ ca_bitarray_sync(ca);
259
+ ca_sync(ca->parent);
260
+ }
261
+
262
+ static void
263
+ ca_bitarray_func_detach (void *ap)
264
+ {
265
+ CABitarray *ca = (CABitarray *) ap;
266
+ free(ca->ptr);
267
+ ca->ptr = NULL;
268
+ ca_detach(ca->parent);
269
+ }
270
+
271
+ static void
272
+ ca_bitarray_func_copy_data (void *ap, void *ptr)
273
+ {
274
+ CABitarray *ca = (CABitarray *) ap;
275
+ char *ptr0 = ca->ptr;
276
+ ca_attach(ca->parent);
277
+ ca->ptr = ptr;
278
+ ca_bitarray_attach(ca);
279
+ ca->ptr = ptr0;
280
+ ca_detach(ca->parent);
281
+ }
282
+
283
+ static void
284
+ ca_bitarray_func_sync_data (void *ap, void *ptr)
285
+ {
286
+ CABitarray *ca = (CABitarray *) ap;
287
+ char *ptr0 = ca->ptr;
288
+ ca_attach(ca->parent);
289
+ ca->ptr = ptr;
290
+ ca_bitarray_sync(ca);
291
+ ca->ptr = ptr0;
292
+ ca_sync(ca->parent);
293
+ ca_detach(ca->parent);
294
+ }
295
+
296
+ static void
297
+ ca_bitarray_func_fill_data (void *ap, void *ptr)
298
+ {
299
+ CABitarray *ca = (CABitarray *) ap;
300
+ ca_attach(ca->parent);
301
+ ca_bitarray_fill(ca, ptr);
302
+ ca_sync(ca->parent);
303
+ ca_detach(ca->parent);
304
+ }
305
+
306
+ static void
307
+ ca_bitarray_func_create_mask (void *ap)
308
+ {
309
+ CABitarray *ca = (CABitarray *) ap;
310
+ int32_t count[CA_RANK_MAX];
311
+ int32_t i;
312
+
313
+ for (i=0; i<ca->rank-1; i++) {
314
+ count[i] = 0;
315
+ }
316
+ count[ca->rank-1] = ca->bitlen;
317
+
318
+ ca_update_mask(ca->parent);
319
+ if ( ! ca->parent->mask ) {
320
+ ca_create_mask(ca->parent);
321
+ }
322
+ ca->mask = (CArray *) ca_repeat_new(ca->parent->mask, ca->rank, count);
323
+
324
+ ca_unset_flag(ca->mask, CA_FLAG_READ_ONLY);
325
+ }
326
+
327
+ ca_operation_function_t ca_bitarray_func = {
328
+ -1, /* CA_OBJ_BITARRAY */
329
+ CA_VIRTUAL_ARRAY,
330
+ free_ca_bitarray,
331
+ ca_bitarray_func_clone,
332
+ ca_bitarray_func_ptr_at_addr,
333
+ ca_bitarray_func_ptr_at_index,
334
+ NULL,
335
+ ca_bitarray_func_fetch_index,
336
+ NULL,
337
+ ca_bitarray_func_store_index,
338
+ ca_bitarray_func_allocate,
339
+ ca_bitarray_func_attach,
340
+ ca_bitarray_func_sync,
341
+ ca_bitarray_func_detach,
342
+ ca_bitarray_func_copy_data,
343
+ ca_bitarray_func_sync_data,
344
+ ca_bitarray_func_fill_data,
345
+ ca_bitarray_func_create_mask,
346
+ };
347
+
348
+ /* ------------------------------------------------------------------- */
349
+
350
+ static void
351
+ ca_bitarray_attach (CABitarray *ca)
352
+ {
353
+ boolean8_t *p = (boolean8_t *)ca_ptr_at_addr(ca, 0);
354
+ uint8_t *q = (uint8_t *)ca_ptr_at_addr(ca->parent, 0);
355
+ uint8_t *r;
356
+ uint8_t rr;
357
+ int32_t elements = ca->parent->elements;
358
+ int32_t bytes = ca->parent->bytes;
359
+ int32_t n, m;
360
+ if ( ca_endian == CA_BIG_ENDIAN &&
361
+ ca->parent->bytes != 1 &&
362
+ ( ! ca_is_fixlen_type(ca->parent) ) ) {
363
+ n = elements;
364
+ while ( n-- ) {
365
+ m = bytes;
366
+ r = q + bytes - 1;
367
+ while ( m-- ) {
368
+ rr = *r;
369
+ *p++ = (rr & 1);
370
+ *p++ = (rr & 2) >> 1;
371
+ *p++ = (rr & 4) >> 2;
372
+ *p++ = (rr & 8) >> 3;
373
+ *p++ = (rr & 16) >> 4;
374
+ *p++ = (rr & 32) >> 5;
375
+ *p++ = (rr & 64) >> 6;
376
+ *p++ = (rr & 128) >> 7;
377
+ r--;
378
+ }
379
+ q += bytes;
380
+ }
381
+ }
382
+ else {
383
+ n = elements * bytes;
384
+ while ( n-- ) {
385
+ rr = *q++;
386
+ *p++ = (rr & 1);
387
+ *p++ = (rr & 2) >> 1;
388
+ *p++ = (rr & 4) >> 2;
389
+ *p++ = (rr & 8) >> 3;
390
+ *p++ = (rr & 16) >> 4;
391
+ *p++ = (rr & 32) >> 5;
392
+ *p++ = (rr & 64) >> 6;
393
+ *p++ = (rr & 128) >> 7;
394
+ }
395
+ }
396
+ }
397
+
398
+ static void
399
+ ca_bitarray_sync (CABitarray *ca)
400
+ {
401
+ boolean8_t *p = (boolean8_t *)ca_ptr_at_addr(ca, 0);
402
+ uint8_t *q = (uint8_t *)ca_ptr_at_addr(ca->parent, 0);
403
+ uint8_t *r;
404
+ int32_t elements = ca->parent->elements;
405
+ int32_t bytes = ca->parent->bytes;
406
+ int32_t n, m, i;
407
+ if ( ca_endian == CA_BIG_ENDIAN &&
408
+ ca->parent->bytes != 1 &&
409
+ ( ! ca_is_fixlen_type(ca->parent) ) ) {
410
+ n = elements;
411
+ while ( n-- ) {
412
+ m = bytes;
413
+ r = q + bytes - 1;
414
+ while ( m-- ) {
415
+ *r = 0;
416
+ for (i=0; i<8; i++) {
417
+ *r += (*p) * bits[i];
418
+ p++;
419
+ }
420
+ r--;
421
+ }
422
+ q += bytes;
423
+ }
424
+ }
425
+ else {
426
+ n = elements * bytes;
427
+ while ( n-- ) {
428
+ *q = 0;
429
+ for (i=0; i<8; i++) {
430
+ *q += (*p) * bits[i];
431
+ p++;
432
+ }
433
+ q++;
434
+ }
435
+ }
436
+ }
437
+
438
+ static void
439
+ ca_bitarray_fill (CABitarray *ca, char *ptr)
440
+ {
441
+ uint8_t *q = (uint8_t *)ca_ptr_at_addr(ca->parent, 0);
442
+ uint8_t val = *(uint8_t *)ptr;
443
+ if ( val ) {
444
+ memset(q, 255, ca_length(ca->parent));
445
+ }
446
+ else {
447
+ memset(q, 0, ca_length(ca->parent));
448
+ }
449
+ }
450
+
451
+ /* ------------------------------------------------------------------- */
452
+
453
+ VALUE
454
+ rb_ca_bitarray_new (VALUE cary)
455
+ {
456
+ volatile VALUE obj;
457
+ CArray *parent;
458
+ CABitarray *ca;
459
+ rb_check_carray_object(cary);
460
+ Data_Get_Struct(cary, CArray, parent);
461
+ ca = ca_bitarray_new(parent);
462
+ obj = ca_wrap_struct(ca);
463
+ rb_ca_set_parent(obj, cary);
464
+ return obj;
465
+ }
466
+
467
+ /* rdoc:
468
+ class CArray
469
+ def bits
470
+ end
471
+ alias bitarray bits
472
+ end
473
+ */
474
+
475
+ VALUE
476
+ rb_ca_bitarray (VALUE self)
477
+ {
478
+ volatile VALUE obj;
479
+ CArray *ca;
480
+
481
+ Data_Get_Struct(self, CArray, ca);
482
+
483
+ obj = rb_ca_bitarray_new(self);
484
+
485
+ return obj;
486
+ }
487
+
488
+ static VALUE
489
+ rb_ca_bitarray_s_allocate (VALUE klass)
490
+ {
491
+ CABitarray *ca;
492
+ return Data_Make_Struct(klass, CABitarray, ca_mark, ca_free, ca);
493
+ }
494
+
495
+ static VALUE
496
+ rb_ca_bitarray_initialize_copy (VALUE self, VALUE other)
497
+ {
498
+ CABitarray *ca, *cs;
499
+
500
+ Data_Get_Struct(self, CABitarray, ca);
501
+ Data_Get_Struct(other, CABitarray, cs);
502
+
503
+ ca_bitarray_setup(ca, cs->parent);
504
+
505
+ return self;
506
+ }
507
+
508
+ void
509
+ Init_ca_obj_bitarray ()
510
+ {
511
+ rb_cCABitarray = rb_define_class("CABitarray", rb_cCAVirtual);
512
+
513
+ CA_OBJ_BITARRAY = ca_install_obj_type(rb_cCABitarray, ca_bitarray_func);
514
+ rb_define_const(rb_cObject, "CA_OBJ_BITARRAY", INT2NUM(CA_OBJ_BITARRAY));
515
+
516
+ rb_define_method(rb_cCArray, "bits", rb_ca_bitarray, 0);
517
+ rb_define_method(rb_cCArray, "bitarray", rb_ca_bitarray, 0);
518
+
519
+ rb_define_alloc_func(rb_cCABitarray, rb_ca_bitarray_s_allocate);
520
+ rb_define_method(rb_cCABitarray, "initialize_copy",
521
+ rb_ca_bitarray_initialize_copy, 1);
522
+ }
523
+