carray 3.0.4 → 3.0.5

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 (111) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +205 -0
  3. data/carray.gemspec +1 -1
  4. data/ext/ca_array_pool.c +25 -1
  5. data/ext/ca_axis_dispatch.c +13 -20
  6. data/ext/ca_categorical_iterator.c +27 -20
  7. data/ext/ca_compare.c +4 -4
  8. data/ext/ca_composite_dispatch.c +9 -9
  9. data/ext/ca_kernel_iterator.c +6 -6
  10. data/ext/ca_kernel_iterator.h +112 -83
  11. data/ext/ca_obj_array.c +69 -19
  12. data/ext/ca_obj_bincmp.c +1 -0
  13. data/ext/ca_obj_binop.c +1 -0
  14. data/ext/ca_obj_bitarray.c +5 -1
  15. data/ext/ca_obj_bitfield.c +58 -43
  16. data/ext/ca_obj_byte_swap.c +2 -1
  17. data/ext/ca_obj_const_string.c +15 -3
  18. data/ext/ca_obj_face.c +42 -1
  19. data/ext/ca_obj_field.c +13 -3
  20. data/ext/ca_obj_grid.c +52 -5
  21. data/ext/ca_obj_monop.c +46 -10
  22. data/ext/ca_obj_object.c +64 -12
  23. data/ext/ca_obj_record.c +3 -0
  24. data/ext/ca_obj_reduce.c +4 -0
  25. data/ext/ca_obj_refer.c +18 -9
  26. data/ext/ca_obj_roll.c +26 -6
  27. data/ext/ca_obj_select.c +34 -5
  28. data/ext/ca_obj_shift.c +31 -7
  29. data/ext/ca_obj_stack.c +1 -0
  30. data/ext/ca_obj_stride.c +28 -19
  31. data/ext/ca_obj_string.c +11 -2
  32. data/ext/ca_obj_tile.c +27 -7
  33. data/ext/ca_obj_transpose.c +8 -4
  34. data/ext/ca_obj_triop.c +3 -0
  35. data/ext/ca_obj_window.c +79 -50
  36. data/ext/ca_op_ipower.c +4 -4
  37. data/ext/ca_sort_kernels.h +6 -3
  38. data/ext/carray.h +33 -0
  39. data/ext/carray_access.c +16 -3
  40. data/ext/carray_attribute.c +24 -0
  41. data/ext/carray_cast.c +243 -82
  42. data/ext/carray_cast_func.rb +56 -26
  43. data/ext/carray_conversion.c +2 -2
  44. data/ext/carray_core.c +3 -0
  45. data/ext/carray_count.c +6 -0
  46. data/ext/carray_element.c +9 -4
  47. data/ext/carray_factorize.c +20 -20
  48. data/ext/carray_generate.c +8 -2
  49. data/ext/carray_histogram.c +1 -1
  50. data/ext/carray_index_classifier.c +4 -4
  51. data/ext/carray_internal.h +12 -0
  52. data/ext/carray_kernels_bincmp.c +168 -168
  53. data/ext/carray_kernels_binop.c +900 -900
  54. data/ext/carray_kernels_init.c +4 -4
  55. data/ext/carray_kernels_moncmp.c +96 -96
  56. data/ext/carray_kernels_monop.c +1984 -1984
  57. data/ext/carray_kernels_reduce_aggregate.c +1733 -1733
  58. data/ext/carray_kernels_reduce_cumulative.c +642 -642
  59. data/ext/carray_kernels_reduce_extreme.c +1150 -1150
  60. data/ext/carray_kernels_reduce_variance.c +258 -258
  61. data/ext/carray_kernels_scan.c +128 -128
  62. data/ext/carray_kernels_search.c +340 -340
  63. data/ext/carray_kernels_sort.c +295 -304
  64. data/ext/carray_kernels_triop.c +114 -114
  65. data/ext/carray_key_windows.c +4 -0
  66. data/ext/carray_mask.c +45 -22
  67. data/ext/carray_memory_view.c +2 -2
  68. data/ext/carray_operator.c +5 -5
  69. data/ext/carray_order.c +227 -8
  70. data/ext/carray_random.c +18 -18
  71. data/ext/carray_scatter.c +24 -7
  72. data/ext/carray_slab.c +32 -9
  73. data/ext/carray_sort.c +224 -16
  74. data/ext/carray_sort_kernel.c +5 -7
  75. data/ext/carray_struct.c +35 -43
  76. data/ext/carray_time_text.c +4 -2
  77. data/ext/carray_utils.c +63 -21
  78. data/ext/mkkernel.rb +210 -115
  79. data/ext/version.h +4 -4
  80. data/lib/carray/attribute.rb +17 -4
  81. data/lib/carray/basics.rb +27 -7
  82. data/lib/carray/categorical.rb +30 -16
  83. data/lib/carray/categorical_iterator.rb +6 -6
  84. data/lib/carray/const_string.rb +10 -0
  85. data/lib/carray/data_type_extension.rb +8 -1
  86. data/lib/carray/fixlen_string.rb +41 -2
  87. data/lib/carray/frame/column_verbs.rb +4 -3
  88. data/lib/carray/frame/concat.rb +17 -3
  89. data/lib/carray/frame/frame.rb +6 -7
  90. data/lib/carray/frame/group.rb +100 -13
  91. data/lib/carray/frame/io.rb +3 -1
  92. data/lib/carray/fuse_source.rb +31 -2
  93. data/lib/carray/lazy.rb +35 -0
  94. data/lib/carray/methods/is_in.rb +8 -1
  95. data/lib/carray/segment_iterator.rb +12 -8
  96. data/lib/carray/serialize.rb +19 -2
  97. data/lib/carray/stack.rb +15 -12
  98. data/lib/carray/string.rb +8 -0
  99. data/lib/carray/string_operation_extension.rb +13 -5
  100. data/lib/carray/struct_builder.rb +5 -3
  101. data/lib/carray/time.rb +107 -68
  102. data/yard-stubs/ca_obj_transpose.rb +5 -4
  103. data/yard-stubs/carray_attribute.rb +3 -1
  104. data/yard-stubs/carray_cast.rb +2 -0
  105. data/yard-stubs/carray_conversion.rb +5 -1
  106. data/yard-stubs/carray_element.rb +7 -6
  107. data/yard-stubs/carray_mask.rb +8 -3
  108. data/yard-stubs/carray_math.rb +14 -4
  109. data/yard-stubs/carray_order.rb +100 -4
  110. data/yard-stubs/carray_scatter.rb +7 -5
  111. metadata +1 -1
@@ -120,9 +120,9 @@ ca_triop_fma_int16_t (ca_size_t n, boolean8_t *m,
120
120
  char *ptr3, ca_size_t i3,
121
121
  char *ptr4, ca_size_t i4)
122
122
  {
123
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2,
124
- *q3 = (int16_t *) ptr3, *q4 = (int16_t *) ptr4;
125
- int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
123
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2,
124
+ *q3 = (ca_u_int16_t *) ptr3, *q4 = (ca_u_int16_t *) ptr4;
125
+ ca_u_int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
126
126
  ca_size_t k;
127
127
  if ( m ) {
128
128
  boolean8_t *pm;
@@ -154,9 +154,9 @@ ca_triop_fma_uint16_t (ca_size_t n, boolean8_t *m,
154
154
  char *ptr3, ca_size_t i3,
155
155
  char *ptr4, ca_size_t i4)
156
156
  {
157
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2,
158
- *q3 = (uint16_t *) ptr3, *q4 = (uint16_t *) ptr4;
159
- uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
157
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2,
158
+ *q3 = (ca_u_uint16_t *) ptr3, *q4 = (ca_u_uint16_t *) ptr4;
159
+ ca_u_uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
160
160
  ca_size_t k;
161
161
  if ( m ) {
162
162
  boolean8_t *pm;
@@ -188,9 +188,9 @@ ca_triop_fma_int32_t (ca_size_t n, boolean8_t *m,
188
188
  char *ptr3, ca_size_t i3,
189
189
  char *ptr4, ca_size_t i4)
190
190
  {
191
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2,
192
- *q3 = (int32_t *) ptr3, *q4 = (int32_t *) ptr4;
193
- int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
191
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2,
192
+ *q3 = (ca_u_int32_t *) ptr3, *q4 = (ca_u_int32_t *) ptr4;
193
+ ca_u_int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
194
194
  ca_size_t k;
195
195
  if ( m ) {
196
196
  boolean8_t *pm;
@@ -222,9 +222,9 @@ ca_triop_fma_uint32_t (ca_size_t n, boolean8_t *m,
222
222
  char *ptr3, ca_size_t i3,
223
223
  char *ptr4, ca_size_t i4)
224
224
  {
225
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2,
226
- *q3 = (uint32_t *) ptr3, *q4 = (uint32_t *) ptr4;
227
- uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
225
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2,
226
+ *q3 = (ca_u_uint32_t *) ptr3, *q4 = (ca_u_uint32_t *) ptr4;
227
+ ca_u_uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
228
228
  ca_size_t k;
229
229
  if ( m ) {
230
230
  boolean8_t *pm;
@@ -256,9 +256,9 @@ ca_triop_fma_int64_t (ca_size_t n, boolean8_t *m,
256
256
  char *ptr3, ca_size_t i3,
257
257
  char *ptr4, ca_size_t i4)
258
258
  {
259
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2,
260
- *q3 = (int64_t *) ptr3, *q4 = (int64_t *) ptr4;
261
- int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
259
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2,
260
+ *q3 = (ca_u_int64_t *) ptr3, *q4 = (ca_u_int64_t *) ptr4;
261
+ ca_u_int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
262
262
  ca_size_t k;
263
263
  if ( m ) {
264
264
  boolean8_t *pm;
@@ -290,9 +290,9 @@ ca_triop_fma_uint64_t (ca_size_t n, boolean8_t *m,
290
290
  char *ptr3, ca_size_t i3,
291
291
  char *ptr4, ca_size_t i4)
292
292
  {
293
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2,
294
- *q3 = (uint64_t *) ptr3, *q4 = (uint64_t *) ptr4;
295
- uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
293
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2,
294
+ *q3 = (ca_u_uint64_t *) ptr3, *q4 = (ca_u_uint64_t *) ptr4;
295
+ ca_u_uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
296
296
  ca_size_t k;
297
297
  if ( m ) {
298
298
  boolean8_t *pm;
@@ -324,9 +324,9 @@ ca_triop_fma_float32_t (ca_size_t n, boolean8_t *m,
324
324
  char *ptr3, ca_size_t i3,
325
325
  char *ptr4, ca_size_t i4)
326
326
  {
327
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2,
328
- *q3 = (float *) ptr3, *q4 = (float *) ptr4;
329
- float *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
327
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2,
328
+ *q3 = (ca_u_float32_t *) ptr3, *q4 = (ca_u_float32_t *) ptr4;
329
+ ca_u_float32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
330
330
  ca_size_t k;
331
331
  if ( m ) {
332
332
  boolean8_t *pm;
@@ -358,9 +358,9 @@ ca_triop_fma_float64_t (ca_size_t n, boolean8_t *m,
358
358
  char *ptr3, ca_size_t i3,
359
359
  char *ptr4, ca_size_t i4)
360
360
  {
361
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2,
362
- *q3 = (double *) ptr3, *q4 = (double *) ptr4;
363
- double *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
361
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2,
362
+ *q3 = (ca_u_float64_t *) ptr3, *q4 = (ca_u_float64_t *) ptr4;
363
+ ca_u_float64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
364
364
  ca_size_t k;
365
365
  if ( m ) {
366
366
  boolean8_t *pm;
@@ -392,9 +392,9 @@ ca_triop_fma_cmplx64_t (ca_size_t n, boolean8_t *m,
392
392
  char *ptr3, ca_size_t i3,
393
393
  char *ptr4, ca_size_t i4)
394
394
  {
395
- cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2,
396
- *q3 = (cmplx64_t *) ptr3, *q4 = (cmplx64_t *) ptr4;
397
- cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
395
+ ca_u_cmplx64_t *q1 = (ca_u_cmplx64_t *) ptr1, *q2 = (ca_u_cmplx64_t *) ptr2,
396
+ *q3 = (ca_u_cmplx64_t *) ptr3, *q4 = (ca_u_cmplx64_t *) ptr4;
397
+ ca_u_cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
398
398
  ca_size_t k;
399
399
  if ( m ) {
400
400
  boolean8_t *pm;
@@ -426,9 +426,9 @@ ca_triop_fma_cmplx128_t (ca_size_t n, boolean8_t *m,
426
426
  char *ptr3, ca_size_t i3,
427
427
  char *ptr4, ca_size_t i4)
428
428
  {
429
- cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2,
430
- *q3 = (cmplx128_t *) ptr3, *q4 = (cmplx128_t *) ptr4;
431
- cmplx128_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
429
+ ca_u_cmplx128_t *q1 = (ca_u_cmplx128_t *) ptr1, *q2 = (ca_u_cmplx128_t *) ptr2,
430
+ *q3 = (ca_u_cmplx128_t *) ptr3, *q4 = (ca_u_cmplx128_t *) ptr4;
431
+ ca_u_cmplx128_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
432
432
  ca_size_t k;
433
433
  if ( m ) {
434
434
  boolean8_t *pm;
@@ -591,9 +591,9 @@ ca_triop_fms_int16_t (ca_size_t n, boolean8_t *m,
591
591
  char *ptr3, ca_size_t i3,
592
592
  char *ptr4, ca_size_t i4)
593
593
  {
594
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2,
595
- *q3 = (int16_t *) ptr3, *q4 = (int16_t *) ptr4;
596
- int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
594
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2,
595
+ *q3 = (ca_u_int16_t *) ptr3, *q4 = (ca_u_int16_t *) ptr4;
596
+ ca_u_int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
597
597
  ca_size_t k;
598
598
  if ( m ) {
599
599
  boolean8_t *pm;
@@ -625,9 +625,9 @@ ca_triop_fms_uint16_t (ca_size_t n, boolean8_t *m,
625
625
  char *ptr3, ca_size_t i3,
626
626
  char *ptr4, ca_size_t i4)
627
627
  {
628
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2,
629
- *q3 = (uint16_t *) ptr3, *q4 = (uint16_t *) ptr4;
630
- uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
628
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2,
629
+ *q3 = (ca_u_uint16_t *) ptr3, *q4 = (ca_u_uint16_t *) ptr4;
630
+ ca_u_uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
631
631
  ca_size_t k;
632
632
  if ( m ) {
633
633
  boolean8_t *pm;
@@ -659,9 +659,9 @@ ca_triop_fms_int32_t (ca_size_t n, boolean8_t *m,
659
659
  char *ptr3, ca_size_t i3,
660
660
  char *ptr4, ca_size_t i4)
661
661
  {
662
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2,
663
- *q3 = (int32_t *) ptr3, *q4 = (int32_t *) ptr4;
664
- int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
662
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2,
663
+ *q3 = (ca_u_int32_t *) ptr3, *q4 = (ca_u_int32_t *) ptr4;
664
+ ca_u_int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
665
665
  ca_size_t k;
666
666
  if ( m ) {
667
667
  boolean8_t *pm;
@@ -693,9 +693,9 @@ ca_triop_fms_uint32_t (ca_size_t n, boolean8_t *m,
693
693
  char *ptr3, ca_size_t i3,
694
694
  char *ptr4, ca_size_t i4)
695
695
  {
696
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2,
697
- *q3 = (uint32_t *) ptr3, *q4 = (uint32_t *) ptr4;
698
- uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
696
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2,
697
+ *q3 = (ca_u_uint32_t *) ptr3, *q4 = (ca_u_uint32_t *) ptr4;
698
+ ca_u_uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
699
699
  ca_size_t k;
700
700
  if ( m ) {
701
701
  boolean8_t *pm;
@@ -727,9 +727,9 @@ ca_triop_fms_int64_t (ca_size_t n, boolean8_t *m,
727
727
  char *ptr3, ca_size_t i3,
728
728
  char *ptr4, ca_size_t i4)
729
729
  {
730
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2,
731
- *q3 = (int64_t *) ptr3, *q4 = (int64_t *) ptr4;
732
- int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
730
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2,
731
+ *q3 = (ca_u_int64_t *) ptr3, *q4 = (ca_u_int64_t *) ptr4;
732
+ ca_u_int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
733
733
  ca_size_t k;
734
734
  if ( m ) {
735
735
  boolean8_t *pm;
@@ -761,9 +761,9 @@ ca_triop_fms_uint64_t (ca_size_t n, boolean8_t *m,
761
761
  char *ptr3, ca_size_t i3,
762
762
  char *ptr4, ca_size_t i4)
763
763
  {
764
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2,
765
- *q3 = (uint64_t *) ptr3, *q4 = (uint64_t *) ptr4;
766
- uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
764
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2,
765
+ *q3 = (ca_u_uint64_t *) ptr3, *q4 = (ca_u_uint64_t *) ptr4;
766
+ ca_u_uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
767
767
  ca_size_t k;
768
768
  if ( m ) {
769
769
  boolean8_t *pm;
@@ -795,9 +795,9 @@ ca_triop_fms_float32_t (ca_size_t n, boolean8_t *m,
795
795
  char *ptr3, ca_size_t i3,
796
796
  char *ptr4, ca_size_t i4)
797
797
  {
798
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2,
799
- *q3 = (float *) ptr3, *q4 = (float *) ptr4;
800
- float *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
798
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2,
799
+ *q3 = (ca_u_float32_t *) ptr3, *q4 = (ca_u_float32_t *) ptr4;
800
+ ca_u_float32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
801
801
  ca_size_t k;
802
802
  if ( m ) {
803
803
  boolean8_t *pm;
@@ -829,9 +829,9 @@ ca_triop_fms_float64_t (ca_size_t n, boolean8_t *m,
829
829
  char *ptr3, ca_size_t i3,
830
830
  char *ptr4, ca_size_t i4)
831
831
  {
832
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2,
833
- *q3 = (double *) ptr3, *q4 = (double *) ptr4;
834
- double *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
832
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2,
833
+ *q3 = (ca_u_float64_t *) ptr3, *q4 = (ca_u_float64_t *) ptr4;
834
+ ca_u_float64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
835
835
  ca_size_t k;
836
836
  if ( m ) {
837
837
  boolean8_t *pm;
@@ -863,9 +863,9 @@ ca_triop_fms_cmplx64_t (ca_size_t n, boolean8_t *m,
863
863
  char *ptr3, ca_size_t i3,
864
864
  char *ptr4, ca_size_t i4)
865
865
  {
866
- cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2,
867
- *q3 = (cmplx64_t *) ptr3, *q4 = (cmplx64_t *) ptr4;
868
- cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
866
+ ca_u_cmplx64_t *q1 = (ca_u_cmplx64_t *) ptr1, *q2 = (ca_u_cmplx64_t *) ptr2,
867
+ *q3 = (ca_u_cmplx64_t *) ptr3, *q4 = (ca_u_cmplx64_t *) ptr4;
868
+ ca_u_cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
869
869
  ca_size_t k;
870
870
  if ( m ) {
871
871
  boolean8_t *pm;
@@ -897,9 +897,9 @@ ca_triop_fms_cmplx128_t (ca_size_t n, boolean8_t *m,
897
897
  char *ptr3, ca_size_t i3,
898
898
  char *ptr4, ca_size_t i4)
899
899
  {
900
- cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2,
901
- *q3 = (cmplx128_t *) ptr3, *q4 = (cmplx128_t *) ptr4;
902
- cmplx128_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
900
+ ca_u_cmplx128_t *q1 = (ca_u_cmplx128_t *) ptr1, *q2 = (ca_u_cmplx128_t *) ptr2,
901
+ *q3 = (ca_u_cmplx128_t *) ptr3, *q4 = (ca_u_cmplx128_t *) ptr4;
902
+ ca_u_cmplx128_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
903
903
  ca_size_t k;
904
904
  if ( m ) {
905
905
  boolean8_t *pm;
@@ -1062,9 +1062,9 @@ ca_triop_clip_int16_t (ca_size_t n, boolean8_t *m,
1062
1062
  char *ptr3, ca_size_t i3,
1063
1063
  char *ptr4, ca_size_t i4)
1064
1064
  {
1065
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2,
1066
- *q3 = (int16_t *) ptr3, *q4 = (int16_t *) ptr4;
1067
- int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1065
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2,
1066
+ *q3 = (ca_u_int16_t *) ptr3, *q4 = (ca_u_int16_t *) ptr4;
1067
+ ca_u_int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1068
1068
  ca_size_t k;
1069
1069
  if ( m ) {
1070
1070
  boolean8_t *pm;
@@ -1096,9 +1096,9 @@ ca_triop_clip_uint16_t (ca_size_t n, boolean8_t *m,
1096
1096
  char *ptr3, ca_size_t i3,
1097
1097
  char *ptr4, ca_size_t i4)
1098
1098
  {
1099
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2,
1100
- *q3 = (uint16_t *) ptr3, *q4 = (uint16_t *) ptr4;
1101
- uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1099
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2,
1100
+ *q3 = (ca_u_uint16_t *) ptr3, *q4 = (ca_u_uint16_t *) ptr4;
1101
+ ca_u_uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1102
1102
  ca_size_t k;
1103
1103
  if ( m ) {
1104
1104
  boolean8_t *pm;
@@ -1130,9 +1130,9 @@ ca_triop_clip_int32_t (ca_size_t n, boolean8_t *m,
1130
1130
  char *ptr3, ca_size_t i3,
1131
1131
  char *ptr4, ca_size_t i4)
1132
1132
  {
1133
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2,
1134
- *q3 = (int32_t *) ptr3, *q4 = (int32_t *) ptr4;
1135
- int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1133
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2,
1134
+ *q3 = (ca_u_int32_t *) ptr3, *q4 = (ca_u_int32_t *) ptr4;
1135
+ ca_u_int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1136
1136
  ca_size_t k;
1137
1137
  if ( m ) {
1138
1138
  boolean8_t *pm;
@@ -1164,9 +1164,9 @@ ca_triop_clip_uint32_t (ca_size_t n, boolean8_t *m,
1164
1164
  char *ptr3, ca_size_t i3,
1165
1165
  char *ptr4, ca_size_t i4)
1166
1166
  {
1167
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2,
1168
- *q3 = (uint32_t *) ptr3, *q4 = (uint32_t *) ptr4;
1169
- uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1167
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2,
1168
+ *q3 = (ca_u_uint32_t *) ptr3, *q4 = (ca_u_uint32_t *) ptr4;
1169
+ ca_u_uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1170
1170
  ca_size_t k;
1171
1171
  if ( m ) {
1172
1172
  boolean8_t *pm;
@@ -1198,9 +1198,9 @@ ca_triop_clip_int64_t (ca_size_t n, boolean8_t *m,
1198
1198
  char *ptr3, ca_size_t i3,
1199
1199
  char *ptr4, ca_size_t i4)
1200
1200
  {
1201
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2,
1202
- *q3 = (int64_t *) ptr3, *q4 = (int64_t *) ptr4;
1203
- int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1201
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2,
1202
+ *q3 = (ca_u_int64_t *) ptr3, *q4 = (ca_u_int64_t *) ptr4;
1203
+ ca_u_int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1204
1204
  ca_size_t k;
1205
1205
  if ( m ) {
1206
1206
  boolean8_t *pm;
@@ -1232,9 +1232,9 @@ ca_triop_clip_uint64_t (ca_size_t n, boolean8_t *m,
1232
1232
  char *ptr3, ca_size_t i3,
1233
1233
  char *ptr4, ca_size_t i4)
1234
1234
  {
1235
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2,
1236
- *q3 = (uint64_t *) ptr3, *q4 = (uint64_t *) ptr4;
1237
- uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1235
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2,
1236
+ *q3 = (ca_u_uint64_t *) ptr3, *q4 = (ca_u_uint64_t *) ptr4;
1237
+ ca_u_uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1238
1238
  ca_size_t k;
1239
1239
  if ( m ) {
1240
1240
  boolean8_t *pm;
@@ -1266,9 +1266,9 @@ ca_triop_clip_float32_t (ca_size_t n, boolean8_t *m,
1266
1266
  char *ptr3, ca_size_t i3,
1267
1267
  char *ptr4, ca_size_t i4)
1268
1268
  {
1269
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2,
1270
- *q3 = (float *) ptr3, *q4 = (float *) ptr4;
1271
- float *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1269
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2,
1270
+ *q3 = (ca_u_float32_t *) ptr3, *q4 = (ca_u_float32_t *) ptr4;
1271
+ ca_u_float32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1272
1272
  ca_size_t k;
1273
1273
  if ( m ) {
1274
1274
  boolean8_t *pm;
@@ -1300,9 +1300,9 @@ ca_triop_clip_float64_t (ca_size_t n, boolean8_t *m,
1300
1300
  char *ptr3, ca_size_t i3,
1301
1301
  char *ptr4, ca_size_t i4)
1302
1302
  {
1303
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2,
1304
- *q3 = (double *) ptr3, *q4 = (double *) ptr4;
1305
- double *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1303
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2,
1304
+ *q3 = (ca_u_float64_t *) ptr3, *q4 = (ca_u_float64_t *) ptr4;
1305
+ ca_u_float64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1306
1306
  ca_size_t k;
1307
1307
  if ( m ) {
1308
1308
  boolean8_t *pm;
@@ -1462,9 +1462,9 @@ ca_triop_select_int16_t (ca_size_t n, boolean8_t *m,
1462
1462
  char *ptr3, ca_size_t i3,
1463
1463
  char *ptr4, ca_size_t i4)
1464
1464
  {
1465
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2,
1466
- *q3 = (int16_t *) ptr3, *q4 = (int16_t *) ptr4;
1467
- int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1465
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2,
1466
+ *q3 = (ca_u_int16_t *) ptr3, *q4 = (ca_u_int16_t *) ptr4;
1467
+ ca_u_int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1468
1468
  ca_size_t k;
1469
1469
  if ( m ) {
1470
1470
  boolean8_t *pm;
@@ -1496,9 +1496,9 @@ ca_triop_select_uint16_t (ca_size_t n, boolean8_t *m,
1496
1496
  char *ptr3, ca_size_t i3,
1497
1497
  char *ptr4, ca_size_t i4)
1498
1498
  {
1499
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2,
1500
- *q3 = (uint16_t *) ptr3, *q4 = (uint16_t *) ptr4;
1501
- uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1499
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2,
1500
+ *q3 = (ca_u_uint16_t *) ptr3, *q4 = (ca_u_uint16_t *) ptr4;
1501
+ ca_u_uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1502
1502
  ca_size_t k;
1503
1503
  if ( m ) {
1504
1504
  boolean8_t *pm;
@@ -1530,9 +1530,9 @@ ca_triop_select_int32_t (ca_size_t n, boolean8_t *m,
1530
1530
  char *ptr3, ca_size_t i3,
1531
1531
  char *ptr4, ca_size_t i4)
1532
1532
  {
1533
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2,
1534
- *q3 = (int32_t *) ptr3, *q4 = (int32_t *) ptr4;
1535
- int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1533
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2,
1534
+ *q3 = (ca_u_int32_t *) ptr3, *q4 = (ca_u_int32_t *) ptr4;
1535
+ ca_u_int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1536
1536
  ca_size_t k;
1537
1537
  if ( m ) {
1538
1538
  boolean8_t *pm;
@@ -1564,9 +1564,9 @@ ca_triop_select_uint32_t (ca_size_t n, boolean8_t *m,
1564
1564
  char *ptr3, ca_size_t i3,
1565
1565
  char *ptr4, ca_size_t i4)
1566
1566
  {
1567
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2,
1568
- *q3 = (uint32_t *) ptr3, *q4 = (uint32_t *) ptr4;
1569
- uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1567
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2,
1568
+ *q3 = (ca_u_uint32_t *) ptr3, *q4 = (ca_u_uint32_t *) ptr4;
1569
+ ca_u_uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1570
1570
  ca_size_t k;
1571
1571
  if ( m ) {
1572
1572
  boolean8_t *pm;
@@ -1598,9 +1598,9 @@ ca_triop_select_int64_t (ca_size_t n, boolean8_t *m,
1598
1598
  char *ptr3, ca_size_t i3,
1599
1599
  char *ptr4, ca_size_t i4)
1600
1600
  {
1601
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2,
1602
- *q3 = (int64_t *) ptr3, *q4 = (int64_t *) ptr4;
1603
- int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1601
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2,
1602
+ *q3 = (ca_u_int64_t *) ptr3, *q4 = (ca_u_int64_t *) ptr4;
1603
+ ca_u_int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1604
1604
  ca_size_t k;
1605
1605
  if ( m ) {
1606
1606
  boolean8_t *pm;
@@ -1632,9 +1632,9 @@ ca_triop_select_uint64_t (ca_size_t n, boolean8_t *m,
1632
1632
  char *ptr3, ca_size_t i3,
1633
1633
  char *ptr4, ca_size_t i4)
1634
1634
  {
1635
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2,
1636
- *q3 = (uint64_t *) ptr3, *q4 = (uint64_t *) ptr4;
1637
- uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1635
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2,
1636
+ *q3 = (ca_u_uint64_t *) ptr3, *q4 = (ca_u_uint64_t *) ptr4;
1637
+ ca_u_uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1638
1638
  ca_size_t k;
1639
1639
  if ( m ) {
1640
1640
  boolean8_t *pm;
@@ -1666,9 +1666,9 @@ ca_triop_select_float32_t (ca_size_t n, boolean8_t *m,
1666
1666
  char *ptr3, ca_size_t i3,
1667
1667
  char *ptr4, ca_size_t i4)
1668
1668
  {
1669
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2,
1670
- *q3 = (float *) ptr3, *q4 = (float *) ptr4;
1671
- float *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1669
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2,
1670
+ *q3 = (ca_u_float32_t *) ptr3, *q4 = (ca_u_float32_t *) ptr4;
1671
+ ca_u_float32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1672
1672
  ca_size_t k;
1673
1673
  if ( m ) {
1674
1674
  boolean8_t *pm;
@@ -1700,9 +1700,9 @@ ca_triop_select_float64_t (ca_size_t n, boolean8_t *m,
1700
1700
  char *ptr3, ca_size_t i3,
1701
1701
  char *ptr4, ca_size_t i4)
1702
1702
  {
1703
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2,
1704
- *q3 = (double *) ptr3, *q4 = (double *) ptr4;
1705
- double *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1703
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2,
1704
+ *q3 = (ca_u_float64_t *) ptr3, *q4 = (ca_u_float64_t *) ptr4;
1705
+ ca_u_float64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1706
1706
  ca_size_t k;
1707
1707
  if ( m ) {
1708
1708
  boolean8_t *pm;
@@ -1734,9 +1734,9 @@ ca_triop_select_cmplx64_t (ca_size_t n, boolean8_t *m,
1734
1734
  char *ptr3, ca_size_t i3,
1735
1735
  char *ptr4, ca_size_t i4)
1736
1736
  {
1737
- cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2,
1738
- *q3 = (cmplx64_t *) ptr3, *q4 = (cmplx64_t *) ptr4;
1739
- cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1737
+ ca_u_cmplx64_t *q1 = (ca_u_cmplx64_t *) ptr1, *q2 = (ca_u_cmplx64_t *) ptr2,
1738
+ *q3 = (ca_u_cmplx64_t *) ptr3, *q4 = (ca_u_cmplx64_t *) ptr4;
1739
+ ca_u_cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1740
1740
  ca_size_t k;
1741
1741
  if ( m ) {
1742
1742
  boolean8_t *pm;
@@ -1768,9 +1768,9 @@ ca_triop_select_cmplx128_t (ca_size_t n, boolean8_t *m,
1768
1768
  char *ptr3, ca_size_t i3,
1769
1769
  char *ptr4, ca_size_t i4)
1770
1770
  {
1771
- cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2,
1772
- *q3 = (cmplx128_t *) ptr3, *q4 = (cmplx128_t *) ptr4;
1773
- cmplx128_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1771
+ ca_u_cmplx128_t *q1 = (ca_u_cmplx128_t *) ptr1, *q2 = (ca_u_cmplx128_t *) ptr2,
1772
+ *q3 = (ca_u_cmplx128_t *) ptr3, *q4 = (ca_u_cmplx128_t *) ptr4;
1773
+ ca_u_cmplx128_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1774
1774
  ca_size_t k;
1775
1775
  if ( m ) {
1776
1776
  boolean8_t *pm;
@@ -150,6 +150,10 @@ rb_ca_s_key_window_ranges (VALUE self, VALUE vkeys, VALUE vgroups,
150
150
  ( ck->data_type != CA_INT64 && ck->data_type != CA_FLOAT64 ) ) {
151
151
  rb_raise(rb_eArgError, "__find_key_window_row_ranges__: unexpected arguments");
152
152
  }
153
+ /* The completeness test takes the key difference modulo the interval. */
154
+ if ( !NIL_P(rinterval) && !(NUM2DBL(rinterval) > 0) ) {
155
+ rb_raise(rb_eArgError, "__find_key_window_row_ranges__: interval should be positive");
156
+ }
153
157
  n = ck->elements;
154
158
  grp = (const int64_t *) cg->ptr;
155
159
  nout = n;
data/ext/carray_mask.c CHANGED
@@ -37,16 +37,32 @@
37
37
  #define CA_MASK_WORD_BYTES 8
38
38
  #define CA_MASK_WORD_LSB 0x0101010101010101ULL
39
39
 
40
+ /* A mask may start at any byte (a window or a block view offsets it), so a
41
+ word is read and written through memcpy, never through a uint64_t
42
+ pointer; the compiler still lowers each to a single load or store. */
43
+ static inline uint64_t
44
+ ca_mask_word_load (const boolean8_t *p)
45
+ {
46
+ uint64_t w;
47
+ memcpy(&w, p, sizeof(w));
48
+ return w;
49
+ }
50
+
51
+ static inline void
52
+ ca_mask_word_store (boolean8_t *p, uint64_t w)
53
+ {
54
+ memcpy(p, &w, sizeof(w));
55
+ }
56
+
40
57
  /* ma[i] |= ms[i] for i in [0, n) -- used by ca_copy_mask_overlay_n */
41
58
  static inline void
42
59
  ca_mask_word_or (boolean8_t *ma, const boolean8_t *ms, ca_size_t n)
43
60
  {
44
61
  ca_size_t nw = n / CA_MASK_WORD_BYTES;
45
62
  ca_size_t i;
46
- uint64_t *wa = (uint64_t *) ma;
47
- const uint64_t *ws = (const uint64_t *) ms;
48
63
  for (i = 0; i < nw; i++) {
49
- wa[i] |= ws[i];
64
+ ca_mask_word_store(ma + i*CA_MASK_WORD_BYTES,
65
+ ca_mask_word_load(ma + i*CA_MASK_WORD_BYTES) | ca_mask_word_load(ms + i*CA_MASK_WORD_BYTES));
50
66
  }
51
67
  for (i = nw * CA_MASK_WORD_BYTES; i < n; i++) {
52
68
  ma[i] |= ms[i];
@@ -62,11 +78,9 @@ ca_mask_word_and (boolean8_t *md,
62
78
  {
63
79
  ca_size_t nw = n / CA_MASK_WORD_BYTES;
64
80
  ca_size_t i;
65
- uint64_t *wd = (uint64_t *) md;
66
- const uint64_t *wa = (const uint64_t *) ma;
67
- const uint64_t *wb = (const uint64_t *) mb;
68
81
  for (i = 0; i < nw; i++) {
69
- wd[i] = wa[i] & wb[i];
82
+ ca_mask_word_store(md + i*CA_MASK_WORD_BYTES,
83
+ ca_mask_word_load(ma + i*CA_MASK_WORD_BYTES) & ca_mask_word_load(mb + i*CA_MASK_WORD_BYTES));
70
84
  }
71
85
  for (i = nw * CA_MASK_WORD_BYTES; i < n; i++) {
72
86
  md[i] = ma[i] & mb[i];
@@ -82,11 +96,9 @@ ca_mask_word_xor (boolean8_t *md,
82
96
  {
83
97
  ca_size_t nw = n / CA_MASK_WORD_BYTES;
84
98
  ca_size_t i;
85
- uint64_t *wd = (uint64_t *) md;
86
- const uint64_t *wa = (const uint64_t *) ma;
87
- const uint64_t *wb = (const uint64_t *) mb;
88
99
  for (i = 0; i < nw; i++) {
89
- wd[i] = wa[i] ^ wb[i];
100
+ ca_mask_word_store(md + i*CA_MASK_WORD_BYTES,
101
+ ca_mask_word_load(ma + i*CA_MASK_WORD_BYTES) ^ ca_mask_word_load(mb + i*CA_MASK_WORD_BYTES));
90
102
  }
91
103
  for (i = nw * CA_MASK_WORD_BYTES; i < n; i++) {
92
104
  md[i] = ma[i] ^ mb[i];
@@ -99,10 +111,8 @@ ca_mask_word_not (boolean8_t *md, const boolean8_t *ms, ca_size_t n)
99
111
  {
100
112
  ca_size_t nw = n / CA_MASK_WORD_BYTES;
101
113
  ca_size_t i;
102
- uint64_t *wd = (uint64_t *) md;
103
- const uint64_t *ws = (const uint64_t *) ms;
104
114
  for (i = 0; i < nw; i++) {
105
- wd[i] = ws[i] ^ CA_MASK_WORD_LSB;
115
+ ca_mask_word_store(md + i*CA_MASK_WORD_BYTES, ca_mask_word_load(ms + i*CA_MASK_WORD_BYTES) ^ CA_MASK_WORD_LSB);
106
116
  }
107
117
  for (i = nw * CA_MASK_WORD_BYTES; i < n; i++) {
108
118
  md[i] = ms[i] ^ (boolean8_t) 1;
@@ -116,9 +126,8 @@ ca_mask_word_any (const boolean8_t *m, ca_size_t n)
116
126
  {
117
127
  ca_size_t nw = n / CA_MASK_WORD_BYTES;
118
128
  ca_size_t i;
119
- const uint64_t *w = (const uint64_t *) m;
120
129
  for (i = 0; i < nw; i++) {
121
- if ( w[i] != 0 ) return 1;
130
+ if ( ca_mask_word_load(m + i*CA_MASK_WORD_BYTES) != 0 ) return 1;
122
131
  }
123
132
  for (i = nw * CA_MASK_WORD_BYTES; i < n; i++) {
124
133
  if ( m[i] ) return 1;
@@ -134,9 +143,8 @@ ca_mask_word_all_set (const boolean8_t *m, ca_size_t n)
134
143
  {
135
144
  ca_size_t nw = n / CA_MASK_WORD_BYTES;
136
145
  ca_size_t i;
137
- const uint64_t *w = (const uint64_t *) m;
138
146
  for (i = 0; i < nw; i++) {
139
- if ( w[i] != CA_MASK_WORD_LSB ) return 0;
147
+ if ( ca_mask_word_load(m + i*CA_MASK_WORD_BYTES) != CA_MASK_WORD_LSB ) return 0;
140
148
  }
141
149
  for (i = nw * CA_MASK_WORD_BYTES; i < n; i++) {
142
150
  if ( ! m[i] ) return 0;
@@ -1872,6 +1880,19 @@ rb_ca_mask_where (int argc, VALUE *argv, VALUE self)
1872
1880
  return ca_mask_copy_where(self, argc, argv);
1873
1881
  }
1874
1882
 
1883
+ /* inherit_mask's sources are read cell by cell over self, so an array
1884
+ source has self's number of cells (a scalar's one cell applies to all). */
1885
+ static void
1886
+ ca_inherit_mask_check_source (CArray *ca, CArray *cs)
1887
+ {
1888
+ if ( ! ca_is_scalar(cs) && cs->elements != ca->elements ) {
1889
+ rb_raise(rb_eArgError,
1890
+ "%s: mask source has %lld elements, the receiver %lld",
1891
+ ca_calling_method_name(),
1892
+ (long long) cs->elements, (long long) ca->elements);
1893
+ }
1894
+ }
1895
+
1875
1896
  /* @overload inherit_mask (*others):
1876
1897
 
1877
1898
  (Masking, Destructive)
@@ -1895,6 +1916,7 @@ rb_ca_inherit_mask_method (int argc, VALUE *argv, VALUE self)
1895
1916
  for (i=0; i<argc; i++) {
1896
1917
  if ( rb_obj_is_carray(argv[i]) ) {
1897
1918
  TypedData_Get_Struct(argv[i], CArray, &carray_data_type, cs);
1919
+ ca_inherit_mask_check_source(ca, cs);
1898
1920
  slist[i] = cs;
1899
1921
  }
1900
1922
  else {
@@ -1938,6 +1960,7 @@ rb_ca_inherit_mask (VALUE self, int n, ...)
1938
1960
  other = va_arg(rothers, VALUE);
1939
1961
  if ( rb_obj_is_carray(other) ) {
1940
1962
  TypedData_Get_Struct(other, CArray, &carray_data_type, cs);
1963
+ ca_inherit_mask_check_source(ca, cs);
1941
1964
  slist[i] = cs;
1942
1965
  }
1943
1966
  else {
@@ -1976,6 +1999,7 @@ rb_ca_inherit_mask_replace_method (int argc, VALUE *argv, VALUE self)
1976
1999
  for (i=0; i<argc; i++) {
1977
2000
  if ( rb_obj_is_carray(argv[i]) ) {
1978
2001
  TypedData_Get_Struct(argv[i], CArray, &carray_data_type, cs);
2002
+ ca_inherit_mask_check_source(ca, cs);
1979
2003
  slist[i] = cs;
1980
2004
  }
1981
2005
  else {
@@ -2019,6 +2043,7 @@ rb_ca_inherit_mask_replace (VALUE self, int n, ...)
2019
2043
  other = va_arg(rothers, VALUE);
2020
2044
  if ( rb_obj_is_carray(other) ) {
2021
2045
  TypedData_Get_Struct(other, CArray, &carray_data_type, cs);
2046
+ ca_inherit_mask_check_source(ca, cs);
2022
2047
  slist[i] = cs;
2023
2048
  }
2024
2049
  else {
@@ -2266,11 +2291,9 @@ ca_binop_bit_or_i_boolean8_fast (ca_size_t n, boolean8_t *m,
2266
2291
  accumulating; here we need 3-arg). */
2267
2292
  ca_size_t nw = n / CA_MASK_WORD_BYTES;
2268
2293
  ca_size_t j;
2269
- uint64_t *wd = (uint64_t *) q3;
2270
- const uint64_t *wa = (const uint64_t *) q1;
2271
- const uint64_t *wb = (const uint64_t *) q2;
2272
2294
  for (j = 0; j < nw; j++) {
2273
- wd[j] = wa[j] | wb[j];
2295
+ ca_mask_word_store(q3 + j*CA_MASK_WORD_BYTES,
2296
+ ca_mask_word_load(q1 + j*CA_MASK_WORD_BYTES) | ca_mask_word_load(q2 + j*CA_MASK_WORD_BYTES));
2274
2297
  }
2275
2298
  for (j = nw * CA_MASK_WORD_BYTES; j < n; j++) {
2276
2299
  q3[j] = q1[j] | q2[j];