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/ca_obj_repeat.c CHANGED
@@ -3,10 +3,8 @@
3
3
  ca_obj_repeat.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
 
@@ -14,7 +12,7 @@
14
12
 
15
13
  VALUE rb_cCARepeat;
16
14
 
17
- /* rdoc:
15
+ /* yard:
18
16
  class CARepeat < CAVirtual # :nodoc:
19
17
  end
20
18
  */
data/ext/ca_obj_select.c CHANGED
@@ -3,10 +3,8 @@
3
3
  ca_obj_select.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
 
@@ -14,7 +12,7 @@
14
12
 
15
13
  VALUE rb_cCASelect;
16
14
 
17
- /* rdoc:
15
+ /* yard:
18
16
  class CASelect < CAVirtual # :nodoc:
19
17
  end
20
18
  */
data/ext/ca_obj_shift.c CHANGED
@@ -3,16 +3,14 @@
3
3
  ca_obj_shift.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 "carray.h"
14
12
 
15
- /* rdoc:
13
+ /* yard:
16
14
  class CAShift < CAVirtual # :nodoc:
17
15
  end
18
16
  */
@@ -828,7 +826,7 @@ rb_ca_shift_new (VALUE cary, ca_size_t *shift, char *fill, int8_t *roll)
828
826
  return obj;
829
827
  }
830
828
 
831
- /* rdoc:
829
+ /* yard:
832
830
  class CArray
833
831
  def shifted
834
832
  end
@@ -3,10 +3,8 @@
3
3
  ca_obj_transpose.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
 
@@ -34,7 +32,7 @@ static int8_t CA_OBJ_TRANSPOSE;
34
32
 
35
33
  static VALUE rb_cCATrans;
36
34
 
37
- /* rdoc:
35
+ /* yard:
38
36
  class CATranspose < CAVirtual # :nodoc:
39
37
  end
40
38
  */
@@ -511,7 +509,7 @@ rb_ca_trans_new (VALUE cary, ca_size_t *imap)
511
509
  return obj;
512
510
  }
513
511
 
514
- /* rdoc:
512
+ /* yard:
515
513
  class CArray
516
514
  def transposed
517
515
  end
@@ -3,10 +3,8 @@
3
3
  ca_obj_unbound_repeat.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
 
@@ -14,7 +12,7 @@
14
12
 
15
13
  VALUE rb_cCAUnboundRepeat;
16
14
 
17
- /* rdoc:
15
+ /* yard:
18
16
  class CAUnboundRepeat < CArray
19
17
  end
20
18
  */
@@ -23,8 +21,9 @@ int
23
21
  ca_ubrep_setup (CAUnboundRepeat *ca, CArray *parent,
24
22
  int32_t rep_ndim, ca_size_t *rep_dim)
25
23
  {
26
- int8_t data_type, ndim;
24
+ int8_t data_type;
27
25
  ca_size_t bytes, elements;
26
+ int8_t i;
28
27
 
29
28
  /* check arguments */
30
29
 
@@ -32,18 +31,17 @@ ca_ubrep_setup (CAUnboundRepeat *ca, CArray *parent,
32
31
 
33
32
  data_type = parent->data_type;
34
33
  bytes = parent->bytes;
35
- ndim = parent->ndim;
36
34
  elements = parent->elements;
37
35
 
38
36
  ca->obj_type = CA_OBJ_UNBOUND_REPEAT;
39
37
  ca->data_type = data_type;
40
38
  ca->flags = 0;
41
- ca->ndim = ndim;
39
+ ca->ndim = rep_ndim;
42
40
  ca->bytes = bytes;
43
41
  ca->elements = elements;
44
42
  ca->ptr = NULL;
45
43
  ca->mask = NULL;
46
- ca->dim = ALLOC_N(ca_size_t, ndim);
44
+ ca->dim = ALLOC_N(ca_size_t, rep_ndim);
47
45
 
48
46
  ca->parent = parent;
49
47
  ca->attach = 0;
@@ -52,8 +50,10 @@ ca_ubrep_setup (CAUnboundRepeat *ca, CArray *parent,
52
50
  ca->rep_ndim = rep_ndim;
53
51
  ca->rep_dim = ALLOC_N(ca_size_t, rep_ndim);
54
52
 
55
- memcpy(ca->dim, parent->dim, ndim * sizeof(ca_size_t));
56
- memcpy(ca->rep_dim, rep_dim, rep_ndim * sizeof(ca_size_t));
53
+ for (i=0; i<rep_ndim; i++) {
54
+ ca->rep_dim[i] = rep_dim[i];
55
+ ca->dim[i] = ( rep_dim[i] ) ? rep_dim[i] : 1;
56
+ }
57
57
 
58
58
  if ( ca_has_mask(parent) ) {
59
59
  ca_create_mask(ca);
@@ -98,13 +98,6 @@ ca_ubrep_func_ptr_at_addr (void *ap, ca_size_t addr)
98
98
  return ca_ptr_at_addr(ca->parent, addr);
99
99
  }
100
100
 
101
- static char *
102
- ca_ubrep_func_ptr_at_index (void *ap, ca_size_t *idx)
103
- {
104
- CAUnboundRepeat *ca = (CAUnboundRepeat *) ap;
105
- return ca_ptr_at_index(ca->parent, idx);
106
- }
107
-
108
101
  static void
109
102
  ca_ubrep_func_fetch_addr (void *ap, ca_size_t addr, void *ptr)
110
103
  {
@@ -112,13 +105,6 @@ ca_ubrep_func_fetch_addr (void *ap, ca_size_t addr, void *ptr)
112
105
  ca_fetch_addr(ca->parent, addr, ptr);
113
106
  }
114
107
 
115
- static void
116
- ca_ubrep_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
117
- {
118
- CAUnboundRepeat *ca = (CAUnboundRepeat *) ap;
119
- ca_fetch_index(ca->parent, idx, ptr);
120
- }
121
-
122
108
  static void
123
109
  ca_ubrep_func_store_addr (void *ap, ca_size_t addr, void *ptr)
124
110
  {
@@ -126,13 +112,6 @@ ca_ubrep_func_store_addr (void *ap, ca_size_t addr, void *ptr)
126
112
  ca_store_addr(ca->parent, addr, ptr);
127
113
  }
128
114
 
129
- static void
130
- ca_ubrep_func_store_index (void *ap, ca_size_t *idx, void *ptr)
131
- {
132
- CAUnboundRepeat *ca = (CAUnboundRepeat *) ap;
133
- ca_store_index(ca->parent, idx, ptr);
134
- }
135
-
136
115
  static void
137
116
  ca_ubrep_func_allocate (void *ap)
138
117
  {
@@ -221,11 +200,11 @@ ca_operation_function_t ca_ubrep_func = {
221
200
  free_ca_ubrep,
222
201
  ca_ubrep_func_clone,
223
202
  ca_ubrep_func_ptr_at_addr,
224
- ca_ubrep_func_ptr_at_index,
203
+ NULL,
225
204
  ca_ubrep_func_fetch_addr,
226
- ca_ubrep_func_fetch_index,
205
+ NULL,
227
206
  ca_ubrep_func_store_addr,
228
- ca_ubrep_func_store_index,
207
+ NULL,
229
208
  ca_ubrep_func_allocate,
230
209
  ca_ubrep_func_attach,
231
210
  ca_ubrep_func_sync,
@@ -238,6 +217,36 @@ ca_operation_function_t ca_ubrep_func = {
238
217
 
239
218
  /* ------------------------------------------------------------------- */
240
219
 
220
+ VALUE
221
+ rb_ca_ubrep_shave (VALUE self, VALUE other)
222
+ {
223
+ CAUnboundRepeat *ca;
224
+ CArray *co;
225
+ int8_t ndim, i;
226
+ ca_size_t dim[CA_RANK_MAX];
227
+
228
+ rb_check_carray_object(self);
229
+ rb_check_carray_object(other);
230
+
231
+ Data_Get_Struct(self, CAUnboundRepeat, ca);
232
+ Data_Get_Struct(other, CArray, co);
233
+
234
+ if ( ca->elements != co->elements ) {
235
+ rb_raise(rb_eRuntimeError, "mismatch in # of elements");
236
+ }
237
+
238
+ ndim = 0;
239
+ for (i=0; i<ca->ndim; i++) {
240
+ if ( ca->rep_dim[i] ) {
241
+ dim[ndim] = ca->rep_dim[i];
242
+ ndim += 1;
243
+ }
244
+ }
245
+
246
+ return rb_ca_refer_new(other, co->data_type, ndim, dim, co->bytes, 0);
247
+ }
248
+
249
+
241
250
  VALUE
242
251
  rb_ca_ubrep_new (VALUE cary, int32_t rep_ndim, ca_size_t *rep_dim)
243
252
  {
@@ -257,80 +266,23 @@ VALUE
257
266
  rb_ca_unbound_repeat (int argc, VALUE *argv, VALUE self)
258
267
  {
259
268
  CArray *ca;
260
- ca_size_t ndim, dim[CA_RANK_MAX];
269
+ int8_t ndim;
270
+ ca_size_t dim[CA_RANK_MAX];
261
271
  int32_t rep_ndim;
262
272
  ca_size_t rep_dim[CA_RANK_MAX];
263
- ca_size_t count, i;
273
+ ca_size_t elements, count, i;
264
274
 
265
275
  Data_Get_Struct(self, CArray, ca);
266
276
 
267
- if ( argc == 1 && argv[0] == ID2SYM(rb_intern("*")) ) {
268
- CAUnboundRepeat *cr = (CAUnboundRepeat *) ca;
269
- volatile VALUE args;
270
- int repeatable = 0;
271
- args = rb_ary_new();
272
- if ( rb_obj_is_kind_of(self, rb_cCAUnboundRepeat) ) {
273
- repeatable = 1;
274
- for (i=0; i<cr->rep_ndim; i++) {
275
- if ( cr->rep_dim[i] == 1 ) {
276
- rb_ary_push(args, ID2SYM(rb_intern("*")));
277
- repeatable = 1;
278
- }
279
- else if ( cr->rep_dim[i] > 1 ) {
280
- rb_ary_push(args, Qnil);
281
- }
282
- else {
283
- rb_ary_push(args, ID2SYM(rb_intern("*")));
284
- }
285
- }
286
- }
287
- else {
288
- for (i=0; i<ca->ndim; i++) {
289
- if ( ca->dim[i] == 1 ) {
290
- rb_ary_push(args, ID2SYM(rb_intern("*")));
291
- repeatable = 1;
292
- }
293
- else {
294
- rb_ary_push(args, Qnil);
295
- }
296
- }
297
- }
298
- if ( ! repeatable ) {
299
- return self;
300
- }
301
- else {
302
- return rb_ca_unbound_repeat((int)RARRAY_LEN(args), RARRAY_PTR(args), self);
303
- }
304
- }
305
- else if ( argc == 2 &&
306
- argv[0] == ID2SYM(rb_intern("*")) &&
307
- rb_obj_is_carray(argv[1]) ) {
308
- volatile VALUE args, obj;
309
- args = ID2SYM(rb_intern("*"));
310
- obj = rb_ca_unbound_repeat(1, (VALUE*)&args, self);
311
- return ca_ubrep_bind_with(obj, argv[1]);
312
- }
313
- else if ( argc == 2 &&
314
- argv[1] == ID2SYM(rb_intern("*")) &&
315
- rb_obj_is_carray(argv[0]) ) {
316
- volatile VALUE args, obj;
317
- args = ID2SYM(rb_intern("*"));
318
- obj = rb_ca_unbound_repeat(1, (VALUE*)&args, self);
319
- return ca_ubrep_bind_with(obj, argv[0]);
320
- }
321
-
322
277
  rep_ndim = argc;
323
278
 
324
279
  count = 0;
325
- ndim = 0;
326
-
280
+ ndim = 0;
281
+ elements = 1;
327
282
  for (i=0; i<rep_ndim; i++) {
328
- if ( rb_obj_is_kind_of(argv[i], rb_cSymbol) ) {
283
+ if ( TYPE(argv[i]) == T_SYMBOL ) {
329
284
  if ( argv[i] == ID2SYM(rb_intern("*")) ) {
330
285
  rep_dim[i] = 0;
331
- if ( ca->dim[count] == 1 ) {
332
- count++;
333
- }
334
286
  }
335
287
  else {
336
288
  rb_raise(rb_eArgError, "unknown symbol (!= ':*') in arguments");
@@ -341,26 +293,21 @@ rb_ca_unbound_repeat (int argc, VALUE *argv, VALUE self)
341
293
  rb_raise(rb_eArgError, "invalid argument");
342
294
  }
343
295
  rep_dim[i] = ca->dim[count];
344
- dim[ndim] = ca->dim[count];
296
+ dim[ndim] = ca->dim[count];
297
+ elements *= ca->dim[count];
345
298
  count++; ndim++;
346
299
  }
347
300
  }
348
301
 
349
- if ( count != ca->ndim ) {
350
- rb_raise(rb_eRuntimeError, "too small # of nil");
302
+ if ( elements != ca->elements ) {
303
+ rb_raise(rb_eArgError, "mismatch in entity elements (%lli for %lli)", elements, ca->elements);
351
304
  }
352
305
 
353
306
  if ( ndim != ca->ndim ) {
354
- volatile VALUE par, obj;
355
- par = rb_ca_refer_new(self, ca->data_type, ndim, dim, ca->bytes, 0);
356
- obj = rb_ca_ubrep_new(par, rep_ndim, rep_dim);
357
- rb_ivar_set(obj, rb_intern("__real_parent__"), par);
358
- rb_ca_set_parent(obj, self);
359
- return obj;
360
- }
361
- else {
362
- return rb_ca_ubrep_new(self, rep_ndim, rep_dim);
307
+ rb_raise(rb_eArgError, "invalid number of nil's (%i for %i)", ndim, ca->ndim);
363
308
  }
309
+
310
+ return rb_ca_ubrep_new(self, rep_ndim, rep_dim);
364
311
  }
365
312
 
366
313
  static VALUE
@@ -412,6 +359,7 @@ ca_ubrep_bind2 (VALUE self, int32_t new_ndim, ca_size_t *new_dim)
412
359
  ca_size_t upr_spec[CA_RANK_MAX];
413
360
  ca_size_t srp_spec[CA_RANK_MAX];
414
361
  int uprep = 0, srp_ndim;
362
+ int ndim_real;
415
363
  int i;
416
364
 
417
365
  Data_Get_Struct(self, CAUnboundRepeat, ca);
@@ -422,6 +370,7 @@ ca_ubrep_bind2 (VALUE self, int32_t new_ndim, ca_size_t *new_dim)
422
370
  }
423
371
 
424
372
  srp_ndim = 0;
373
+ ndim_real = 0;
425
374
  for (i=0; i<new_ndim; i++) {
426
375
  if ( ca->rep_dim[i] == 0 ) {
427
376
  if ( new_dim[i] == 0 ) {
@@ -434,14 +383,16 @@ ca_ubrep_bind2 (VALUE self, int32_t new_ndim, ca_size_t *new_dim)
434
383
  upr_spec[i] = new_dim[i];
435
384
  }
436
385
  else {
386
+ ndim_real++;
437
387
  rep_spec[i] = 0;
438
388
  srp_spec[srp_ndim++] = 0;
439
389
  upr_spec[i] = ca->rep_dim[i];
440
390
  }
441
391
  }
392
+
442
393
  if ( uprep ) {
443
394
  volatile VALUE rep;
444
- if ( srp_ndim >= ca->ndim ) {
395
+ if ( srp_ndim >= ndim_real ) {
445
396
  rep = rb_ca_repeat_new(rb_ca_parent(self), srp_ndim, srp_spec);
446
397
  }
447
398
  else {
@@ -450,15 +401,12 @@ ca_ubrep_bind2 (VALUE self, int32_t new_ndim, ca_size_t *new_dim)
450
401
  return rb_ca_ubrep_new(rep, new_ndim, upr_spec);
451
402
  }
452
403
  else {
453
- return rb_ca_repeat_new(self, new_ndim, rep_spec);
404
+ return rb_ca_repeat_new(rb_ca_parent(self), new_ndim, rep_spec);
454
405
  }
455
406
  }
456
407
 
457
- /* rdoc:
458
- class CAUnboundRepeat
459
- def bind_with(other)
460
- end
461
- end
408
+ /* @overload bind_with (other)
409
+
462
410
  */
463
411
 
464
412
  VALUE
@@ -484,11 +432,8 @@ ca_ubrep_bind_with (VALUE self, VALUE other)
484
432
  }
485
433
  }
486
434
 
487
- /* rdoc:
488
- class CAUnboundRepeat
489
- def bind(*index)
490
- end
491
- end
435
+ /* @overload bind (*index)
436
+
492
437
  */
493
438
 
494
439
  static VALUE
@@ -503,6 +448,7 @@ rb_ca_ubrep_bind (int argc, VALUE *argv, VALUE self)
503
448
  if ( ca->rep_ndim != argc ) {
504
449
  rb_raise(rb_eArgError, "invalid new_ndim");
505
450
  }
451
+
506
452
  for (i=0; i<argc; i++) {
507
453
  if ( ca->rep_dim[i] == 0 ) {
508
454
  rep_spec[i] = NUM2SIZE(argv[i]);
@@ -512,7 +458,7 @@ rb_ca_ubrep_bind (int argc, VALUE *argv, VALUE self)
512
458
  }
513
459
  }
514
460
 
515
- return rb_ca_repeat_new(self, argc, rep_spec);
461
+ return rb_ca_repeat_new(rb_ca_parent(self), argc, rep_spec);
516
462
  }
517
463
 
518
464
  static VALUE