carray 3.0.2 → 3.0.4

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.
Files changed (247) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +568 -0
  3. data/README.md +6 -6
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_descriptor.h +27 -24
  6. data/ext/ca_axis_dispatch.c +220 -0
  7. data/ext/ca_axis_group.c +201 -123
  8. data/ext/ca_binop_dispatch.c +46 -52
  9. data/ext/ca_binop_dispatch.h +1 -1
  10. data/ext/ca_categorical_iterator.c +249 -183
  11. data/ext/ca_compare.c +7 -12
  12. data/ext/ca_for_buffer.h +21 -68
  13. data/ext/ca_group_iter.c +38 -23
  14. data/ext/ca_kernel_iterator.c +1765 -2076
  15. data/ext/ca_kernel_iterator.h +584 -566
  16. data/ext/ca_monop_dispatch.c +86 -63
  17. data/ext/ca_monop_dispatch.h +5 -0
  18. data/ext/ca_obj_array.c +223 -56
  19. data/ext/ca_obj_bincmp.c +172 -138
  20. data/ext/ca_obj_binop.c +116 -230
  21. data/ext/ca_obj_bitarray.c +40 -26
  22. data/ext/ca_obj_bitfield.c +100 -68
  23. data/ext/ca_obj_block.c +19 -9
  24. data/ext/ca_obj_byte_swap.c +45 -46
  25. data/ext/ca_obj_const_string.c +269 -44
  26. data/ext/ca_obj_face.c +612 -89
  27. data/ext/ca_obj_face.h +111 -47
  28. data/ext/ca_obj_fake.c +36 -79
  29. data/ext/ca_obj_farray.c +7 -3
  30. data/ext/ca_obj_field.c +33 -8
  31. data/ext/ca_obj_fixlen_string.c +23 -24
  32. data/ext/ca_obj_grid.c +541 -210
  33. data/ext/ca_obj_meld.c +331 -111
  34. data/ext/ca_obj_moncmp.c +80 -65
  35. data/ext/ca_obj_monop.c +177 -149
  36. data/ext/ca_obj_object.c +664 -248
  37. data/ext/ca_obj_record.c +63 -23
  38. data/ext/ca_obj_reduce.c +18 -16
  39. data/ext/ca_obj_refer.c +140 -58
  40. data/ext/ca_obj_remap.c +85 -24
  41. data/ext/ca_obj_repeat.c +24 -9
  42. data/ext/ca_obj_roll.c +121 -16
  43. data/ext/ca_obj_select.c +61 -58
  44. data/ext/ca_obj_select_axis.c +73 -107
  45. data/ext/ca_obj_shift.c +32 -102
  46. data/ext/ca_obj_stack.c +372 -122
  47. data/ext/ca_obj_stride.c +348 -140
  48. data/ext/ca_obj_string.c +88 -22
  49. data/ext/ca_obj_tile.c +38 -21
  50. data/ext/ca_obj_time.c +45 -31
  51. data/ext/ca_obj_timedelta.c +43 -29
  52. data/ext/ca_obj_transpose.c +17 -6
  53. data/ext/ca_obj_triop.c +125 -141
  54. data/ext/ca_obj_window.c +330 -44
  55. data/ext/ca_op_ipower.c +24 -11
  56. data/ext/ca_op_powi.h +57 -30
  57. data/ext/ca_pow5_table.h +656 -0
  58. data/ext/ca_sort_kernels.h +70 -0
  59. data/ext/ca_sweep_engine.c +104 -81
  60. data/ext/ca_sweep_engine.h +7 -20
  61. data/ext/ca_triop_dispatch.c +4 -1
  62. data/ext/ca_triop_dispatch.h +5 -2
  63. data/ext/caframe_csv_reader.c +542 -0
  64. data/ext/carray.h +241 -92
  65. data/ext/carray_access.c +608 -276
  66. data/ext/carray_address_basis.c +494 -97
  67. data/ext/carray_attribute.c +129 -4
  68. data/ext/carray_bincount.c +39 -7
  69. data/ext/carray_broadcast.c +56 -19
  70. data/ext/carray_build_flags.h +1 -1
  71. data/ext/carray_call_cfunc.c +108 -28
  72. data/ext/carray_cast.c +1576 -223
  73. data/ext/carray_cast_func.rb +77 -24
  74. data/ext/carray_class.c +4 -3
  75. data/ext/carray_conversion.c +208 -75
  76. data/ext/carray_copy.c +82 -24
  77. data/ext/carray_core.c +646 -162
  78. data/ext/carray_count.c +171 -88
  79. data/ext/carray_element.c +94 -60
  80. data/ext/carray_factorize.c +670 -324
  81. data/ext/carray_generate.c +260 -83
  82. data/ext/carray_histogram.c +209 -106
  83. data/ext/carray_hold.c +14 -16
  84. data/ext/carray_index_classifier.c +422 -243
  85. data/ext/carray_internal.h +692 -3
  86. data/ext/carray_kernels_bincmp.c +7 -0
  87. data/ext/carray_kernels_binop.c +487 -120
  88. data/ext/carray_kernels_init.c +653 -50
  89. data/ext/carray_kernels_moncmp.c +15 -8
  90. data/ext/carray_kernels_monop.c +99 -43
  91. data/ext/carray_kernels_reduce_aggregate.c +3925 -6112
  92. data/ext/carray_kernels_reduce_boolean.c +112 -36
  93. data/ext/carray_kernels_reduce_cumulative.c +2127 -6903
  94. data/ext/carray_kernels_reduce_extreme.c +3032 -2892
  95. data/ext/carray_kernels_reduce_variance.c +439 -500
  96. data/ext/carray_kernels_scan.c +1097 -488
  97. data/ext/carray_kernels_search.c +3787 -2176
  98. data/ext/carray_kernels_sort.c +1200 -920
  99. data/ext/carray_kernels_triop.c +479 -7
  100. data/ext/carray_key_windows.c +216 -0
  101. data/ext/carray_lazy.c +967 -153
  102. data/ext/carray_loop.c +81 -65
  103. data/ext/carray_mask.c +910 -324
  104. data/ext/carray_math_kernel.h +1 -0
  105. data/ext/carray_median_percentile.c +299 -100
  106. data/ext/carray_memory_view.c +872 -758
  107. data/ext/carray_operator.c +1171 -364
  108. data/ext/carray_order.c +505 -133
  109. data/ext/carray_partition.c +112 -65
  110. data/ext/carray_random.c +327 -239
  111. data/ext/carray_round.c +273 -0
  112. data/ext/carray_scatter.c +346 -78
  113. data/ext/carray_segment.c +257 -0
  114. data/ext/carray_slab.c +249 -86
  115. data/ext/carray_sort.c +224 -227
  116. data/ext/carray_sort_kernel.c +8 -1
  117. data/ext/carray_struct.c +118 -39
  118. data/ext/carray_test.c +193 -69
  119. data/ext/carray_time_text.c +1182 -0
  120. data/ext/carray_undef.c +4 -0
  121. data/ext/carray_utils.c +579 -113
  122. data/ext/extconf.rb +27 -2
  123. data/ext/mk_call_cfunc.rb +19 -4
  124. data/ext/mk_pow5_table.rb +35 -0
  125. data/ext/mkkernel.rb +1202 -1014
  126. data/ext/ruby_carray.c +17 -5
  127. data/ext/version.h +4 -4
  128. data/ext/version.rb +4 -2
  129. data/lib/carray/attribute.rb +160 -17
  130. data/lib/carray/autoload_carray.rb +23 -27
  131. data/lib/carray/autoload_method_extension.rb +20 -5
  132. data/lib/carray/axis_group.rb +360 -63
  133. data/lib/carray/basics.rb +162 -28
  134. data/lib/carray/bincount_nd.rb +18 -2
  135. data/lib/carray/block_iterator.rb +231 -58
  136. data/lib/carray/boolean_reduce.rb +34 -42
  137. data/lib/carray/categorical.rb +242 -52
  138. data/lib/carray/categorical_iterator.rb +437 -827
  139. data/lib/carray/complex.rb +41 -34
  140. data/lib/carray/conditional.rb +150 -14
  141. data/lib/carray/const_string.rb +59 -4
  142. data/lib/carray/construct.rb +15 -11
  143. data/lib/carray/data_type_extension.rb +1 -0
  144. data/lib/carray/distance_limit.rb +77 -0
  145. data/lib/carray/fixlen_string.rb +7 -1
  146. data/lib/carray/frame/column_verbs.rb +70 -0
  147. data/lib/carray/frame/concat.rb +157 -6
  148. data/lib/carray/frame/convert.rb +82 -7
  149. data/lib/carray/frame/csv_parser.rb +688 -87
  150. data/lib/carray/frame/describe.rb +80 -0
  151. data/lib/carray/frame/frame.rb +369 -45
  152. data/lib/carray/frame/group.rb +631 -90
  153. data/lib/carray/frame/io.rb +506 -79
  154. data/lib/carray/frame/join.rb +411 -62
  155. data/lib/carray/frame/records.rb +116 -19
  156. data/lib/carray/frame/reshape.rb +455 -0
  157. data/lib/carray/frame/sort.rb +30 -18
  158. data/lib/carray/frame/verbs.rb +868 -61
  159. data/lib/carray/frame/windows.rb +117 -0
  160. data/lib/carray/frame.rb +4 -0
  161. data/lib/carray/fuse_source.rb +118 -2
  162. data/lib/carray/fusion.rb +257 -42
  163. data/lib/carray/histogram.rb +6 -1
  164. data/lib/carray/inspect.rb +54 -13
  165. data/lib/carray/iterator.rb +99 -9
  166. data/lib/carray/key_windows.rb +620 -0
  167. data/lib/carray/lazy.rb +216 -193
  168. data/lib/carray/mask_gap_fill.rb +112 -92
  169. data/lib/carray/math.rb +32 -19
  170. data/lib/carray/meld_reduce.rb +52 -21
  171. data/lib/carray/methods/align_addr.rb +8 -4
  172. data/lib/carray/methods/bin.rb +26 -18
  173. data/lib/carray/methods/bincount.rb +18 -2
  174. data/lib/carray/methods/bit_string.rb +15 -4
  175. data/lib/carray/methods/choose.rb +16 -3
  176. data/lib/carray/methods/composition.rb +18 -10
  177. data/lib/carray/methods/factorize.rb +2 -2
  178. data/lib/carray/methods/gather_nd.rb +25 -5
  179. data/lib/carray/methods/insert_block.rb +9 -14
  180. data/lib/carray/methods/is_between.rb +59 -0
  181. data/lib/carray/methods/is_in.rb +140 -10
  182. data/lib/carray/methods/join.rb +2 -7
  183. data/lib/carray/methods/lag.rb +49 -0
  184. data/lib/carray/methods/locate_addr.rb +182 -45
  185. data/lib/carray/methods/mode.rb +18 -1
  186. data/lib/carray/methods/nunique.rb +11 -6
  187. data/lib/carray/methods/repeat.rb +1 -20
  188. data/lib/carray/methods/resize.rb +21 -23
  189. data/lib/carray/methods/snap.rb +34 -12
  190. data/lib/carray/methods/unique.rb +11 -2
  191. data/lib/carray/methods/value_counts.rb +4 -11
  192. data/lib/carray/record_order.rb +208 -0
  193. data/lib/carray/rng.rb +3 -0
  194. data/lib/carray/runtime.rb +65 -17
  195. data/lib/carray/segment_iterator.rb +1221 -0
  196. data/lib/carray/serialize.rb +214 -30
  197. data/lib/carray/slab_iterator.rb +101 -27
  198. data/lib/carray/stack.rb +10 -4
  199. data/lib/carray/string.rb +105 -5
  200. data/lib/carray/string_operation_extension.rb +12 -4
  201. data/lib/carray/struct.rb +137 -58
  202. data/lib/carray/struct_builder.rb +124 -17
  203. data/lib/carray/time.rb +1222 -186
  204. data/lib/carray/window_iterator.rb +242 -81
  205. data/lib/carray.rb +9 -2
  206. data/yard-stubs/ca_obj_array.rb +4 -4
  207. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  208. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  209. data/yard-stubs/ca_obj_fake.rb +1 -1
  210. data/yard-stubs/ca_obj_field.rb +5 -1
  211. data/yard-stubs/ca_obj_grid.rb +21 -10
  212. data/yard-stubs/ca_obj_refer.rb +5 -4
  213. data/yard-stubs/ca_obj_roll.rb +2 -3
  214. data/yard-stubs/ca_obj_shift.rb +5 -1
  215. data/yard-stubs/ca_obj_stride.rb +10 -7
  216. data/yard-stubs/ca_obj_tile.rb +1 -1
  217. data/yard-stubs/ca_obj_transpose.rb +1 -1
  218. data/yard-stubs/ca_obj_window.rb +9 -5
  219. data/yard-stubs/carray_access.rb +11 -5
  220. data/yard-stubs/carray_attribute.rb +0 -5
  221. data/yard-stubs/carray_broadcast.rb +1 -1
  222. data/yard-stubs/carray_cast.rb +88 -43
  223. data/yard-stubs/carray_conversion.rb +15 -2
  224. data/yard-stubs/carray_copy.rb +12 -5
  225. data/yard-stubs/carray_core.rb +3 -3
  226. data/yard-stubs/carray_count.rb +9 -0
  227. data/yard-stubs/carray_element.rb +10 -4
  228. data/yard-stubs/carray_generate.rb +21 -1
  229. data/yard-stubs/carray_lazy.rb +5 -1
  230. data/yard-stubs/carray_loop.rb +4 -1
  231. data/yard-stubs/carray_mask.rb +60 -12
  232. data/yard-stubs/carray_math.rb +52 -14
  233. data/yard-stubs/carray_median_percentile.rb +15 -8
  234. data/yard-stubs/carray_memory_view.rb +40 -23
  235. data/yard-stubs/carray_order.rb +61 -29
  236. data/yard-stubs/carray_random.rb +13 -4
  237. data/yard-stubs/carray_scatter.rb +21 -9
  238. data/yard-stubs/carray_segment.rb +72 -0
  239. data/yard-stubs/carray_slab.rb +10 -2
  240. data/yard-stubs/carray_sort.rb +49 -8
  241. data/yard-stubs/carray_test.rb +15 -3
  242. data/yard-stubs/carray_utils.rb +0 -26
  243. metadata +19 -5
  244. data/ext/ca_for_each_element.h +0 -239
  245. data/ext/carray_kernels_map.c +0 -3467
  246. data/lib/carray/arrow_tensor.rb +0 -401
  247. data/lib/carray/table.rb +0 -108
@@ -14,6 +14,7 @@
14
14
  --------------------------------------------------------------------------- */
15
15
 
16
16
  #include "carray.h"
17
+ #include "carray_internal.h"
17
18
  #include "ca_obj_face.h"
18
19
 
19
20
  /* The unit enum is shared with CATime (= same unit system).
@@ -26,7 +27,7 @@ extern void ca_time_extract_unit (VALUE unit, int8_t *base, int64_t *count);
26
27
  typedef struct {
27
28
  /* === CAView prefix === */
28
29
  int16_t obj_type;
29
- int8_t data_type; /* fixed to CA_INT64 */
30
+ int8_t data_type; /* surface: CA_FIXLEN (storage is the int64 parent) */
30
31
  int8_t ndim;
31
32
  int32_t flags; /* CA_FLAG_IS_FACE set */
32
33
  ca_size_t bytes; /* fixed to sizeof(int64_t) */
@@ -132,6 +133,21 @@ rb_ca_timedelta_element_initialize (VALUE self, VALUE value, VALUE unit)
132
133
  return self;
133
134
  }
134
135
 
136
+ /* dup / clone copy the value and the unit (the allocator leaves both 0). */
137
+ static VALUE
138
+ rb_ca_timedelta_element_initialize_copy (VALUE self, VALUE orig)
139
+ {
140
+ CATimedeltaElement *s, *o;
141
+ if ( self == orig ) {
142
+ return self;
143
+ }
144
+ rb_check_frozen(self);
145
+ TypedData_Get_Struct(self, CATimedeltaElement, &catimedelta_element_data_type, s);
146
+ TypedData_Get_Struct(orig, CATimedeltaElement, &catimedelta_element_data_type, o);
147
+ *s = *o;
148
+ return self;
149
+ }
150
+
135
151
  static VALUE
136
152
  rb_ca_timedelta_element_value (VALUE self)
137
153
  {
@@ -161,6 +177,12 @@ ca_timedelta_setup (CATimedelta *ca, CArray *parent, int8_t unit, int64_t count)
161
177
  "CATimedelta requires int64 storage (parent.data_type != CA_INT64)");
162
178
  }
163
179
 
180
+ /* ca == NULL asks for the checks above only, so that a constructor can
181
+ run them before it allocates. */
182
+ if ( ca == NULL ) {
183
+ return 0;
184
+ }
185
+
164
186
  ca->obj_type = CA_OBJ_TIMEDELTA;
165
187
  /* NonNumeric surface (the FIXLEN gate), like CATime: the storage is a
166
188
  count of `count x unit` ticks, and letting the numeric kernels read it
@@ -190,9 +212,6 @@ ca_timedelta_setup (CATimedelta *ca, CArray *parent, int8_t unit, int64_t count)
190
212
  ca->unit = unit;
191
213
  ca->count = count;
192
214
 
193
- if ( ca_has_mask(parent) ) {
194
- ca_create_mask((CArray *) ca);
195
- }
196
215
 
197
216
  if ( ca_is_scalar(parent) ) {
198
217
  ca_set_flag(ca, CA_FLAG_SCALAR);
@@ -208,8 +227,11 @@ ca_timedelta_setup (CATimedelta *ca, CArray *parent, int8_t unit, int64_t count)
208
227
  CATimedelta *
209
228
  ca_timedelta_new (CArray *parent, int8_t unit, int64_t count)
210
229
  {
211
- CATimedelta *ca = (CATimedelta *) ca_array_alloc(CA_OBJ_TIMEDELTA, parent->ndim);
230
+ CATimedelta *ca;
231
+ ca_timedelta_setup(NULL, parent, unit, count);
232
+ ca = (CATimedelta *) ca_array_alloc(CA_OBJ_TIMEDELTA, parent->ndim);
212
233
  ca_timedelta_setup(ca, parent, unit, count);
234
+ ca_fill_or_free((CArray *) ca, ca_view_inherit_mask, (VALUE) ca);
213
235
  return ca;
214
236
  }
215
237
 
@@ -246,18 +268,6 @@ ca_timedelta_func_allocate (void *ap)
246
268
  ca->ptr = ca->parent->ptr;
247
269
  }
248
270
 
249
- static void
250
- ca_timedelta_func_create_mask (void *ap)
251
- {
252
- CATimedelta *ca = (CATimedelta *) ap;
253
- ca_update_mask(ca->parent);
254
- if ( ! ca->parent->mask ) {
255
- ca_create_mask(ca->parent);
256
- }
257
- ca->mask = (CArray *) ca_refer_new(ca->parent->mask,
258
- CA_BOOLEAN, ca->ndim, ca->dim, 0, 0);
259
- }
260
-
261
271
  ca_operation_function_t ca_timedelta_func = {
262
272
  -1, /* CA_OBJ_TIMEDELTA — filled by ca_install_obj_type */
263
273
  CA_VIEW_ARRAY,
@@ -268,7 +278,7 @@ ca_operation_function_t ca_timedelta_func = {
268
278
  ca_face_sync,
269
279
  ca_face_detach,
270
280
  ca_face_fill_data,
271
- ca_timedelta_func_create_mask,
281
+ ca_view_func_create_mask,
272
282
  ca_face_xfer_index,
273
283
  ca_face_xfer_addrs,
274
284
  NULL, /* fold_stride */
@@ -296,7 +306,7 @@ rb_ca_timedelta_wrap (VALUE parent_val, int8_t unit, int64_t count)
296
306
  return obj;
297
307
  }
298
308
 
299
- /* __wrap__(raw, unit_spec) — primitive; unit_spec is Symbol / String /
309
+ /* wrap_storage(raw, unit_spec) — primitive; unit_spec is Symbol / String /
300
310
  Resolution / nil (normalized here). */
301
311
  static VALUE
302
312
  rb_ca_timedelta_wrap_method (VALUE klass, VALUE raw, VALUE unit_spec)
@@ -330,20 +340,22 @@ rb_ca_timedelta_initialize_copy (VALUE self, VALUE other)
330
340
  {
331
341
  CATimedelta *ca, *cs;
332
342
  TypedData_Get_Struct(self, CATimedelta, &catimedelta_data_type, ca);
343
+ ca_check_uninitialized(ca);
333
344
  TypedData_Get_Struct(other, CATimedelta, &catimedelta_data_type, cs);
334
345
  if ( ca_func[CA_OBJ_TIMEDELTA].pool_init ) {
335
346
  ca_array_pool_alloc(ca, CA_OBJ_TIMEDELTA, cs->parent->ndim);
336
347
  }
337
348
  ca_timedelta_setup(ca, cs->parent, cs->unit, cs->count);
349
+ ca_view_inherit_mask((VALUE) ca);
338
350
  return self;
339
351
  }
340
352
 
341
- /* storage_to_scalar implemented in C to avoid per-cell Ruby method dispatch
353
+ /* storage_to_element implemented in C to avoid per-cell Ruby method dispatch
342
354
  on the fetch hot path. Accepts either an Integer (INT64 surface fetch)
343
355
  or an 8-byte String (FIXLEN surface fetch); decodes the parent int64
344
356
  and constructs CATimedelta::Element(value, unit). */
345
357
  static VALUE
346
- rb_ca_timedelta_storage_to_scalar (VALUE self, VALUE raw)
358
+ rb_ca_timedelta_storage_to_element (VALUE self, VALUE raw)
347
359
  {
348
360
  CATimedelta *ca;
349
361
  CATimedeltaElement *s;
@@ -355,7 +367,7 @@ rb_ca_timedelta_storage_to_scalar (VALUE self, VALUE raw)
355
367
  if ( TYPE(raw) == T_STRING ) {
356
368
  if ( RSTRING_LEN(raw) != (long) sizeof(int64_t) ) {
357
369
  rb_raise(rb_eArgError,
358
- "CATimedelta#storage_to_scalar: expected %lu bytes, got %ld",
370
+ "CATimedelta#storage_to_element: expected %lu bytes, got %ld",
359
371
  (unsigned long) sizeof(int64_t), RSTRING_LEN(raw));
360
372
  }
361
373
  memcpy(&value, RSTRING_PTR(raw), sizeof(int64_t));
@@ -405,20 +417,20 @@ Init_ca_obj_timedelta (void)
405
417
  rb_define_method(rb_cCATimedelta, "initialize_copy",
406
418
  rb_ca_timedelta_initialize_copy, 1);
407
419
 
408
- rb_define_singleton_method(rb_cCATimedelta, "__wrap__",
409
- rb_ca_timedelta_wrap_method, 2);
420
+ rb_define_private_method(rb_singleton_class(rb_cCATimedelta), "wrap_storage",
421
+ rb_ca_timedelta_wrap_method, 2);
410
422
  rb_define_method(rb_cCATimedelta, "unit", rb_ca_timedelta_unit, 0);
411
- rb_define_method(rb_cCATimedelta, "storage_to_scalar",
412
- rb_ca_timedelta_storage_to_scalar, 1);
413
- /* Registers the state-compatibility predicate so CA_FACE_STORAGE_TO_SCALAR_IF_FACE
423
+ rb_define_method(rb_cCATimedelta, "storage_to_element",
424
+ rb_ca_timedelta_storage_to_element, 1);
425
+ /* Registers the state-compatibility predicate so CA_FACE_STORAGE_TO_ELEMENT_IF_FACE
414
426
  can skip rb_funcall on the hot path. */
415
427
  ca_face_register_state_compatible(CA_OBJ_TIMEDELTA,
416
428
  ca_timedelta_state_compatible);
417
429
  /* unit is pure metadata, no per-parent buffer; multi-parent Face lift
418
430
  is safe (portable = 1). */
419
431
  ca_face_register_state_portable(CA_OBJ_TIMEDELTA, 1);
420
- ca_face_register_storage_to_scalar(CA_OBJ_TIMEDELTA,
421
- rb_ca_timedelta_storage_to_scalar);
432
+ ca_face_register_storage_to_element(CA_OBJ_TIMEDELTA,
433
+ rb_ca_timedelta_storage_to_element);
422
434
 
423
435
  /* CATimedelta::Element as a C-backed TypedData class. The Ruby-side
424
436
  definition in lib/carray/time.rb keeps Comparable + to_seconds /
@@ -430,6 +442,8 @@ Init_ca_obj_timedelta (void)
430
442
  rb_ca_timedelta_element_s_allocate);
431
443
  rb_define_method(rb_cCATimedeltaElement, "initialize",
432
444
  rb_ca_timedelta_element_initialize, 2);
445
+ rb_define_method(rb_cCATimedeltaElement, "initialize_copy",
446
+ rb_ca_timedelta_element_initialize_copy, 1);
433
447
  rb_define_method(rb_cCATimedeltaElement, "value",
434
448
  rb_ca_timedelta_element_value, 0);
435
449
  rb_define_method(rb_cCATimedeltaElement, "unit",
@@ -7,6 +7,7 @@
7
7
  ---------------------------------------------------------------------------- */
8
8
 
9
9
  #include "carray.h"
10
+ #include "carray_internal.h" /* ca_view_inherit_mask */
10
11
  #include "ca_obj_face.h" /* CA_FACE_LIFT_IF_FACE */
11
12
 
12
13
  extern ca_operation_function_t ca_stride_func;
@@ -37,11 +38,11 @@ ca_trans_setup (CAStride *ca, CArray *parent, ca_size_t *imap)
37
38
  for (i = 0; i < ndim; i++) {
38
39
  idim = imap[i];
39
40
  if (idim < 0 || idim >= ndim) {
40
- rb_raise(rb_eRuntimeError,
41
+ rb_raise(rb_eArgError,
41
42
  "specified %i-th dimension number out of range", i);
42
43
  }
43
44
  if (map[idim] != -1) {
44
- rb_raise(rb_eRuntimeError,
45
+ rb_raise(rb_eArgError,
45
46
  "specified %i-th dimension number is duplicated", i);
46
47
  }
47
48
  map[idim] = i;
@@ -58,17 +59,26 @@ ca_trans_setup (CAStride *ca, CArray *parent, ca_size_t *imap)
58
59
  strides[i] = parent_byte_stride[imap[i]];
59
60
  }
60
61
 
61
- ca_stride_setup(ca, CA_OBJ_TRANSPOSE, parent,
62
- parent->data_type, parent->bytes,
63
- ndim, newdim, strides, 0);
62
+ /* ca == NULL asks for the checks above only, so that a constructor can
63
+ run them before it allocates. */
64
+ if ( ca == NULL ) {
65
+ return 0;
66
+ }
67
+
68
+ ca_stride_setup_view(ca, CA_OBJ_TRANSPOSE, parent,
69
+ parent->data_type, parent->bytes,
70
+ ndim, newdim, strides, 0);
64
71
  return 0;
65
72
  }
66
73
 
67
74
  CAStride *
68
75
  ca_trans_new (CArray *parent, ca_size_t *imap)
69
76
  {
70
- CAStride *ca = (CAStride *) ca_array_alloc(CA_OBJ_TRANSPOSE, parent->ndim);
77
+ CAStride *ca;
78
+ ca_trans_setup(NULL, parent, imap);
79
+ ca = (CAStride *) ca_array_alloc(CA_OBJ_TRANSPOSE, parent->ndim);
71
80
  ca_trans_setup(ca, parent, imap);
81
+ ca_fill_or_free((CArray *) ca, ca_view_inherit_mask, (VALUE) ca);
72
82
  return ca;
73
83
  }
74
84
 
@@ -126,6 +136,7 @@ rb_ca_trans_initialize_copy (VALUE self, VALUE other)
126
136
  {
127
137
  CAStride *ca, *cs;
128
138
  TypedData_Get_Struct(self, CAStride, &castride_data_type, ca);
139
+ ca_check_uninitialized(ca);
129
140
  TypedData_Get_Struct(other, CAStride, &castride_data_type, cs);
130
141
  if ( ca_func[CA_OBJ_TRANSPOSE].pool_init ) {
131
142
  ca_array_pool_alloc(ca, CA_OBJ_TRANSPOSE, cs->ndim);