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,498 @@
1
+ # ----------------------------------------------------------------------------
2
+ #
3
+ # carray_cast_func.rb
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
+
14
+ data_type = []
15
+ %w[
16
+ CA_FIXLEN
17
+ CA_BOOLEAN
18
+ CA_INT8
19
+ CA_UINT8
20
+ CA_INT16
21
+ CA_UINT16
22
+ CA_INT32
23
+ CA_UINT32
24
+ CA_INT64
25
+ CA_UINT64
26
+ CA_FLOAT32
27
+ CA_FLOAT64
28
+ CA_FLOAT128
29
+ CA_CMPLX64
30
+ CA_CMPLX128
31
+ CA_CMPLX256
32
+ CA_OBJECT
33
+ ].each_with_index do |name, i|
34
+ eval("#{name} = #{i}")
35
+ data_type.push(i)
36
+ end
37
+
38
+ ctype = {
39
+ CA_FIXLEN => "fixlen",
40
+ CA_BOOLEAN => "boolean8_t",
41
+ CA_INT8 => "int8_t",
42
+ CA_UINT8 => "uint8_t",
43
+ CA_INT16 => "int16_t",
44
+ CA_UINT16 => "uint16_t",
45
+ CA_INT32 => "int32_t",
46
+ CA_UINT32 => "uint32_t",
47
+ CA_INT64 => "int64_t",
48
+ CA_UINT64 => "uint64_t",
49
+ CA_FLOAT32 => "float32_t",
50
+ CA_FLOAT64 => "float64_t",
51
+ CA_FLOAT128 => "float128_t",
52
+ CA_CMPLX64 => "cmplx64_t",
53
+ CA_CMPLX128 => "cmplx128_t",
54
+ CA_CMPLX256 => "cmplx256_t",
55
+ CA_OBJECT => "VALUE"
56
+ }
57
+
58
+ obj2cval = {
59
+ CA_FIXLEN => nil,
60
+ CA_BOOLEAN => "OBJ2BOOL",
61
+ CA_INT8 => "OBJ2LONG",
62
+ CA_UINT8 => "OBJ2ULONG",
63
+ CA_INT16 => "OBJ2LONG",
64
+ CA_UINT16 => "OBJ2ULONG",
65
+ CA_INT32 => "OBJ2LONG",
66
+ CA_UINT32 => "OBJ2ULONG",
67
+ CA_INT64 => "OBJ2LL",
68
+ CA_UINT64 => "OBJ2ULL",
69
+ CA_FLOAT32 => "OBJ2DBL",
70
+ CA_FLOAT64 => "OBJ2DBL",
71
+ CA_FLOAT128 => "OBJ2DBL", ### upcast
72
+ CA_CMPLX64 => "NUM2CC",
73
+ CA_CMPLX128 => "NUM2CC",
74
+ CA_CMPLX256 => "NUM2CC", ### upcast
75
+ CA_OBJECT => ""
76
+ }
77
+
78
+ cval2obj = {
79
+ CA_FIXLEN => nil,
80
+ CA_BOOLEAN => "BOOL2OBJ",
81
+ CA_INT8 => "LONG2NUM",
82
+ CA_UINT8 => "ULONG2NUM",
83
+ CA_INT16 => "LONG2NUM",
84
+ CA_UINT16 => "ULONG2NUM",
85
+ CA_INT32 => "LONG2NUM",
86
+ CA_UINT32 => "ULONG2NUM",
87
+ CA_INT64 => "LL2NUM",
88
+ CA_UINT64 => "ULL2NUM",
89
+ CA_FLOAT32 => "rb_float_new",
90
+ CA_FLOAT64 => "rb_float_new",
91
+ CA_FLOAT128 => "rb_float_new", ### downcast
92
+ CA_CMPLX64 => "rb_ccomplex_new",
93
+ CA_CMPLX128 => "rb_ccomplex_new",
94
+ CA_CMPLX256 => "rb_ccomplex_new", ### downcast
95
+ CA_OBJECT => ""
96
+ }
97
+
98
+ NUMERIC = [
99
+ CA_INT8 ,
100
+ CA_UINT8 ,
101
+ CA_INT16 ,
102
+ CA_UINT16 ,
103
+ CA_INT32 ,
104
+ CA_UINT32 ,
105
+ CA_INT64 ,
106
+ CA_UINT64 ,
107
+ CA_FLOAT32 ,
108
+ CA_FLOAT64 ,
109
+ CA_FLOAT128 ,
110
+ CA_CMPLX64 ,
111
+ CA_CMPLX128 ,
112
+ CA_CMPLX256 ,
113
+ ]
114
+
115
+ INTEGER = [
116
+ CA_INT8 ,
117
+ CA_UINT8 ,
118
+ CA_INT16 ,
119
+ CA_UINT16 ,
120
+ CA_INT32 ,
121
+ CA_UINT32 ,
122
+ CA_INT64 ,
123
+ CA_UINT64 ,
124
+ ]
125
+
126
+ BOOLEAN = [
127
+ CA_BOOLEAN
128
+ ]
129
+
130
+ FIXLEN = [
131
+ CA_FIXLEN
132
+ ]
133
+
134
+ OBJECT = [
135
+ CA_OBJECT
136
+ ]
137
+
138
+ CA_CAST_TABLE = {}
139
+ data_type.each do |type1|
140
+ CA_CAST_TABLE[type1] = Hash.new("ca_cast_not_implemented")
141
+ end
142
+
143
+ data_type.each do |type1|
144
+ data_type.each do |type2|
145
+ ctype1 = ctype[type1]
146
+ ctype2 = ctype[type2]
147
+ end
148
+ end
149
+
150
+ #
151
+ #
152
+ #
153
+
154
+ puts %{
155
+ /* ---------------------------------------------------------------------------
156
+
157
+ carray_cast_func.c
158
+
159
+ This file is part of Ruby/CArray extension library.
160
+ You can redistribute it and/or modify it under the terms of
161
+ the Ruby\'s licence.
162
+
163
+ This file is automatically generated from carray_math.rb.
164
+
165
+ Copyright (C) 2005 Hiroki Motoyoshi
166
+
167
+ ---------------------------------------------------------------------------- */
168
+
169
+ #include "carray.h"
170
+
171
+ static void
172
+ ca_cast_not_implemented(int32_t n, CArray *a1, void *ptr1, CArray *a2, void *ptr2, boolean8_t *m)
173
+ {
174
+ rb_raise(rb_eCADataTypeError,
175
+ "can not cast data type from <%s> to <%s>",
176
+ ca_type_name[a1->data_type], ca_type_name[a2->data_type]);
177
+ }
178
+
179
+ }
180
+
181
+ puts "/* ------------------ FIXLEN -> FIXLEN ------------------------ */"
182
+ puts
183
+ FIXLEN.each do |type1|
184
+ FIXLEN.each do |type2|
185
+ ctype1 = ctype[type1]
186
+ ctype2 = ctype[type2]
187
+ CA_CAST_TABLE[type1][type2] = "ca_cast_#{ctype1}_#{ctype2}"
188
+ puts <<-END_DEF .gsub(/^ {6}/, '')
189
+ static void
190
+ ca_cast_#{ctype1}_#{ctype2}(int32_t n, CArray *a1, void *ptr1, CArray *a2, void *ptr2, boolean8_t *m)
191
+ {
192
+ char *p1 = ptr1;
193
+ int32_t bytes1;
194
+ char *p2 = ptr2;
195
+ int32_t bytes2;
196
+ if ( a1 == NULL || a2 == NULL ) {
197
+ rb_raise(rb_eRuntimeError, "[BUG] failed to cast fixlen -> fixlen");
198
+ }
199
+ bytes1 = a1->bytes;
200
+ bytes2 = a2->bytes;
201
+ if ( m ) {
202
+ while ( n-- ) {
203
+ if ( !*m ) {
204
+ if ( bytes2 <= bytes1 ) {
205
+ memcpy(p2, p1, bytes2);
206
+ }
207
+ else {
208
+ memset(p2, 0, bytes2);
209
+ memcpy(p2, p1, bytes1);
210
+ }
211
+ }
212
+ p1+=bytes1; p2+=bytes2; m++;
213
+ }
214
+ }
215
+ else {
216
+ while ( n-- ) {
217
+ if ( bytes2 <= bytes1 ) {
218
+ memcpy(p2, p1, bytes2);
219
+ }
220
+ else {
221
+ memset(p2, 0, bytes2);
222
+ memcpy(p2, p1, bytes1);
223
+ }
224
+ p1+=bytes1; p2+=bytes2;
225
+ }
226
+ }
227
+ return;
228
+ }
229
+ END_DEF
230
+ puts
231
+ end
232
+ end
233
+
234
+ puts "/* ------------------ FIXLEN -> OBJECT ------------------------ */"
235
+ puts
236
+ FIXLEN.each do |type1|
237
+ OBJECT.each do |type2|
238
+ ctype1 = ctype[type1]
239
+ ctype2 = ctype[type2]
240
+ CA_CAST_TABLE[type1][type2] = "ca_cast_#{ctype1}_#{ctype2}"
241
+ puts <<-END_DEF .gsub(/^ {6}/, '')
242
+ static void
243
+ ca_cast_#{ctype1}_#{ctype2}(int32_t n, CArray *a1, void *ptr1, CArray *a2, void *ptr2, boolean8_t *m)
244
+ {
245
+ char *p1 = ptr1;
246
+ int32_t bytes;
247
+ VALUE *p2 = ptr2;
248
+ if ( a1 == NULL ) {
249
+ rb_raise(rb_eRuntimeError, "[BUG] failed to cast fixlen -> object");
250
+ }
251
+ bytes = a1->bytes;
252
+ if ( m ) {
253
+ while ( n-- ) {
254
+ if ( !*m ) { *p2 = rb_str_new(p1, bytes); OBJ_TAINT(*p2); }
255
+ p1+=bytes; p2++; m++;
256
+ }
257
+ }
258
+ else {
259
+ while ( n-- ) {
260
+ *p2 = rb_str_new(p1, bytes);
261
+ OBJ_TAINT(*p2);
262
+ p1+=bytes; p2++;
263
+ }
264
+ }
265
+ return;
266
+ }
267
+ END_DEF
268
+ puts
269
+ end
270
+ end
271
+
272
+ puts "/* ------------------ BOOLEAN+INTEGER -> BOOLEAN ------------------------ */"
273
+ puts
274
+ (BOOLEAN+INTEGER).each do |type1|
275
+ BOOLEAN.each do |type2|
276
+ ctype1 = ctype[type1]
277
+ ctype2 = ctype[type2]
278
+ CA_CAST_TABLE[type1][type2] = "ca_cast_#{ctype1}_#{ctype2}"
279
+ puts <<-END_DEF .gsub(/^ {6}/, '')
280
+ static void
281
+ ca_cast_#{ctype1}_#{ctype2}(int32_t n, CArray *a1, void *ptr1, CArray *a2, void *ptr2, boolean8_t *m)
282
+ {
283
+ #{ctype1} *p1 = ptr1;
284
+ #{ctype2} *p2 = ptr2;
285
+ #{ctype1} q;
286
+ if ( m ) {
287
+ while ( n-- ) {
288
+ if ( !*m ) {
289
+ q = *p1;
290
+ if ( q == 0 || q == 1 ) {
291
+ *p2 = q;
292
+ }
293
+ else {
294
+ rb_raise(rb_eRuntimeError, "out of range to cast to boolean (0 or 1)");
295
+ }
296
+ }
297
+ p1++; p2++; m++;
298
+ }
299
+ }
300
+ else {
301
+ while ( n-- ) {
302
+ q = *p1;
303
+ if ( q == 0 || q == 1 ) {
304
+ *p2 = q;
305
+ }
306
+ else {
307
+ rb_raise(rb_eRuntimeError, "out of range to cast to boolean (0 or 1)");
308
+ }
309
+ p1++; p2++;
310
+ }
311
+ }
312
+ return;
313
+ }
314
+ END_DEF
315
+ puts
316
+ end
317
+ end
318
+
319
+ puts "/* ------------------ BOOLEAN+NUMERIC -> NUMERIC ------------------------ */"
320
+ puts
321
+ (BOOLEAN+NUMERIC).each do |type1|
322
+ NUMERIC.each do |type2|
323
+ ctype1 = ctype[type1]
324
+ ctype2 = ctype[type2]
325
+ CA_CAST_TABLE[type1][type2] = "ca_cast_#{ctype1}_#{ctype2}"
326
+ puts <<-END_DEF .gsub(/^ {6}/, '')
327
+ static void
328
+ ca_cast_#{ctype1}_#{ctype2}(int32_t n, CArray *a1, void *ptr1, CArray *a2, void *ptr2, boolean8_t *m)
329
+ {
330
+ #{ctype1} *q1 = ptr1;
331
+ #{ctype1} *p1 = q1;
332
+ #{ctype2} *q2 = ptr2;
333
+ #{ctype2} *p2 = q2;
334
+ int32_t k;
335
+ if ( m ) {
336
+ boolean8_t *pm = m;
337
+ #ifdef _OPENMP
338
+ #pragma omp parallel for private(pm,p1,p2)
339
+ #endif
340
+ for (k=0; k<n; k++) {
341
+ pm = m + k;
342
+ if ( ! *pm ) {
343
+ p1 = q1 + k;
344
+ p2 = q2 + k;
345
+ *p2 = (#{ctype2}) *p1;
346
+ }
347
+ }
348
+ }
349
+ else {
350
+ #ifdef _OPENMP
351
+ #pragma omp parallel for private(p1,p2)
352
+ #endif
353
+ for (k=0; k<n; k++) {
354
+ p1 = q1 + k;
355
+ p2 = q2 + k;
356
+ *p2 = (#{ctype2}) *p1;
357
+ }
358
+ }
359
+ return;
360
+ }
361
+ END_DEF
362
+ puts
363
+ end
364
+ end
365
+
366
+ puts "/* ------------------ BOOLEAN+NUMERIC -> OBJECT ------------------------ */"
367
+ puts
368
+ (BOOLEAN+NUMERIC).each do |type1|
369
+ OBJECT.each do |type2|
370
+ ctype1 = ctype[type1]
371
+ ctype2 = ctype[type2]
372
+ unless conv = cval2obj[type1]
373
+ next
374
+ end
375
+ CA_CAST_TABLE[type1][type2] = "ca_cast_#{ctype1}_#{ctype2}"
376
+ puts <<-END_DEF .gsub(/^ {6}/, '')
377
+ static void
378
+ ca_cast_#{ctype1}_#{ctype2}(int32_t n, CArray *a1, void *ptr1, CArray *a2, void *ptr2, boolean8_t *m)
379
+ {
380
+ #{ctype1} *p1 = ptr1;
381
+ VALUE *p2 = ptr2;
382
+ if ( m ) {
383
+ while ( n-- ) {
384
+ if ( !*m ) { *p2 = #{conv}(*p1); }
385
+ p1++; p2++; m++;
386
+ }
387
+ }
388
+ else {
389
+ while ( n-- ) { *p2 = #{conv}(*p1); p1++; p2++; }
390
+ }
391
+ return;
392
+ }
393
+ END_DEF
394
+ puts
395
+ end
396
+ end
397
+
398
+ puts "/* ------------------ OBJECT -> FIXLEN ------------------------ */"
399
+ puts
400
+ OBJECT.each do |type1|
401
+ FIXLEN.each do |type2|
402
+ ctype1 = ctype[type1]
403
+ ctype2 = ctype[type2]
404
+ CA_CAST_TABLE[type1][type2] = "ca_cast_#{ctype1}_#{ctype2}"
405
+ puts <<-END_DEF .gsub(/^ {6}/, '')
406
+ static void
407
+ ca_cast_#{ctype1}_#{ctype2}(int32_t n, CArray *a1, void *ptr1, CArray *a2, void *ptr2, boolean8_t *m)
408
+ {
409
+ VALUE *p1 = ptr1;
410
+ char *p2 = ptr2;
411
+ int32_t bytes;
412
+ if ( a2 == NULL ) {
413
+ rb_raise(rb_eRuntimeError, "[BUG] failed to cast object -> fixlen");
414
+ }
415
+ bytes = a2->bytes;
416
+ if ( m ) {
417
+ while ( n-- ) {
418
+ if ( !*m ) {
419
+ VALUE str = *p1;
420
+ Check_Type(str, T_STRING);
421
+ if ( bytes <= RSTRING_LEN(str) ) {
422
+ memcpy(p2, StringValuePtr(str), bytes);
423
+ }
424
+ else {
425
+ memset(p2, 0, bytes);
426
+ memcpy(p2, StringValuePtr(str), RSTRING_LEN(str));
427
+ }
428
+ }
429
+ p1++; p2+=bytes; m++;
430
+ }
431
+ }
432
+ else {
433
+ while ( n-- ) {
434
+ VALUE str = *p1;
435
+ Check_Type(str, T_STRING);
436
+ if ( bytes <= RSTRING_LEN(str) ) {
437
+ memcpy(p2, StringValuePtr(str), bytes);
438
+ }
439
+ else {
440
+ memset(p2, 0, bytes);
441
+ memcpy(p2, StringValuePtr(str), RSTRING_LEN(str));
442
+ }
443
+ p1++; p2+=bytes;
444
+ }
445
+ }
446
+ return;
447
+ }
448
+ END_DEF
449
+ puts
450
+ end
451
+ end
452
+
453
+
454
+ puts "/* ------------------ OBJECT -> BOOLEAN+NUMERIC+OBJECT ------------------------ */"
455
+ puts
456
+ OBJECT.each do |type1|
457
+ (BOOLEAN+NUMERIC+OBJECT).each do |type2|
458
+ ctype1 = ctype[type1]
459
+ ctype2 = ctype[type2]
460
+ unless conv = obj2cval[type2]
461
+ next
462
+ end
463
+ CA_CAST_TABLE[type1][type2] = "ca_cast_#{ctype1}_#{ctype2}"
464
+ puts <<-END_DEF .gsub(/^ {6}/, '')
465
+ static void
466
+ ca_cast_#{ctype1}_#{ctype2}(int32_t n, CArray *a1, void *ptr1, CArray *a2, void *ptr2, boolean8_t *m)
467
+ {
468
+ VALUE *p1 = ptr1;
469
+ #{ctype2} *p2 = ptr2;
470
+ if ( m ) {
471
+ while ( n-- ) {
472
+ if ( !*m ) { *p2 = #{conv}(*p1); }
473
+ p1++; p2++; m++;
474
+ }
475
+ }
476
+ else {
477
+ while ( n-- ) { *p2 = #{conv}(*p1); p1++; p2++; }
478
+ }
479
+ return;
480
+ }
481
+ END_DEF
482
+ puts
483
+ end
484
+ end
485
+
486
+ puts "/* ------------------ ca_cast_func_table ------------------------ */"
487
+ puts
488
+ puts "ca_cast_func_t"
489
+ puts "ca_cast_func_table[CA_NTYPE][CA_NTYPE] = {"
490
+ test = data_type.map { |type1|
491
+ list = data_type.map { |type2| " " + CA_CAST_TABLE[type1][type2] }
492
+ " {\n" + list.join(",\n") + "\n }"
493
+ }.join(",\n")
494
+ puts test
495
+ puts "};"
496
+
497
+ puts
498
+