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
@@ -0,0 +1,257 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ carray_segment.c
4
+
5
+ Conversions between the representations of a flat sequence cut into
6
+ consecutive segments:
7
+
8
+ lengths [2, 0, 3] one count per segment (k)
9
+ offsets [0, 2, 2, 5] every boundary, first and last included (k+1)
10
+ segment index [0, 0, 2, 2, 2] the segment each element belongs to (n)
11
+
12
+ CArray.segment_offsets(lengths: l) lengths -> offsets
13
+ CArray.segment_index(lengths: l) lengths -> segment index
14
+ CArray.segment_index(offsets: o) offsets -> segment index
15
+
16
+ Everything is computed in int64, so a total beyond 2**53 stays exact
17
+ (a cumsum would go through float64). Offsets need not start at 0: the
18
+ offsets of rows a..b cut out of a longer table start at offsets[a], and
19
+ the segment index then covers offsets[0]...offsets[-1] with the segments
20
+ numbered from 0.
21
+
22
+ Inputs are read through ca_copy_data straight into an int64 array that
23
+ Ruby already owns, so a refusal after reading leaks nothing.
24
+
25
+ --------------------------------------------------------------------------- */
26
+
27
+ #include "carray.h"
28
+
29
+ static ID id_lengths, id_offsets;
30
+
31
+ /* Read `v` (any integer or boolean CArray, or an Array of Integers) as
32
+ int64 into a fresh Ruby-owned array of `pad_front + v.elements`
33
+ elements, starting after `pad_front` cells. Refuses a non-integer
34
+ data type and masked cells, since neither names a count or a
35
+ position. */
36
+ static VALUE
37
+ segment_read_int64 (VALUE v, const char *name, int is_lengths,
38
+ ca_size_t pad_front, CArray **out_ca, ca_size_t *out_k)
39
+ {
40
+ CArray *src, *dst;
41
+ VALUE rsrc, rdst;
42
+ ca_size_t k;
43
+ const char *role = is_lengths ? "lengths" : "offsets";
44
+
45
+ if ( TYPE(v) == T_ARRAY ) {
46
+ long i;
47
+ for (i = 0; i < RARRAY_LEN(v); i++) {
48
+ if ( ! RB_INTEGER_TYPE_P(RARRAY_AREF(v, i)) ) {
49
+ rb_raise(rb_eArgError, "%s: %s must be integers", name, role);
50
+ }
51
+ }
52
+ }
53
+ else if ( ! rb_obj_is_carray(v) ) {
54
+ rb_raise(rb_eTypeError, "%s: %s must be a CArray or an Array of Integers",
55
+ name, role);
56
+ }
57
+ else {
58
+ GetCArray(v, src);
59
+ if ( ! ca_is_integer_type(src) && src->data_type != CA_BOOLEAN ) {
60
+ rb_raise(rb_eCADataTypeError, "%s: %s must be integers (got %s)",
61
+ name, role, ca_type_name[src->data_type]);
62
+ }
63
+ if ( ca_has_mask(src) &&
64
+ NUM2LL(rb_funcall(v, rb_intern("count_masked"), 0)) > 0 ) {
65
+ rb_raise(rb_eArgError, is_lengths ? "%s: a masked length is not a count"
66
+ : "%s: a masked offset is not a position",
67
+ name);
68
+ }
69
+ }
70
+
71
+ rsrc = rb_ca_wrap_readonly(v, INT2NUM(CA_INT64));
72
+ GetCArray(rsrc, src);
73
+ k = src->elements;
74
+ {
75
+ ca_size_t dim[1];
76
+ dim[0] = pad_front + k;
77
+ rdst = rb_carray_new(CA_INT64, 1, dim, 0, NULL);
78
+ }
79
+ GetCArray(rdst, dst);
80
+ if ( k > 0 ) {
81
+ ca_copy_data(src, dst->ptr + pad_front * sizeof(int64_t));
82
+ }
83
+ RB_GC_GUARD(rsrc);
84
+ *out_ca = dst;
85
+ *out_k = k;
86
+ return rdst;
87
+ }
88
+
89
+ /* Turn a lengths array read into o[1..k] into offsets in place, o[0] = 0. */
90
+ static void
91
+ segment_prefix_sum (int64_t *o, ca_size_t k, const char *name)
92
+ {
93
+ int64_t s = 0;
94
+ ca_size_t c;
95
+ o[0] = 0;
96
+ for (c = 1; c <= k; c++) {
97
+ int64_t l = o[c];
98
+ if ( l < 0 ) {
99
+ rb_raise(rb_eArgError, "%s: lengths must not be negative (got %lld at %lld)",
100
+ name, (long long) l, (long long) (c - 1));
101
+ }
102
+ if ( s > INT64_MAX - l ) {
103
+ rb_raise(rb_eRangeError, "%s: the total length overflows int64", name);
104
+ }
105
+ s += l;
106
+ o[c] = s;
107
+ }
108
+ }
109
+
110
+ /* Parse the one role keyword. Returns the value and sets *is_lengths. */
111
+ static VALUE
112
+ segment_role (int argc, VALUE *argv, const char *name, int allow_offsets,
113
+ int *is_lengths)
114
+ {
115
+ VALUE opts, vals[2];
116
+ ID ids[2];
117
+ int nids;
118
+
119
+ rb_scan_args(argc, argv, ":", &opts);
120
+ ids[0] = id_lengths;
121
+ ids[1] = id_offsets;
122
+ nids = allow_offsets ? 2 : 1;
123
+ vals[0] = vals[1] = Qundef;
124
+ rb_get_kwargs(opts, ids, 0, nids, vals);
125
+
126
+ if ( vals[0] != Qundef && nids == 2 && vals[1] != Qundef ) {
127
+ rb_raise(rb_eArgError, "%s: give lengths: or offsets:, not both", name);
128
+ }
129
+ if ( vals[0] != Qundef ) {
130
+ *is_lengths = 1;
131
+ return vals[0];
132
+ }
133
+ if ( nids == 2 && vals[1] != Qundef ) {
134
+ *is_lengths = 0;
135
+ return vals[1];
136
+ }
137
+ rb_raise(rb_eArgError, allow_offsets ? "%s: lengths: or offsets: is required"
138
+ : "%s: lengths: is required", name);
139
+ return Qnil;
140
+ }
141
+
142
+ /* CArray.segment_offsets(lengths: l) -> int64[k+1] */
143
+ static VALUE
144
+ rb_ca_s_segment_offsets (int argc, VALUE *argv, VALUE klass)
145
+ {
146
+ const char *name = "segment_offsets";
147
+ int is_lengths;
148
+ VALUE v, ro;
149
+ CArray *co;
150
+ ca_size_t k;
151
+
152
+ v = segment_role(argc, argv, name, 0, &is_lengths);
153
+ ro = segment_read_int64(v, name, 1, 1, &co, &k);
154
+ segment_prefix_sum((int64_t *) co->ptr, k, name);
155
+ return ro;
156
+ }
157
+
158
+ /* The boundaries named by the one role keyword, as a validated int64 array
159
+ of k+1 elements that Ruby owns: lengths are summed, offsets are checked
160
+ to be non-empty and non-decreasing. */
161
+ static VALUE
162
+ segment_bounds (int argc, VALUE *argv, const char *name, CArray **out_co,
163
+ ca_size_t *out_k)
164
+ {
165
+ int is_lengths;
166
+ VALUE v, ro;
167
+ CArray *co;
168
+ ca_size_t k, c;
169
+ int64_t *o;
170
+
171
+ v = segment_role(argc, argv, name, 1, &is_lengths);
172
+
173
+ if ( is_lengths ) {
174
+ ro = segment_read_int64(v, name, 1, 1, &co, &k);
175
+ segment_prefix_sum((int64_t *) co->ptr, k, name);
176
+ }
177
+ else {
178
+ ro = segment_read_int64(v, name, 0, 0, &co, &k);
179
+ if ( k == 0 ) {
180
+ rb_raise(rb_eArgError,
181
+ "%s: offsets need at least one element (the start of the first segment)",
182
+ name);
183
+ }
184
+ o = (int64_t *) co->ptr;
185
+ for (c = 1; c < k; c++) {
186
+ if ( o[c] < o[c-1] ) {
187
+ rb_raise(rb_eArgError,
188
+ "%s: offsets must not decrease (%lld after %lld at %lld)",
189
+ name, (long long) o[c], (long long) o[c-1], (long long) c);
190
+ }
191
+ }
192
+ k -= 1; /* k+1 boundaries -> k segments */
193
+ }
194
+ *out_co = co;
195
+ *out_k = k;
196
+ return ro;
197
+ }
198
+
199
+ /* CArray.segment_index(lengths: l) -> int64[l.sum]
200
+ CArray.segment_index(offsets: o) -> int64[o[-1] - o[0]] */
201
+ static VALUE
202
+ rb_ca_s_segment_index (int argc, VALUE *argv, VALUE klass)
203
+ {
204
+ VALUE ro, rout;
205
+ CArray *co, *cout;
206
+ ca_size_t k, c;
207
+ int64_t *o, *q, base, total;
208
+
209
+ ro = segment_bounds(argc, argv, "segment_index", &co, &k);
210
+ o = (int64_t *) co->ptr;
211
+
212
+ base = o[0];
213
+ total = o[k] - base;
214
+ {
215
+ ca_size_t dim[1];
216
+ dim[0] = (ca_size_t) total;
217
+ rout = rb_carray_new(CA_INT64, 1, dim, 0, NULL);
218
+ }
219
+ GetCArray(rout, cout);
220
+ q = (int64_t *) cout->ptr;
221
+ for (c = 0; c < k; c++) {
222
+ int64_t p = o[c] - base, e = o[c+1] - base;
223
+ for (; p < e; p++) {
224
+ q[p] = (int64_t) c;
225
+ }
226
+ }
227
+ RB_GC_GUARD(ro);
228
+ return rout;
229
+ }
230
+
231
+ /* CArray.__segment_boundaries_from_lengths_or_offsets__(name, lengths: l | offsets: o) -> int64[k+1]
232
+
233
+ Internal: the validated boundaries, for a Ruby caller that takes the same
234
+ two keywords (CArray#segments). `name` heads the error messages. */
235
+ static VALUE
236
+ rb_ca_s_segment_bounds (int argc, VALUE *argv, VALUE klass)
237
+ {
238
+ CArray *co;
239
+ ca_size_t k;
240
+ VALUE rname;
241
+ if ( argc < 1 ) {
242
+ rb_raise(rb_eArgError, "__segment_boundaries_from_lengths_or_offsets__: the caller's name is required");
243
+ }
244
+ rname = argv[0];
245
+ StringValue(rname);
246
+ return segment_bounds(argc - 1, argv + 1, RSTRING_PTR(rname), &co, &k);
247
+ }
248
+
249
+ void
250
+ Init_carray_segment (void)
251
+ {
252
+ id_lengths = rb_intern("lengths");
253
+ id_offsets = rb_intern("offsets");
254
+ rb_define_singleton_method(rb_cCArray, "segment_offsets", rb_ca_s_segment_offsets, -1);
255
+ rb_define_singleton_method(rb_cCArray, "segment_index", rb_ca_s_segment_index, -1);
256
+ rb_define_singleton_method(rb_cCArray, "__segment_boundaries_from_lengths_or_offsets__", rb_ca_s_segment_bounds, -1);
257
+ }