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,640 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ ca_obj_repeat.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
+ VALUE rb_cCARepeat;
16
+
17
+ /* rdoc:
18
+ class CARepeat < CAVirtual # :nodoc:
19
+ end
20
+ */
21
+
22
+ int
23
+ ca_repeat_setup (CARepeat *ca, CArray *parent, int8_t rank, int32_t *count)
24
+ {
25
+ int8_t data_type;
26
+ int32_t elements, bytes, nrpt, repeat_level, repeat_num,
27
+ contig_level, contig_num, data_rank;
28
+ int i, j;
29
+
30
+ nrpt = 1;
31
+ data_rank = 0;
32
+ for (i=0; i<rank; i++) {
33
+ if ( count[i] < 0 ) {
34
+ rb_raise(rb_eRuntimeError,
35
+ "negative size for %i-th dimension specified", i);
36
+ }
37
+
38
+ if ( count[i] ) {
39
+ nrpt *= count[i];
40
+ }
41
+ else {
42
+ data_rank += 1;
43
+ }
44
+ }
45
+
46
+ repeat_level = 0;
47
+ repeat_num = 1;
48
+ for (i=0; i<rank && count[i]; i++) {
49
+ repeat_level = i+1;
50
+ repeat_num *= count[i];
51
+ }
52
+
53
+ contig_level = rank-1;
54
+ contig_num = 1;
55
+ for (i=rank-1; i >= 0 && count[i]; i--) {
56
+ contig_level = i;
57
+ contig_num *= count[i];
58
+ }
59
+
60
+ if ( data_rank != parent->rank ) {
61
+ rb_raise(rb_eRuntimeError,
62
+ "mismatch in rank between original array and determined by # of dummies");
63
+ }
64
+
65
+ if ( ((double) parent->elements) * nrpt > CA_LENGTH_MAX ) {
66
+ rb_raise(rb_eRuntimeError, "too large byte length");
67
+ }
68
+
69
+ data_type = parent->data_type;
70
+ elements = parent->elements * nrpt;
71
+ bytes = parent->bytes;
72
+
73
+ ca->obj_type = CA_OBJ_REPEAT;
74
+ ca->data_type = data_type;
75
+ ca->flags = 0;
76
+ ca->rank = rank;
77
+ ca->bytes = bytes;
78
+ ca->elements = elements;
79
+ ca->ptr = NULL;
80
+ ca->mask = NULL;
81
+ ca->dim = ALLOC_N(int32_t, rank);
82
+
83
+ ca->parent = parent;
84
+ ca->attach = 0;
85
+ ca->nosync = 0;
86
+ ca->count = ALLOC_N(int32_t, rank);
87
+ ca->repeat_level = repeat_level;
88
+ ca->repeat_num = repeat_num;
89
+ ca->contig_level = contig_level;
90
+ ca->contig_num = contig_num;
91
+
92
+ j = 0;
93
+ for (i=0; i<rank; i++) {
94
+ if ( count[i] ) {
95
+ ca->dim[i] = count[i];
96
+ }
97
+ else {
98
+ ca->dim[i] = parent->dim[j++];
99
+ }
100
+ }
101
+
102
+ memcpy(ca->count, count, rank * sizeof(int32_t));
103
+
104
+ ca_set_flag(ca, CA_FLAG_READ_ONLY);
105
+
106
+ if ( ca_has_mask(parent) ) {
107
+ ca_create_mask(ca);
108
+ }
109
+
110
+ return 0;
111
+ }
112
+
113
+
114
+ CARepeat *
115
+ ca_repeat_new (CArray *parent, int8_t rank, int32_t *count)
116
+ {
117
+ CARepeat *ca = ALLOC(CARepeat);
118
+ ca_repeat_setup(ca, parent, rank, count);
119
+ return ca;
120
+ }
121
+
122
+ static void
123
+ free_ca_repeat (void *ap)
124
+ {
125
+ CARepeat *ca = (CARepeat *) ap;
126
+ if ( ca != NULL ) {
127
+ xfree(ca->count);
128
+ ca_free(ca->mask);
129
+ xfree(ca->dim);
130
+ xfree(ca);
131
+ }
132
+ }
133
+
134
+ static void ca_repeat_attach (CARepeat *cb);
135
+ static void ca_repeat_sync (CARepeat *cb);
136
+ static void ca_repeat_fill (CARepeat *ca, char *ptr);
137
+
138
+ /* ------------------------------------------------------------------- */
139
+
140
+ static void *
141
+ ca_repeat_func_clone (void *ap)
142
+ {
143
+ CARepeat *ca = (CARepeat *) ap;
144
+ return ca_repeat_new(ca->parent, ca->rank, ca->count);
145
+ }
146
+
147
+ static char *
148
+ ca_repeat_func_ptr_at_addr (void *ap, int32_t addr)
149
+ {
150
+ CARepeat *ca = (CARepeat *) ap;
151
+ if ( ca->ptr ) {
152
+ return ca->ptr + ca->bytes * addr;
153
+ }
154
+ else {
155
+ int32_t idx[CA_RANK_MAX];
156
+ ca_addr2index((CArray *)ca, addr, idx);
157
+ return ca_ptr_at_index(ca, idx);
158
+ }
159
+ }
160
+
161
+ static char *
162
+ ca_repeat_func_ptr_at_index (void *ap, int32_t *idx)
163
+ {
164
+ CARepeat *ca = (CARepeat *) ap;
165
+ if ( ca->ptr ) {
166
+ return ca_array_func_ptr_at_index(ca, idx);
167
+ }
168
+ else {
169
+ int32_t *count = ca->count;
170
+ int32_t *dim0 = ca->parent->dim;
171
+ int32_t n, i, j;
172
+
173
+ j = 0;
174
+ n = 0;
175
+ for (i=0; i<ca->rank; i++) {
176
+ if ( ! count[i] ) {
177
+ n = dim0[j]*n + idx[i];
178
+ j++;
179
+ }
180
+ }
181
+
182
+ if ( ca->parent->ptr ) {
183
+ return ca->parent->ptr + ca->bytes * n;
184
+ }
185
+ else {
186
+ return ca_ptr_at_addr(ca->parent, n);
187
+ }
188
+ }
189
+ }
190
+
191
+ static void
192
+ ca_repeat_func_fetch_index (void *ap, int32_t *idx, void *ptr)
193
+ {
194
+ CARepeat *ca = (CARepeat *) ap;
195
+ int32_t *count = ca->count;
196
+ int32_t idx0[CA_RANK_MAX];
197
+ int32_t n, i, j;
198
+ j = 0;
199
+ n = 0;
200
+ for (i=0; i<ca->rank; i++) {
201
+ if ( ! count[i] ) {
202
+ idx0[j++] = idx[i];
203
+ }
204
+ }
205
+ ca_fetch_index(ca->parent, idx0, ptr);
206
+ }
207
+
208
+ static void
209
+ ca_repeat_func_store_index (void *ap, int32_t *idx, void *ptr)
210
+ {
211
+ CARepeat *ca = (CARepeat *) ap;
212
+ int32_t *count = ca->count;
213
+ int32_t idx0[CA_RANK_MAX];
214
+ int32_t n, i, j;
215
+ j = 0;
216
+ n = 0;
217
+ for (i=0; i<ca->rank; i++) {
218
+ if ( ! count[i] ) {
219
+ idx0[j++] = idx[i];
220
+ }
221
+ }
222
+ ca_store_index(ca->parent, idx0, ptr);
223
+ }
224
+
225
+ static void
226
+ ca_repeat_func_allocate (void *ap)
227
+ {
228
+ CARepeat *ca = (CARepeat *) ap;
229
+ ca_attach(ca->parent);
230
+ /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
231
+ ca->ptr = malloc_with_check(ca_length(ca));
232
+ }
233
+
234
+ static void
235
+ ca_repeat_func_attach (void *ap)
236
+ {
237
+ CARepeat *ca = (CARepeat *) ap;
238
+ ca_attach(ca->parent);
239
+ /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
240
+ ca->ptr = malloc_with_check(ca_length(ca));
241
+ ca_repeat_attach(ca);
242
+ }
243
+
244
+ static void
245
+ ca_repeat_func_sync (void *ap)
246
+ {
247
+ CARepeat *ca = (CARepeat *) ap;
248
+ ca_repeat_sync(ca);
249
+ ca_sync(ca->parent);
250
+ }
251
+
252
+ static void
253
+ ca_repeat_func_detach (void *ap)
254
+ {
255
+ CARepeat *ca = (CARepeat *) ap;
256
+ free(ca->ptr);
257
+ ca->ptr = NULL;
258
+ ca_detach(ca->parent);
259
+ }
260
+
261
+ static void
262
+ ca_repeat_func_copy_data (void *ap, void *ptr)
263
+ {
264
+ CARepeat *ca = (CARepeat *) ap;
265
+ char *ptr0 = ca->ptr;
266
+ ca_attach(ca->parent);
267
+ ca->ptr = ptr;
268
+ ca_repeat_attach(ca);
269
+ ca->ptr = ptr0;
270
+ ca_detach(ca->parent);
271
+ }
272
+
273
+ static void
274
+ ca_repeat_func_sync_data (void *ap, void *ptr)
275
+ {
276
+ CARepeat *ca = (CARepeat *) ap;
277
+ char *ptr0 = ca->ptr;
278
+ ca_attach(ca->parent);
279
+ ca->ptr = ptr;
280
+ ca_repeat_sync(ca);
281
+ ca->ptr = ptr0;
282
+ ca_sync(ca->parent);
283
+ ca_detach(ca->parent);
284
+ }
285
+
286
+ static void
287
+ ca_repeat_func_fill_data (void *ap, void *ptr)
288
+ {
289
+ CARepeat *ca = (CARepeat *) ap;
290
+ ca_attach(ca->parent);
291
+ ca_repeat_fill(ca, ptr);
292
+ ca_sync(ca->parent);
293
+ ca_detach(ca->parent);
294
+ }
295
+
296
+ static void
297
+ ca_repeat_func_create_mask (void *ap)
298
+ {
299
+ CARepeat *ca = (CARepeat *) ap;
300
+ ca_update_mask(ca->parent);
301
+ if ( ! ca->parent->mask ) {
302
+ ca_create_mask(ca->parent);
303
+ }
304
+ ca->mask =
305
+ (CArray *) ca_repeat_new(ca->parent->mask, ca->rank, ca->count);
306
+ }
307
+
308
+ ca_operation_function_t ca_repeat_func = {
309
+ -1, /* CA_OBJ_REPEAT */
310
+ CA_VIRTUAL_ARRAY,
311
+ free_ca_repeat,
312
+ ca_repeat_func_clone,
313
+ ca_repeat_func_ptr_at_addr,
314
+ ca_repeat_func_ptr_at_index,
315
+ NULL,
316
+ ca_repeat_func_fetch_index,
317
+ NULL,
318
+ ca_repeat_func_store_index,
319
+ ca_repeat_func_allocate,
320
+ ca_repeat_func_attach,
321
+ ca_repeat_func_sync,
322
+ ca_repeat_func_detach,
323
+ ca_repeat_func_copy_data,
324
+ ca_repeat_func_sync_data,
325
+ ca_repeat_func_fill_data,
326
+ ca_repeat_func_create_mask,
327
+ };
328
+
329
+ /* ------------------------------------------------------------------- */
330
+
331
+ static void
332
+ memfill (void *dp, void *sp, size_t bytes, size_t n)
333
+ {
334
+ switch ( bytes ) {
335
+ case 1:
336
+ memset(dp, *(uint8_t*)sp, n);
337
+ break;
338
+ case 2: {
339
+ int16_t *p = (int16_t *) dp, *q = (int16_t *) sp;
340
+ while (n--) { *p++ = *q; }
341
+ break;
342
+ }
343
+ case 4: {
344
+ int32_t *p = (int32_t *) dp, *q = (int32_t *) sp;
345
+ while (n--) { *p++ = *q; }
346
+ break;
347
+ }
348
+ case 8: {
349
+ float64_t *p = (float64_t *) dp, *q = (float64_t *) sp;
350
+ while (n--) { *p++ = *q; }
351
+ break;
352
+ }
353
+ default: {
354
+ int32_t i;
355
+ char *p = (char *) dp, *q = (char *) sp;
356
+ for (i=0; i<n; i++) {
357
+ memcpy(p, q, bytes);
358
+ p+=bytes;
359
+ }
360
+ }
361
+ }
362
+ }
363
+
364
+ static void
365
+ ca_repeat_attach_loop1 (CARepeat *ca, int8_t level, int8_t level0,
366
+ int32_t *idx, int32_t *idx0)
367
+ {
368
+ int32_t *count = ca->count;
369
+ int32_t i;
370
+
371
+ if ( level == ca->contig_level ) {
372
+ if ( ca->contig_num == 1 ) {
373
+ for (i=0; i<ca->dim[level]; i++) {
374
+ idx[level] = i;
375
+ idx0[level0] = i;
376
+ memcpy(ca_ptr_at_index(ca, idx),
377
+ ca_ptr_at_index(ca->parent, idx0),
378
+ ca->bytes);
379
+ }
380
+ }
381
+ else {
382
+ char *dp, *sp;
383
+ dp = ca_ptr_at_index(ca, idx);
384
+ sp = ca_ptr_at_index(ca->parent, idx0);
385
+ memfill(dp, sp, ca->bytes, ca->contig_num);
386
+ }
387
+ }
388
+ else {
389
+ for (i=0; i<ca->dim[level]; i++) {
390
+ idx[level] = i;
391
+ if ( ! count[level] ) {
392
+ idx0[level0] = i;
393
+ ca_repeat_attach_loop1(ca, level+1, level0+1, idx, idx0);
394
+ }
395
+ else {
396
+ ca_repeat_attach_loop1(ca, level+1, level0, idx, idx0);
397
+ }
398
+ }
399
+ }
400
+ }
401
+
402
+ static void
403
+ ca_repeat_attach (CARepeat *ca)
404
+ {
405
+ int32_t idx[CA_RANK_MAX];
406
+ int32_t idx0[CA_RANK_MAX];
407
+ int32_t i;
408
+ char *dp, *sp;
409
+
410
+ for (i=0; i<ca->rank; i++) {
411
+ idx[i] = 0;
412
+ idx0[i] = 0;
413
+ }
414
+ ca_repeat_attach_loop1(ca, ca->repeat_level, 0, idx, idx0);
415
+
416
+ sp = ca_ptr_at_addr(ca, 0);
417
+ for (i=1; i<ca->repeat_num; i++) {
418
+ dp = sp + i * ca->bytes * (ca->elements / ca->repeat_num);
419
+ memcpy(dp, sp, ca->bytes * (ca->elements / ca->repeat_num));
420
+ }
421
+ }
422
+
423
+ static void
424
+ ca_repeat_sync_loop (CARepeat *ca, int8_t level, int8_t level0,
425
+ int32_t *idx, int32_t *idx0)
426
+ {
427
+ int32_t *count = ca->count;
428
+ int32_t i;
429
+
430
+ if ( level == ca->contig_level ) {
431
+ if ( ca->contig_num == 1 ) {
432
+ memcpy(ca_ptr_at_index(ca->parent, idx0), ca_ptr_at_index(ca, idx),
433
+ ca_length(ca->parent));
434
+ }
435
+ else {
436
+ memcpy(ca_ptr_at_index(ca->parent, idx0), ca_ptr_at_index(ca, idx), ca->bytes);
437
+ }
438
+ }
439
+ else {
440
+ for (i=0; i<ca->dim[level]; i++) {
441
+ idx[level] = i;
442
+ if ( ! count[level] ) {
443
+ idx0[level0] = i;
444
+ ca_repeat_sync_loop(ca, level+1, level0+1, idx, idx0);
445
+ }
446
+ else {
447
+ ca_repeat_sync_loop(ca, level+1, level0, idx, idx0);
448
+ }
449
+ }
450
+ }
451
+ }
452
+
453
+ static void
454
+ ca_repeat_sync (CARepeat *ca)
455
+ {
456
+ int32_t idx[CA_RANK_MAX];
457
+ int32_t idx0[CA_RANK_MAX];
458
+ int32_t i;
459
+ for (i=0; i<ca->rank; i++) {
460
+ idx[i] = 0;
461
+ idx0[i] = 0;
462
+ }
463
+ ca_repeat_sync_loop(ca, ca->repeat_level, 0, idx, idx0);
464
+ }
465
+
466
+ static void
467
+ ca_repeat_fill (CARepeat *ca, char *ptr)
468
+ {
469
+ ca_fill(ca->parent, ptr);
470
+ }
471
+
472
+ /* ------------------------------------------------------------------- */
473
+
474
+ VALUE
475
+ rb_ca_repeat_new (VALUE cary, int8_t rank, int32_t *count)
476
+ {
477
+ volatile VALUE obj;
478
+ CArray *parent;
479
+ CARepeat *ca;
480
+ rb_check_carray_object(cary);
481
+ Data_Get_Struct(cary, CArray, parent);
482
+ ca = ca_repeat_new(parent, rank, count);
483
+ obj = ca_wrap_struct(ca);
484
+ rb_ca_set_parent(obj, cary);
485
+ rb_ca_data_type_inherit(obj, cary);
486
+ return obj;
487
+ }
488
+
489
+ VALUE
490
+ rb_ca_repeat (int argc, VALUE *argv, VALUE self)
491
+ {
492
+ volatile VALUE obj;
493
+ CArray *ca;
494
+ int32_t count[CA_RANK_MAX];
495
+ int32_t repeat;
496
+ int32_t i;
497
+
498
+ Data_Get_Struct(self, CArray, ca);
499
+
500
+ if ( argc == 2 &&
501
+ (
502
+ ( argv[0] == ID2SYM(rb_intern("%")) && rb_obj_is_carray(argv[1]) ) ||
503
+ ( argv[1] == ID2SYM(rb_intern("%")) && rb_obj_is_carray(argv[0]) )
504
+ ) ) {
505
+ volatile VALUE args;
506
+ CArray *ct;
507
+ int32_t rank, dim[CA_RANK_MAX];
508
+ int k;
509
+ if ( argv[0] == ID2SYM(rb_intern("%") ) ) {
510
+ Data_Get_Struct(argv[1], CArray, ct);
511
+ }
512
+ else {
513
+ Data_Get_Struct(argv[0], CArray, ct);
514
+ }
515
+ if ( ct->rank < ca->rank ) {
516
+ rb_raise(rb_eRuntimeError, "invalid rank to template");
517
+ }
518
+ args = rb_ary_new();
519
+ rank = 0;
520
+ if ( argv[0] == ID2SYM(rb_intern("%") ) ) {
521
+ k = 0;
522
+ for (i=0; i<ct->rank; i++) {
523
+ if ( ca->dim[k] == 1 ) {
524
+ rb_ary_push(args, INT2NUM(ct->dim[i]));
525
+ k++;
526
+ }
527
+ else if ( ct->dim[i] == ca->dim[k] ) {
528
+ rb_ary_push(args, ID2SYM(rb_intern("%")));
529
+ dim[rank] = ca->dim[k];
530
+ k++; rank++;
531
+ }
532
+ else {
533
+ rb_ary_push(args, INT2NUM(ct->dim[i]));
534
+ }
535
+ }
536
+ if ( rank != ca->rank ) {
537
+ self = rb_ca_refer_new(self, ca->data_type, rank, dim, ca->bytes, 0);
538
+ }
539
+ }
540
+ else {
541
+ k = ca->rank - 1;
542
+ for (i=ct->rank-1; i>=0; i--) {
543
+ if ( ca->dim[k] == 1 ) {
544
+ rb_ary_unshift(args, INT2NUM(ct->dim[i]));
545
+ k--;
546
+ }
547
+ else if ( ct->dim[i] == ca->dim[k] ) {
548
+ rb_ary_unshift(args, ID2SYM(rb_intern("%")));
549
+ k--;
550
+ }
551
+ else {
552
+ rb_ary_unshift(args, INT2NUM(ct->dim[i]));
553
+ }
554
+ }
555
+ if ( k != 0 ) {
556
+ rank = 0;
557
+ for (i=0; i<ca->rank; i++) {
558
+ if ( ca->dim[i] != 1 ) {
559
+ dim[rank] = ca->dim[i];
560
+ rank++;
561
+ }
562
+ }
563
+ self = rb_ca_refer_new(self, ca->data_type, rank, dim, ca->bytes, 0);
564
+ }
565
+ }
566
+ return rb_ca_repeat(RARRAY_LEN(args), RARRAY_PTR(args), self);
567
+ }
568
+
569
+ repeat = 1;
570
+ for (i=0; i<argc; i++) {
571
+ if ( rb_obj_is_kind_of(argv[i], rb_cSymbol) ) {
572
+ if ( argv[i] == ID2SYM(rb_intern("%")) ) {
573
+ count[i] = 0;
574
+ }
575
+ else {
576
+ rb_raise(rb_eArgError, "unknown symbol (!= ':%%') in arguments");
577
+ }
578
+ }
579
+ else {
580
+ count[i] = NUM2INT(argv[i]);
581
+ if ( count[i] == 0 ) {
582
+ rb_raise(rb_eArgError,
583
+ "zero repeat count specified in creating CARepeat object");
584
+ }
585
+ repeat *= count[i];
586
+ }
587
+ }
588
+
589
+ if ( repeat == 1 ) {
590
+ int32_t dim[CA_RANK_MAX];
591
+ int j = 0;
592
+ for (i=0; i<argc; i++) {
593
+ if ( count[i] == 0 ) {
594
+ dim[i] = ca->dim[j];
595
+ j++;
596
+ }
597
+ else {
598
+ dim[i] = 1;
599
+ }
600
+ }
601
+ obj = rb_ca_refer_new(self, ca->data_type, argc, dim, ca->bytes, 0);
602
+ }
603
+ else {
604
+ obj = rb_ca_repeat_new(self, argc, count);
605
+ }
606
+
607
+ return obj;
608
+ }
609
+
610
+ static VALUE
611
+ rb_ca_repeat_s_allocate (VALUE klass)
612
+ {
613
+ CARepeat *ca;
614
+ return Data_Make_Struct(klass, CARepeat, ca_mark, ca_free, ca);
615
+ }
616
+
617
+ static VALUE
618
+ rb_ca_repeat_initialize_copy (VALUE self, VALUE other)
619
+ {
620
+ CARepeat *ca, *cs;
621
+
622
+ Data_Get_Struct(self, CARepeat, ca);
623
+ Data_Get_Struct(other, CARepeat, cs);
624
+
625
+ ca_repeat_setup(ca, cs->parent, cs->rank, cs->count);
626
+
627
+ return self;
628
+ }
629
+
630
+ void
631
+ Init_ca_obj_repeat ()
632
+ {
633
+ /* rb_cCARepeat, CA_OBJ_REPEAT are defined in rb_carray.c */
634
+
635
+ rb_define_const(rb_cObject, "CA_OBJ_REPEAT", INT2NUM(CA_OBJ_REPEAT));
636
+
637
+ rb_define_alloc_func(rb_cCARepeat, rb_ca_repeat_s_allocate);
638
+ rb_define_method(rb_cCARepeat, "initialize_copy",
639
+ rb_ca_repeat_initialize_copy, 1);
640
+ }