carray 1.5.1 → 1.5.6

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 (198) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +32 -0
  3. data/{LICENSES → LICENSE} +0 -0
  4. data/NEWS.md +83 -0
  5. data/README.md +34 -18
  6. data/Rakefile +1 -1
  7. data/TODO.md +17 -0
  8. data/carray.gemspec +10 -7
  9. data/ext/ca_iter_block.c +3 -5
  10. data/ext/ca_iter_dimension.c +4 -5
  11. data/ext/ca_iter_window.c +2 -4
  12. data/ext/ca_obj_array.c +394 -124
  13. data/ext/ca_obj_bitarray.c +6 -11
  14. data/ext/ca_obj_bitfield.c +5 -9
  15. data/ext/ca_obj_block.c +5 -12
  16. data/ext/ca_obj_fake.c +3 -5
  17. data/ext/ca_obj_farray.c +3 -5
  18. data/ext/ca_obj_field.c +15 -17
  19. data/ext/ca_obj_grid.c +5 -6
  20. data/ext/ca_obj_mapping.c +2 -4
  21. data/ext/ca_obj_object.c +3 -5
  22. data/ext/ca_obj_reduce.c +2 -4
  23. data/ext/ca_obj_refer.c +11 -15
  24. data/ext/ca_obj_repeat.c +2 -4
  25. data/ext/ca_obj_select.c +2 -4
  26. data/ext/ca_obj_shift.c +3 -5
  27. data/ext/ca_obj_transpose.c +3 -5
  28. data/ext/ca_obj_unbound_repeat.c +68 -122
  29. data/ext/ca_obj_window.c +7 -9
  30. data/ext/carray.h +17 -8
  31. data/ext/carray_access.c +183 -58
  32. data/ext/carray_attribute.c +151 -197
  33. data/ext/carray_call_cfunc.c +1 -3
  34. data/ext/carray_cast.c +345 -144
  35. data/ext/carray_cast_func.rb +1 -2
  36. data/ext/carray_class.c +28 -36
  37. data/ext/carray_conversion.c +56 -59
  38. data/ext/carray_copy.c +16 -32
  39. data/ext/carray_core.c +73 -60
  40. data/ext/carray_element.c +25 -44
  41. data/ext/carray_generate.c +74 -53
  42. data/ext/carray_iterator.c +13 -15
  43. data/ext/carray_loop.c +53 -82
  44. data/ext/carray_mask.c +99 -119
  45. data/ext/carray_math.rb +28 -12
  46. data/ext/carray_mathfunc.c +1 -3
  47. data/ext/carray_numeric.c +42 -45
  48. data/ext/carray_operator.c +45 -32
  49. data/ext/carray_order.c +231 -65
  50. data/ext/carray_sort_addr.c +14 -21
  51. data/ext/carray_stat.c +1 -3
  52. data/ext/carray_stat_proc.rb +2 -4
  53. data/ext/carray_test.c +41 -30
  54. data/ext/carray_undef.c +1 -11
  55. data/ext/carray_utils.c +138 -51
  56. data/ext/extconf.rb +14 -2
  57. data/ext/mkmath.rb +2 -2
  58. data/ext/ruby_carray.c +15 -7
  59. data/ext/ruby_ccomplex.c +2 -4
  60. data/ext/ruby_float_func.c +1 -3
  61. data/ext/version.h +5 -7
  62. data/lib/carray.rb +9 -9
  63. data/lib/carray/autoload.rb +0 -2
  64. data/lib/carray/autoload/autoload_gem_numo_narray.rb +6 -6
  65. data/lib/carray/basic.rb +1 -3
  66. data/lib/carray/broadcast.rb +101 -0
  67. data/lib/carray/compose.rb +34 -10
  68. data/lib/carray/construct.rb +57 -18
  69. data/lib/carray/info.rb +1 -3
  70. data/lib/carray/inspect.rb +3 -5
  71. data/lib/carray/io/imagemagick.rb +1 -3
  72. data/lib/carray/iterator.rb +3 -3
  73. data/lib/carray/mask.rb +18 -7
  74. data/lib/carray/math.rb +4 -6
  75. data/lib/carray/math/histogram.rb +1 -3
  76. data/lib/carray/math/recurrence.rb +1 -3
  77. data/lib/carray/mkmf.rb +1 -3
  78. data/lib/carray/object/ca_obj_iterator.rb +1 -3
  79. data/lib/carray/object/ca_obj_link.rb +1 -3
  80. data/lib/carray/object/ca_obj_pack.rb +1 -3
  81. data/lib/carray/obsolete.rb +1 -17
  82. data/lib/carray/ordering.rb +29 -5
  83. data/lib/carray/serialize.rb +34 -25
  84. data/lib/carray/string.rb +1 -3
  85. data/lib/carray/struct.rb +3 -5
  86. data/lib/carray/testing.rb +5 -10
  87. data/lib/carray/time.rb +1 -3
  88. data/lib/carray/transform.rb +12 -3
  89. data/misc/NOTE +16 -38
  90. data/spec/Classes/CABitfield_spec.rb +58 -0
  91. data/spec/Classes/CABlockIterator_spec.rb +114 -0
  92. data/spec/Classes/CABlock_spec.rb +205 -0
  93. data/spec/Classes/CAField_spec.rb +39 -0
  94. data/spec/Classes/CAGrid_spec.rb +75 -0
  95. data/spec/Classes/CAMap_spec.rb +0 -0
  96. data/{test/test_CAMapping.rb → spec/Classes/CAMapping_spec.rb} +35 -36
  97. data/spec/Classes/CAObject_attribute_spec.rb +33 -0
  98. data/spec/Classes/CAObject_spec.rb +33 -0
  99. data/spec/Classes/CARefer_spec.rb +93 -0
  100. data/spec/Classes/CARepeat_spec.rb +65 -0
  101. data/spec/Classes/CASelect_spec.rb +22 -0
  102. data/spec/Classes/CAShift_spec.rb +16 -0
  103. data/spec/Classes/CAStruct_spec.rb +71 -0
  104. data/{test/test_CATranspose.rb → spec/Classes/CATranspose_spec.rb} +20 -21
  105. data/spec/Classes/CAUnboudRepeat_spec.rb +102 -0
  106. data/spec/Classes/CAWindow_spec.rb +54 -0
  107. data/spec/Classes/CAWrap_spec.rb +8 -0
  108. data/{test/test_CArray.rb → spec/Classes/CArray_spec.rb} +48 -92
  109. data/spec/Classes/CScalar_spec.rb +55 -0
  110. data/spec/Features/feature_130_spec.rb +19 -0
  111. data/spec/Features/feature_attributes_spec.rb +280 -0
  112. data/spec/Features/feature_boolean_spec.rb +98 -0
  113. data/spec/Features/feature_broadcast.rb +116 -0
  114. data/spec/Features/feature_cast_function.rb +19 -0
  115. data/spec/Features/feature_cast_spec.rb +33 -0
  116. data/spec/Features/feature_class_spec.rb +84 -0
  117. data/spec/Features/feature_complex_spec.rb +42 -0
  118. data/{test/test_composite.rb → spec/Features/feature_composite_spec.rb} +17 -18
  119. data/spec/Features/feature_convert_spec.rb +46 -0
  120. data/spec/Features/feature_copy_spec.rb +123 -0
  121. data/spec/Features/feature_creation_spec.rb +84 -0
  122. data/spec/Features/feature_element_spec.rb +144 -0
  123. data/spec/Features/feature_extream_spec.rb +54 -0
  124. data/spec/Features/feature_generate_spec.rb +74 -0
  125. data/spec/Features/feature_index_spec.rb +69 -0
  126. data/spec/Features/feature_mask_spec.rb +580 -0
  127. data/spec/Features/feature_math_spec.rb +97 -0
  128. data/spec/Features/feature_order_spec.rb +146 -0
  129. data/spec/Features/feature_ref_store_spec.rb +209 -0
  130. data/spec/Features/feature_serialization_spec.rb +125 -0
  131. data/spec/Features/feature_stat_spec.rb +397 -0
  132. data/spec/Features/feature_virtual_spec.rb +48 -0
  133. data/spec/Features/method_eq_spec.rb +81 -0
  134. data/spec/Features/method_is_nan_spec.rb +12 -0
  135. data/spec/Features/method_map_spec.rb +54 -0
  136. data/spec/Features/method_max_with.rb +20 -0
  137. data/spec/Features/method_min_with.rb +19 -0
  138. data/spec/Features/method_ne_spec.rb +18 -0
  139. data/spec/Features/method_project_spec.rb +188 -0
  140. data/spec/Features/method_ref_spec.rb +27 -0
  141. data/spec/Features/method_round_spec.rb +11 -0
  142. data/spec/Features/method_s_linspace_spec.rb +48 -0
  143. data/spec/Features/method_s_span_spec.rb +14 -0
  144. data/spec/Features/method_seq_spec.rb +47 -0
  145. data/spec/Features/method_sort_with.rb +43 -0
  146. data/spec/Features/method_sorted_with.rb +29 -0
  147. data/spec/Features/method_span_spec.rb +42 -0
  148. data/spec/Features/method_wrap_readonly_spec.rb +43 -0
  149. data/{test → spec/UnitTest}/test_CAVirtual.rb +0 -0
  150. data/spec/spec_all.rb +0 -1
  151. data/utils/convert_test.rb +73 -0
  152. data/utils/{extract_rdoc.rb → extract_yard.rb} +7 -12
  153. metadata +74 -58
  154. data/spec/CABlockIterator/CABlockIterator_spec.rb +0 -113
  155. data/spec/CArray/bug/store_spec.rb +0 -27
  156. data/spec/CArray/index/repeat_spec.rb +0 -10
  157. data/spec/CArray/method/eq_spec.rb +0 -80
  158. data/spec/CArray/method/is_nan_spec.rb +0 -12
  159. data/spec/CArray/method/ne_spec.rb +0 -18
  160. data/spec/CArray/method/round_spec.rb +0 -11
  161. data/spec/CArray/object/_attribute_spec.rb +0 -32
  162. data/spec/CArray/object/s_new_spec.rb +0 -31
  163. data/spec/CArray/serialize/Serialization_spec.rb +0 -89
  164. data/test/test_130.rb +0 -23
  165. data/test/test_ALL.rb +0 -49
  166. data/test/test_CABitfield.rb +0 -59
  167. data/test/test_CABlock.rb +0 -208
  168. data/test/test_CAField.rb +0 -40
  169. data/test/test_CAGrid.rb +0 -76
  170. data/test/test_CAMmap.rb +0 -11
  171. data/test/test_CARefer.rb +0 -94
  172. data/test/test_CARepeat.rb +0 -66
  173. data/test/test_CASelect.rb +0 -23
  174. data/test/test_CAShift.rb +0 -17
  175. data/test/test_CAWindow.rb +0 -55
  176. data/test/test_CAWrap.rb +0 -9
  177. data/test/test_CComplex.rb +0 -83
  178. data/test/test_CScalar.rb +0 -91
  179. data/test/test_attribute.rb +0 -281
  180. data/test/test_block_iterator.rb +0 -17
  181. data/test/test_boolean.rb +0 -99
  182. data/test/test_cast.rb +0 -33
  183. data/test/test_class.rb +0 -85
  184. data/test/test_complex.rb +0 -43
  185. data/test/test_convert.rb +0 -79
  186. data/test/test_copy.rb +0 -141
  187. data/test/test_creation.rb +0 -85
  188. data/test/test_element.rb +0 -146
  189. data/test/test_extream.rb +0 -55
  190. data/test/test_generate.rb +0 -75
  191. data/test/test_index.rb +0 -71
  192. data/test/test_mask.rb +0 -578
  193. data/test/test_math.rb +0 -98
  194. data/test/test_order.rb +0 -147
  195. data/test/test_ref_store.rb +0 -211
  196. data/test/test_stat.rb +0 -406
  197. data/test/test_struct.rb +0 -72
  198. data/test/test_virtual.rb +0 -49
data/ext/carray_math.rb CHANGED
@@ -18,12 +18,10 @@ HEADERS << <<HERE_END
18
18
  carray_math.c
19
19
 
20
20
  This file is part of Ruby/CArray extension library.
21
- You can redistribute it and/or modify it under the terms of
22
- the Ruby Licence.
23
21
 
24
- This file is automatically generated from carray_math.rb.
25
22
 
26
- Copyright (C) 2005 Hiroki Motoyoshi
23
+ This file is automatically generated from carray_math.rb.
24
+ Copyright (C) 2005-2020 Hiroki Motoyoshi
27
25
 
28
26
  ---------------------------------------------------------------------------- */
29
27
 
@@ -157,6 +155,10 @@ monfunc("exp", "exp",
157
155
  FLOAT_TYPES => "(#2) = exp(#1);",
158
156
  CMPLX_TYPES => HAVE_COMPLEX ? "(#2) = cexp(#1);" : nil,
159
157
  OBJ_TYPES => '(#2) = rb_funcall((#1), rb_intern("exp"), 0);')
158
+ monfunc("exp2", "exp2",
159
+ FLOAT_TYPES => "(#2) = exp2(#1);",
160
+ CMPLX_TYPES => HAVE_COMPLEX ? "(#2) = cpow(2, (#1));" : nil,
161
+ OBJ_TYPES => '(#2) = rb_funcall((#1), rb_intern("exp2"), 0);')
160
162
  monfunc("exp10", "exp10",
161
163
  FLOAT_TYPES => "(#2) = pow(10, (#1));",
162
164
  CMPLX_TYPES => HAVE_COMPLEX ? "(#2) = cpow(10, (#1));" : nil,
@@ -168,6 +170,12 @@ monfunc("log", "log",
168
170
  monfunc("log10", "log10",
169
171
  FLOAT_TYPES => "(#2) = log10(#1);",
170
172
  OBJ_TYPES => '(#2) = rb_funcall((#1), rb_intern("log10"), 0);')
173
+ monfunc("log2", "log2",
174
+ FLOAT_TYPES => "(#2) = log2(#1);",
175
+ OBJ_TYPES => '(#2) = rb_funcall((#1), rb_intern("log2"), 0);')
176
+ monfunc("logb", "logb",
177
+ FLOAT_TYPES => "(#2) = logb(#1);",
178
+ OBJ_TYPES => '(#2) = rb_funcall((#1), rb_intern("logb"), 0);')
171
179
  monfunc("sin", "sin",
172
180
  FLOAT_TYPES => "(#2) = sin(#1);",
173
181
  CMPLX_TYPES => HAVE_COMPLEX ? "(#2) = csin(#1);" : nil,
@@ -219,12 +227,14 @@ monfunc("atanh", "atanh",
219
227
 
220
228
 
221
229
  binop("pmax", "pmax",
222
- ALL_TYPES =>"(#3) = (#1) > (#2) ? (#1) : (#2);",
230
+ INT_TYPES =>"(#3) = (#1) > (#2) ? (#1) : (#2);",
231
+ FLOAT_TYPES =>"(#3) = fmax(#1, #2);",
223
232
  CMPLX_TYPES => nil,
224
233
  OBJ_TYPES =>'(#3) = rb_funcall(rb_assoc_new((#1),(#2)), rb_intern("max"), 0);')
225
234
 
226
235
  binop("pmin", "pmin",
227
- ALL_TYPES =>"(#3) = (#1) < (#2) ? (#1) : (#2);",
236
+ INT_TYPES =>"(#3) = (#1) < (#2) ? (#1) : (#2);",
237
+ FLOAT_TYPES =>"(#3) = fmin(#1, #2);",
228
238
  CMPLX_TYPES => nil,
229
239
  OBJ_TYPES =>'(#3) = rb_funcall(rb_assoc_new((#1),(#2)), rb_intern("min"), 0);')
230
240
 
@@ -249,7 +259,7 @@ binop("/", "div",
249
259
  CMPLX_TYPES => HAVE_COMPLEX ? "(#3) = (#1) / (#2);" : nil,
250
260
  OBJ_TYPES => '(#3) = rb_funcall((#1), id_slash, 1, (#2));')
251
261
 
252
- binop("quo_i", nil,
262
+ binop("quo_i", "quo_i",
253
263
  OBJ_TYPES => '(#3) = rb_funcall((#1), rb_intern("quo"), 1, (#2));')
254
264
 
255
265
  binop("rcp_mul", "rcp_mul",
@@ -260,6 +270,12 @@ binop("rcp_mul", "rcp_mul",
260
270
 
261
271
  binop("%", "mod",
262
272
  INT_TYPES => "if ((#2)==0) {ca_zerodiv();}; (#3) = (#1) % (#2);",
273
+ FLOAT_TYPES => "(#3) = fmod(#1, #2);",
274
+ OBJ_TYPES => '(#3) = rb_funcall((#1), id_percent, 1, (#2));')
275
+
276
+ binop("reminder", "reminder",
277
+ INT_TYPES => "if ((#2)==0) {ca_zerodiv();}; (#3) = (#1) % (#2);",
278
+ FLOAT_TYPES => "(#3) = remainder(#1, #2);",
263
279
  OBJ_TYPES => '(#3) = rb_funcall((#1), id_percent, 1, (#2));')
264
280
 
265
281
  binop("&", "bit_and_i",
@@ -697,7 +713,7 @@ rb_ca_ipower (VALUE self, VALUE other)
697
713
  /* unresolved unbound repeat array generates unbound repeat array again */
698
714
  if ( ca->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
699
715
  CAUnboundRepeat *cx = (CAUnboundRepeat *) ca;
700
- obj = rb_ca_ubrep_new(obj, cx->rep_ndim, cx->rep_dim);
716
+ obj = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, obj), cx->rep_ndim, cx->rep_dim);
701
717
  }
702
718
 
703
719
  return obj;
@@ -752,7 +768,7 @@ rb_ca_ipower_bang (VALUE self, VALUE other)
752
768
 
753
769
  }
754
770
 
755
- binop("**", "power",
771
+ binop("power", "power",
756
772
  INT_TYPES => "(#3) = op_powi_<type>((#1), (#2));",
757
773
  FLOAT_TYPES => "(#3) = pow((#1), (#2));",
758
774
  CMPLX_TYPES => HAVE_COMPLEX ? "(#3) = cpow((#1), (#2));" : nil,
@@ -775,8 +791,8 @@ static VALUE rb_ca_pow (VALUE self, VALUE other)
775
791
 
776
792
  /* unresolved unbound repeat array generates unbound repeat array again */
777
793
  if ( ca->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
778
- CAUnboundRepeat *cx = (CAUnboundRepeat *) ca;
779
- obj = rb_ca_ubrep_new(obj, cx->rep_ndim, cx->rep_dim);
794
+ CAUnboundRepeat *cx = (CAUnboundRepeat *) ca;
795
+ obj = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, obj), cx->rep_ndim, cx->rep_dim);
780
796
  }
781
797
 
782
798
  return obj;
@@ -803,7 +819,7 @@ METHODS << %{
803
819
  rb_define_method(rb_cCArray, "pow!", rb_ca_pow_bang, 1);
804
820
  }
805
821
 
806
- alias_op("pow", "**")
822
+ alias_op("**", "pow")
807
823
 
808
824
  METHODS << %{
809
825
  id_equal = rb_intern("==");
@@ -3,10 +3,8 @@
3
3
  carray/mathfunc/carray_mathfunc.c
4
4
 
5
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
6
 
9
- Copyright (C) 2005 Hiroki Motoyoshi
7
+ Copyright (C) 2005-2020 Hiroki Motoyoshi
10
8
 
11
9
  ---------------------------------------------------------------------------- */
12
10
 
data/ext/carray_numeric.c CHANGED
@@ -3,21 +3,14 @@
3
3
  carray_numeric.c
4
4
 
5
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
6
 
9
- Copyright (C) 2005 Hiroki Motoyoshi
7
+ Copyright (C) 2005-2020 Hiroki Motoyoshi
10
8
 
11
9
  ---------------------------------------------------------------------------- */
12
10
 
13
11
  #include "ruby.h"
14
12
  #include "carray.h"
15
13
 
16
- #if RUBY_VERSION_CODE >= 240
17
- # define rb_cFixnum rb_cInteger
18
- # define rb_cBignum rb_cInteger
19
- #endif
20
-
21
14
  VALUE CA_NAN, CA_INF;
22
15
 
23
16
  static ID id___or__;
@@ -26,24 +19,18 @@ static ID id___xor__;
26
19
  static ID id___rshift__;
27
20
  static ID id___lshift__;
28
21
 
29
- VALUE
30
- rb_num_nan (VALUE self)
31
- {
32
- return CA_NAN;
33
- }
34
-
35
- VALUE
36
- rb_num_inf (VALUE self)
37
- {
38
- return CA_INF;
39
- }
22
+ static ID id_bit_or;
23
+ static ID id_bit_and;
24
+ static ID id_bit_xor;
25
+ static ID id_lshift;
26
+ static ID id_rshift;
40
27
 
41
28
  static VALUE
42
29
  rb_hack_or(VALUE x, VALUE y)
43
30
  {
44
31
  if ( rb_obj_is_carray(y) ) {
45
32
  if ( rb_ca_is_boolean_type(y) ) {
46
- return rb_funcall(y, rb_intern("bit_or"), 1, x);
33
+ return rb_funcall(y, id_bit_or, 1, x);
47
34
  }
48
35
  else {
49
36
  #if RUBY_VERSION_CODE >= 190
@@ -63,7 +50,7 @@ rb_hack_and (VALUE x, VALUE y)
63
50
  {
64
51
  if ( rb_obj_is_carray(y) ) {
65
52
  if ( rb_ca_is_boolean_type(y) ) {
66
- return rb_funcall(y, rb_intern("bit_and"), 1, x);
53
+ return rb_funcall(y, id_bit_and, 1, x);
67
54
  }
68
55
  else {
69
56
  #if RUBY_VERSION_CODE >= 190
@@ -83,7 +70,7 @@ rb_hack_xor (VALUE x, VALUE y)
83
70
  {
84
71
  if ( rb_obj_is_carray(y) ) {
85
72
  if ( rb_ca_is_boolean_type(y) ) {
86
- return rb_funcall(y, rb_intern("bit_xor"), 1, x);
73
+ return rb_funcall(y, id_bit_xor, 1, x);
87
74
  }
88
75
  else {
89
76
  #if RUBY_VERSION_CODE >= 190
@@ -103,7 +90,7 @@ rb_hack_lshift (VALUE x, VALUE y)
103
90
  {
104
91
  if ( rb_obj_is_carray(y) ) {
105
92
  #if RUBY_VERSION_CODE >= 190
106
- return rb_num_coerce_bin(x, y, rb_intern("<<"));
93
+ return rb_num_coerce_bin(x, y, id_lshift);
107
94
  #else
108
95
  return rb_num_coerce_bin(x, y);
109
96
  #endif
@@ -118,7 +105,7 @@ rb_hack_rshift (VALUE x, VALUE y)
118
105
  {
119
106
  if ( rb_obj_is_carray(y) ) {
120
107
  #if RUBY_VERSION_CODE >= 190
121
- return rb_num_coerce_bin(x, y, rb_intern(">>"));
108
+ return rb_num_coerce_bin(x, y, id_rshift);
122
109
  #else
123
110
  return rb_num_coerce_bin(x, y);
124
111
  #endif
@@ -128,12 +115,6 @@ rb_hack_rshift (VALUE x, VALUE y)
128
115
  }
129
116
  }
130
117
 
131
- static VALUE
132
- rb_hack_star (VALUE x, VALUE y)
133
- {
134
- return rb_funcall(y, rb_intern("*"), 1, x);
135
- }
136
-
137
118
  /* ------------------------------------------------------------------- */
138
119
 
139
120
  #ifdef HAVE_COMPLEX_H
@@ -199,27 +180,52 @@ Init_carray_numeric ()
199
180
  {
200
181
  /* hack Fixnum and Bignum's "|", "&", "^", "<<", ">>" */
201
182
 
202
- id___or__ = rb_intern("__or__");
203
- id___and__ = rb_intern("__and__");
204
- id___xor__ = rb_intern("__xor__");
183
+ id___or__ = rb_intern("__or__");
184
+ id___and__ = rb_intern("__and__");
185
+ id___xor__ = rb_intern("__xor__");
205
186
  id___rshift__ = rb_intern("__rshift__");
206
187
  id___lshift__ = rb_intern("__lshift__");
207
188
 
189
+ id_bit_or = rb_intern("bit_or");
190
+ id_bit_and = rb_intern("bit_and");
191
+ id_bit_xor = rb_intern("bit_xor");
192
+ id_lshift = rb_intern("<<");
193
+ id_rshift = rb_intern(">>");
194
+
208
195
  CA_NAN = rb_float_new(0.0/0.0);
209
196
  CA_INF = rb_float_new(1.0/0.0);
210
197
  rb_define_const(rb_cObject, "CA_NAN", CA_NAN);
211
198
  rb_define_const(rb_cObject, "CA_INF", CA_INF);
212
- rb_define_global_function("nan", rb_num_nan, 0);
213
- rb_define_global_function("inf", rb_num_inf, 0);
214
199
 
215
200
  rb_define_alias(rb_cTrueClass, "__or__", "|");
216
201
  rb_define_alias(rb_cTrueClass, "__and__", "&");
217
202
  rb_define_alias(rb_cTrueClass, "__xor__", "^");
218
203
 
204
+ rb_define_method(rb_cTrueClass, "|", rb_hack_or, 1);
205
+ rb_define_method(rb_cTrueClass, "&", rb_hack_and, 1);
206
+ rb_define_method(rb_cTrueClass, "^", rb_hack_xor, 1);
207
+
219
208
  rb_define_alias(rb_cFalseClass, "__or__", "|");
220
209
  rb_define_alias(rb_cFalseClass, "__and__", "&");
221
210
  rb_define_alias(rb_cFalseClass, "__xor__", "^");
222
211
 
212
+ rb_define_method(rb_cFalseClass, "|", rb_hack_or, 1);
213
+ rb_define_method(rb_cFalseClass, "&", rb_hack_and, 1);
214
+ rb_define_method(rb_cFalseClass, "^", rb_hack_xor, 1);
215
+
216
+ #if RUBY_VERSION_CODE >= 240
217
+ rb_define_alias(rb_cInteger, "__or__", "|");
218
+ rb_define_alias(rb_cInteger, "__and__", "&");
219
+ rb_define_alias(rb_cInteger, "__xor__", "^");
220
+ rb_define_alias(rb_cInteger, "__lshift__", "<<");
221
+ rb_define_alias(rb_cInteger, "__rshift__", ">>");
222
+
223
+ rb_define_method(rb_cInteger, "|", rb_hack_or, 1);
224
+ rb_define_method(rb_cInteger, "&", rb_hack_and, 1);
225
+ rb_define_method(rb_cInteger, "^", rb_hack_xor, 1);
226
+ rb_define_method(rb_cInteger, "<<", rb_hack_lshift, 1);
227
+ rb_define_method(rb_cInteger, ">>", rb_hack_rshift, 1);
228
+ #else
223
229
  rb_define_alias(rb_cFixnum, "__or__", "|");
224
230
  rb_define_alias(rb_cFixnum, "__and__", "&");
225
231
  rb_define_alias(rb_cFixnum, "__xor__", "^");
@@ -232,16 +238,6 @@ Init_carray_numeric ()
232
238
  rb_define_alias(rb_cBignum, "__lshift__", "<<");
233
239
  rb_define_alias(rb_cBignum, "__rshift__", ">>");
234
240
 
235
- rb_define_method(rb_cTrueClass, "|", rb_hack_or, 1);
236
- rb_define_method(rb_cTrueClass, "&", rb_hack_and, 1);
237
- rb_define_method(rb_cTrueClass, "^", rb_hack_xor, 1);
238
- rb_define_method(rb_cTrueClass, "*", rb_hack_star, 1);
239
-
240
- rb_define_method(rb_cFalseClass, "|", rb_hack_or, 1);
241
- rb_define_method(rb_cFalseClass, "&", rb_hack_and, 1);
242
- rb_define_method(rb_cFalseClass, "^", rb_hack_xor, 1);
243
- rb_define_method(rb_cFalseClass, "*", rb_hack_star, 1);
244
-
245
241
  rb_define_method(rb_cFixnum, "|", rb_hack_or, 1);
246
242
  rb_define_method(rb_cFixnum, "&", rb_hack_and, 1);
247
243
  rb_define_method(rb_cFixnum, "^", rb_hack_xor, 1);
@@ -253,6 +249,7 @@ Init_carray_numeric ()
253
249
  rb_define_method(rb_cBignum, "^", rb_hack_xor, 1);
254
250
  rb_define_method(rb_cBignum, "<<", rb_hack_lshift, 1);
255
251
  rb_define_method(rb_cBignum, ">>", rb_hack_rshift, 1);
252
+ #endif
256
253
 
257
254
  #ifdef HAVE_COMPLEX_H
258
255
  rb_define_method(rb_cCArray, "arg", rb_ca_arg, 0);
@@ -3,10 +3,8 @@
3
3
  carray_operator.c
4
4
 
5
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
6
 
9
- Copyright (C) 2005 Hiroki Motoyoshi
7
+ Copyright (C) 2005-2020 Hiroki Motoyoshi
10
8
 
11
9
  ---------------------------------------------------------------------------- */
12
10
 
@@ -28,7 +26,6 @@ ca_zerodiv ()
28
26
  rb_raise(rb_eZeroDivError, "divided by 0");
29
27
  }
30
28
 
31
-
32
29
  VALUE
33
30
  rb_ca_call_monop (VALUE self, ca_monop_func_t func[])
34
31
  {
@@ -50,7 +47,7 @@ rb_ca_call_monop (VALUE self, ca_monop_func_t func[])
50
47
  ca_attach(ca1);
51
48
  ca_copy_mask_overlay(ca2, ca2->elements, 1, ca1);
52
49
  func[ca1->data_type](ca1->elements,
53
- ( ca2->mask ) ? ca2->mask->ptr : NULL,
50
+ ( ca2->mask ) ? (boolean8_t *)ca2->mask->ptr : NULL,
54
51
  ca1->ptr, 1,
55
52
  ca2->ptr, 1);
56
53
  ca_detach(ca1);
@@ -58,7 +55,7 @@ rb_ca_call_monop (VALUE self, ca_monop_func_t func[])
58
55
  /* unresolved unbound repeat array generates unbound repeat array again */
59
56
  if ( ca1->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
60
57
  CAUnboundRepeat *cx = (CAUnboundRepeat *) ca1;
61
- out = rb_ca_ubrep_new(out, cx->rep_ndim, cx->rep_dim);
58
+ out = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, out), cx->rep_ndim, cx->rep_dim);
62
59
  }
63
60
 
64
61
  return out;
@@ -75,7 +72,7 @@ rb_ca_call_monop_bang (VALUE self, ca_monop_func_t func[])
75
72
 
76
73
  ca_attach(ca1);
77
74
  func[ca1->data_type](ca1->elements,
78
- ( ca1->mask ) ? ca1->mask->ptr : NULL,
75
+ ( ca1->mask ) ? (boolean8_t *)ca1->mask->ptr : NULL,
79
76
  ca1->ptr, 1,
80
77
  ca1->ptr, 1);
81
78
  ca_sync(ca1);
@@ -134,7 +131,8 @@ rb_ca_call_binop (volatile VALUE self, volatile VALUE other,
134
131
  out = ca_wrap_struct(ca3);
135
132
 
136
133
  ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
137
- func[ca1->data_type](ca1->elements, ( ca3->mask ) ? ca3->mask->ptr : NULL,
134
+ func[ca1->data_type](ca1->elements,
135
+ ( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
138
136
  ca1->ptr, 0,
139
137
  ca2->ptr, 0,
140
138
  ca3->ptr, 0);
@@ -149,7 +147,8 @@ rb_ca_call_binop (volatile VALUE self, volatile VALUE other,
149
147
  out = ca_wrap_struct(ca3);
150
148
 
151
149
  ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
152
- func[ca1->data_type](ca2->elements, ( ca3->mask ) ? ca3->mask->ptr : NULL,
150
+ func[ca1->data_type](ca2->elements,
151
+ ( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
153
152
  ca1->ptr, 0,
154
153
  ca2->ptr, 1,
155
154
  ca3->ptr, 1);
@@ -166,7 +165,8 @@ rb_ca_call_binop (volatile VALUE self, volatile VALUE other,
166
165
  out = ca_wrap_struct(ca3);
167
166
 
168
167
  ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
169
- func[ca1->data_type](ca1->elements, ( ca3->mask ) ? ca3->mask->ptr : NULL,
168
+ func[ca1->data_type](ca1->elements,
169
+ ( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
170
170
  ca1->ptr, 1,
171
171
  ca2->ptr, 0,
172
172
  ca3->ptr, 1);
@@ -185,7 +185,8 @@ rb_ca_call_binop (volatile VALUE self, volatile VALUE other,
185
185
  out = ca_wrap_struct(ca3);
186
186
 
187
187
  ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
188
- func[ca1->data_type](ca1->elements, ( ca3->mask ) ? ca3->mask->ptr : NULL,
188
+ func[ca1->data_type](ca1->elements,
189
+ ( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
189
190
  ca1->ptr, 1,
190
191
  ca2->ptr, 1,
191
192
  ca3->ptr, 1);
@@ -197,13 +198,13 @@ rb_ca_call_binop (volatile VALUE self, volatile VALUE other,
197
198
  /* unresolved unbound repeat array generates unbound repeat array again */
198
199
  if ( ca1->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
199
200
  CAUnboundRepeat *cx = (CAUnboundRepeat *) ca1;
200
- out = rb_ca_ubrep_new(out, cx->rep_ndim, cx->rep_dim);
201
+ out = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, out), cx->rep_ndim, cx->rep_dim);
201
202
  }
202
203
 
203
204
  /* unresolved unbound repeat array generates unbound repeat array again */
204
205
  if ( ca2->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
205
206
  CAUnboundRepeat *cx = (CAUnboundRepeat *) ca2;
206
- out = rb_ca_ubrep_new(out, cx->rep_ndim, cx->rep_dim);
207
+ out = rb_ca_ubrep_new(rb_ca_ubrep_shave(other, out), cx->rep_ndim, cx->rep_dim);
207
208
  }
208
209
 
209
210
  return out;
@@ -228,7 +229,8 @@ rb_ca_call_binop_bang (VALUE self, VALUE other, ca_binop_func_t func[])
228
229
  if ( rb_obj_is_cscalar(self) ) {
229
230
  if ( rb_obj_is_cscalar(other) ) { /* scalar vs scalar */
230
231
  ca_copy_mask_overlay(ca1, ca1->elements, 2, ca1, ca2);
231
- func[ca1->data_type](ca1->elements, ( ca1->mask ) ? ca1->mask->ptr : NULL,
232
+ func[ca1->data_type](ca1->elements,
233
+ ( ca1->mask ) ? (boolean8_t *) ca1->mask->ptr : NULL,
232
234
  ca1->ptr, 0,
233
235
  ca2->ptr, 0,
234
236
  ca1->ptr, 0);
@@ -240,7 +242,8 @@ rb_ca_call_binop_bang (VALUE self, VALUE other, ca_binop_func_t func[])
240
242
  }
241
243
 
242
244
  ca_copy_mask_overlay(ca1, ca1->elements, 2, ca1, ca2);
243
- func[ca1->data_type](ca1->elements, ( ca1->mask ) ? ca1->mask->ptr : NULL,
245
+ func[ca1->data_type](ca1->elements,
246
+ ( ca1->mask ) ? (boolean8_t *) ca1->mask->ptr : NULL,
244
247
  ca1->ptr, 0,
245
248
  ca2->ptr, 0,
246
249
  ca1->ptr, 0);
@@ -249,7 +252,8 @@ rb_ca_call_binop_bang (VALUE self, VALUE other, ca_binop_func_t func[])
249
252
  else {
250
253
  if ( rb_obj_is_cscalar(other) ) { /* array vs scalar */
251
254
  ca_copy_mask_overlay(ca1, ca1->elements, 2, ca1, ca2);
252
- func[ca1->data_type](ca1->elements, ( ca1->mask ) ? ca1->mask->ptr : NULL,
255
+ func[ca1->data_type](ca1->elements,
256
+ ( ca1->mask ) ? (boolean8_t *) ca1->mask->ptr : NULL,
253
257
  ca1->ptr, 1,
254
258
  ca2->ptr, 0,
255
259
  ca1->ptr, 1);
@@ -261,7 +265,8 @@ rb_ca_call_binop_bang (VALUE self, VALUE other, ca_binop_func_t func[])
261
265
  }
262
266
 
263
267
  ca_copy_mask_overlay(ca1, ca1->elements, 2, ca1, ca2);
264
- func[ca1->data_type](ca1->elements, ( ca1->mask ) ? ca1->mask->ptr : NULL,
268
+ func[ca1->data_type](ca1->elements,
269
+ ( ca1->mask ) ? (boolean8_t *) ca1->mask->ptr : NULL,
265
270
  ca1->ptr, 1,
266
271
  ca2->ptr, 1,
267
272
  ca1->ptr, 1);
@@ -294,15 +299,16 @@ rb_ca_call_moncmp (VALUE self, ca_moncmp_func_t func[])
294
299
 
295
300
  ca_attach(ca1);
296
301
  ca_copy_mask_overlay(ca2, ca2->elements, 1, ca1);
297
- func[ca1->data_type](ca1->elements, ( ca2->mask ) ? ca2->mask->ptr : NULL,
302
+ func[ca1->data_type](ca1->elements,
303
+ ( ca2->mask ) ? (boolean8_t *) ca2->mask->ptr : NULL,
298
304
  ca1->ptr, 1,
299
- ca2->ptr, 1);
305
+ (boolean8_t *) ca2->ptr, 1);
300
306
  ca_detach(ca1);
301
307
 
302
308
  /* unresolved unbound repeat array generates unbound repeat array again */
303
309
  if ( ca1->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
304
310
  CAUnboundRepeat *cx = (CAUnboundRepeat *) ca1;
305
- out = rb_ca_ubrep_new(out, cx->rep_ndim, cx->rep_dim);
311
+ out = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, out), cx->rep_ndim, cx->rep_dim);
306
312
  }
307
313
 
308
314
  return out;
@@ -321,10 +327,10 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
321
327
 
322
328
  /* check for comparison with CA_UNDEF */
323
329
  if ( other == CA_UNDEF ) {
324
- if ( func == ca_bincmp_eq ) { /* a.eq(UNDEF) -> a.is_masked */
330
+ if ( (ca_bincmp_func_t) func == (ca_bincmp_func_t) ca_bincmp_eq ) { /* a.eq(UNDEF) -> a.is_masked */
325
331
  return rb_ca_is_masked(self);
326
332
  }
327
- else if ( func == ca_bincmp_ne ) { /* a.ne(UNDEF) -> a.is_not_masked */
333
+ else if ( (ca_bincmp_func_t) func == (ca_bincmp_func_t) ca_bincmp_ne ) { /* a.ne(UNDEF) -> a.is_not_masked */
328
334
  return rb_ca_is_not_masked(self);
329
335
  }
330
336
  else {
@@ -347,7 +353,8 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
347
353
  Data_Get_Struct(out, CArray, ca3);
348
354
 
349
355
  ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
350
- func[ca1->data_type](ca1->elements, ( ca3->mask ) ? ca3->mask->ptr : NULL,
356
+ func[ca1->data_type](ca1->elements,
357
+ ( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
351
358
  ca1->ptr, ca1->bytes, 0,
352
359
  ca2->ptr, ca2->bytes, 0,
353
360
  ca3->ptr, ca3->bytes, 0);
@@ -357,7 +364,8 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
357
364
  Data_Get_Struct(out, CArray, ca3);
358
365
 
359
366
  ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
360
- func[ca1->data_type](ca2->elements, ( ca3->mask ) ? ca3->mask->ptr : NULL,
367
+ func[ca1->data_type](ca2->elements,
368
+ ( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
361
369
  ca1->ptr, ca1->bytes, 0,
362
370
  ca2->ptr, ca2->bytes, 1,
363
371
  ca3->ptr, ca3->bytes, 1);
@@ -369,7 +377,8 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
369
377
  Data_Get_Struct(out, CArray, ca3);
370
378
 
371
379
  ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
372
- func[ca1->data_type](ca1->elements, ( ca3->mask ) ? ca3->mask->ptr : NULL,
380
+ func[ca1->data_type](ca1->elements,
381
+ ( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
373
382
  ca1->ptr, ca1->bytes, 1,
374
383
  ca2->ptr, ca2->bytes, 0,
375
384
  ca3->ptr, ca3->bytes, 1);
@@ -383,7 +392,8 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
383
392
  Data_Get_Struct(out, CArray, ca3);
384
393
 
385
394
  ca_copy_mask_overlay(ca3, ca3->elements, 2, ca1, ca2);
386
- func[ca1->data_type](ca1->elements, ( ca3->mask ) ? ca3->mask->ptr : NULL,
395
+ func[ca1->data_type](ca1->elements,
396
+ ( ca3->mask ) ? (boolean8_t *) ca3->mask->ptr : NULL,
387
397
  ca1->ptr, ca1->bytes, 1,
388
398
  ca2->ptr, ca2->bytes, 1,
389
399
  ca3->ptr, ca3->bytes, 1);
@@ -395,7 +405,7 @@ rb_ca_call_bincmp (volatile VALUE self, volatile VALUE other,
395
405
  /* unresolved unbound repeat array generates unbound repeat array again */
396
406
  if ( ca1->obj_type == CA_OBJ_UNBOUND_REPEAT ) {
397
407
  CAUnboundRepeat *cx = (CAUnboundRepeat *) ca1;
398
- out = rb_ca_ubrep_new(out, cx->rep_ndim, cx->rep_dim);
408
+ out = rb_ca_ubrep_new(rb_ca_ubrep_shave(self, out), cx->rep_ndim, cx->rep_dim);
399
409
  }
400
410
 
401
411
  return out;
@@ -458,11 +468,9 @@ ca_math_call (VALUE mod, VALUE arg, ID id)
458
468
  }
459
469
  }
460
470
 
461
- /* rdoc:
462
- class CArray
463
- def coerce (other)
464
- end
465
- end
471
+ /* @overload coerece (other)
472
+
473
+ [TBD]
466
474
  */
467
475
 
468
476
  static VALUE
@@ -524,6 +532,11 @@ rb_ca_coerce (VALUE self, VALUE other)
524
532
  } \
525
533
  }
526
534
 
535
+ /* @overload mul_add (weight, min_count=nil, fill_value=nil)
536
+
537
+ [TBD]
538
+ */
539
+
527
540
  static VALUE
528
541
  rb_ca_mul_add (int argc, VALUE *argv, volatile VALUE self)
529
542
  {