carray 1.2.0 → 1.3.0
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.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/ca_iter_block.c +32 -30
- data/ca_iter_dimension.c +24 -22
- data/ca_iter_window.c +25 -23
- data/ca_obj_array.c +58 -56
- data/ca_obj_bitarray.c +27 -27
- data/ca_obj_bitfield.c +46 -45
- data/ca_obj_block.c +77 -72
- data/ca_obj_fake.c +20 -20
- data/ca_obj_farray.c +22 -22
- data/ca_obj_field.c +31 -30
- data/ca_obj_grid.c +63 -62
- data/ca_obj_mapping.c +35 -32
- data/ca_obj_object.c +54 -54
- data/ca_obj_reduce.c +13 -13
- data/ca_obj_refer.c +42 -39
- data/ca_obj_repeat.c +50 -47
- data/ca_obj_select.c +24 -24
- data/ca_obj_shift.c +61 -58
- data/ca_obj_transpose.c +52 -51
- data/ca_obj_unbound_repeat.c +28 -27
- data/ca_obj_window.c +77 -72
- data/carray.gemspec +0 -2
- data/carray.h +190 -163
- data/carray_access.c +137 -136
- data/carray_attribute.c +24 -13
- data/carray_call_cfunc.c +21 -21
- data/carray_cast.c +106 -110
- data/carray_cast_func.rb +17 -17
- data/carray_class.c +3 -3
- data/carray_conversion.c +15 -15
- data/carray_copy.c +27 -27
- data/carray_core.c +22 -21
- data/carray_element.c +55 -47
- data/carray_generate.c +32 -32
- data/carray_iterator.c +36 -35
- data/carray_loop.c +37 -37
- data/carray_mask.c +21 -21
- data/carray_math.rb +18 -18
- data/carray_numeric.c +1 -1
- data/carray_operator.c +19 -18
- data/carray_order.c +30 -30
- data/carray_random.c +34 -32
- data/carray_sort_addr.c +12 -12
- data/carray_stat.c +127 -127
- data/carray_stat_proc.rb +152 -141
- data/carray_test.c +16 -16
- data/carray_utils.c +58 -56
- data/ext/calculus/carray_calculus.c +19 -20
- data/ext/calculus/carray_interp.c +12 -11
- data/ext/fortio/lib/fortio/fortran_sequential.rb +2 -2
- data/ext/fortio/ruby_fortio.c +1 -1
- data/ext/imagemap/carray_imagemap.c +14 -14
- data/ext/narray/ca_wrap_narray.c +30 -21
- data/extconf.rb +5 -0
- data/lib/carray/base/basic.rb +4 -3
- data/lib/carray/base/serialize.rb +3 -3
- data/lib/carray/graphics/gnuplot.rb +10 -7
- data/lib/carray/io/csv.rb +14 -9
- data/lib/carray/io/imagemagick.rb +7 -0
- data/lib/carray/io/sqlite3.rb +6 -4
- data/mkmath.rb +20 -20
- data/ruby_carray.c +2 -0
- data/ruby_ccomplex.c +3 -3
- data/test/test_130.rb +23 -0
- data/test/test_ALL.rb +2 -1
- data/test/test_order.rb +3 -3
- data/test/test_stat.rb +2 -2
- data/version.h +4 -4
- metadata +4 -37
- data/examples/ex001.rb +0 -10
- data/examples/test-int.rb +0 -13
- data/lib/carray/autoload/autoload_io_excel.rb +0 -5
- data/lib/carray/io/excel.rb +0 -26
@@ -15,9 +15,9 @@
|
|
15
15
|
#include <math.h>
|
16
16
|
|
17
17
|
static int
|
18
|
-
find_index (
|
18
|
+
find_index (ca_size_t n, double *y, double yy, ca_size_t *major, double *frac)
|
19
19
|
{
|
20
|
-
|
20
|
+
ca_size_t a, b, c, x1;
|
21
21
|
double ya, yb, yc;
|
22
22
|
double y1, y2;
|
23
23
|
|
@@ -33,7 +33,7 @@ find_index (int n, double *y, double yy, int *major, double *frac)
|
|
33
33
|
|
34
34
|
/* check for equally spaced scale */
|
35
35
|
|
36
|
-
a = (
|
36
|
+
a = (ca_size_t)((yy-y[0])/(y[n-1]-y[0])*(n-1));
|
37
37
|
|
38
38
|
if ( a >= 0 && a < n-1 ) {
|
39
39
|
if ( (y[a] - yy) * (y[a+1] - yy) <= 0 ) {
|
@@ -118,7 +118,7 @@ find_index (int n, double *y, double yy, int *major, double *frac)
|
|
118
118
|
*/
|
119
119
|
|
120
120
|
static int
|
121
|
-
linear_interp_loop (CArray *ca,
|
121
|
+
linear_interp_loop (CArray *ca, ca_size_t *major, double *frac,
|
122
122
|
int level, int32_t *idx, double wt, double *valp)
|
123
123
|
{
|
124
124
|
double tmp;
|
@@ -154,9 +154,9 @@ linear_interp_loop (CArray *ca, int *major, double *frac,
|
|
154
154
|
}
|
155
155
|
|
156
156
|
static double
|
157
|
-
linear_interp (CArray *ca,
|
157
|
+
linear_interp (CArray *ca, ca_size_t *major, double *frac)
|
158
158
|
{
|
159
|
-
|
159
|
+
ca_size_t idx[CA_RANK_MAX];
|
160
160
|
double value = 0;
|
161
161
|
linear_interp_loop(ca, major, frac, 0, idx, 1, &value);
|
162
162
|
return value;
|
@@ -171,12 +171,12 @@ If value[n] is NaN, the interpolation will be made for each index of the dimensi
|
|
171
171
|
static int
|
172
172
|
ca_interpolate_loop (CArray *ca, double **scale,
|
173
173
|
CArray **value,
|
174
|
-
|
174
|
+
ca_size_t *major, double *frac,
|
175
175
|
int level, double **dstp)
|
176
176
|
{
|
177
177
|
double val, frc;
|
178
|
-
|
179
|
-
|
178
|
+
ca_size_t maj;
|
179
|
+
ca_size_t i;
|
180
180
|
if ( level == ca->rank-1 ) {
|
181
181
|
if ( ! value[level] ) {
|
182
182
|
for (i=0; i<ca->dim[level]; i++) {
|
@@ -221,7 +221,7 @@ ca_interpolate_loop (CArray *ca, double **scale,
|
|
221
221
|
int
|
222
222
|
ca_interpolate (CArray *ca, double **scale, CArray **value, double *outp)
|
223
223
|
{
|
224
|
-
|
224
|
+
ca_size_t major[CA_RANK_MAX];
|
225
225
|
double frac[CA_RANK_MAX];
|
226
226
|
int status;
|
227
227
|
|
@@ -239,7 +239,8 @@ rb_ca_interpolate_bilinear (int argc, VALUE *argv, volatile VALUE self)
|
|
239
239
|
double *scales[CA_RANK_MAX];
|
240
240
|
CArray *values[CA_RANK_MAX];
|
241
241
|
CArray *scales_ca[CA_RANK_MAX];
|
242
|
-
|
242
|
+
int8_t out_rank;
|
243
|
+
ca_size_t out_dim[CA_RANK_MAX];
|
243
244
|
int i;
|
244
245
|
|
245
246
|
rb_scan_args(argc, argv, "2", &vscales, &vvalues);
|
@@ -114,7 +114,7 @@ class FortranSequential
|
|
114
114
|
case fmt = fmts.shift
|
115
115
|
when String
|
116
116
|
list = []
|
117
|
-
specs = fmt.scan(/(?:\d
|
117
|
+
specs = fmt.scan(/(?:\d+|)(?:a\[\d+\]|\w)/)
|
118
118
|
while not specs.empty?
|
119
119
|
case specs.shift
|
120
120
|
when /(\d+)?a\[(\d+)\]/
|
@@ -196,7 +196,7 @@ class FortranSequential
|
|
196
196
|
end
|
197
197
|
case fmt
|
198
198
|
when String
|
199
|
-
specs = fmt.scan(/(?:\d
|
199
|
+
specs = fmt.scan(/(?:\d+|)(?:a\[\d+\]|\w)/)
|
200
200
|
while not specs.empty?
|
201
201
|
case specs.shift
|
202
202
|
when /(\d+)?a\[(\d+)\]/
|
data/ext/fortio/ruby_fortio.c
CHANGED
@@ -36,7 +36,7 @@ rb_ff_read_F (VALUE mod, VALUE vbuffer, VALUE vscale, VALUE vlength, VALUE vprec
|
|
36
36
|
{
|
37
37
|
double val;
|
38
38
|
int status;
|
39
|
-
status = read_F(StringValuePtr(vbuffer), RSTRING_LEN(vbuffer),
|
39
|
+
status = read_F(StringValuePtr(vbuffer), (int) RSTRING_LEN(vbuffer),
|
40
40
|
NUM2INT(vscale), NUM2INT(vlength), NUM2INT(vprec), &val);
|
41
41
|
if ( ! status ) {
|
42
42
|
rb_raise(rb_eRuntimeError, "invalid string for F descriptor");
|
@@ -37,9 +37,9 @@ static void
|
|
37
37
|
draw_linex (CArray *ca, float x0, float y0, float x1, float y1, char *ptr)
|
38
38
|
{
|
39
39
|
float x, y;
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
ca_size_t ix, iy;
|
41
|
+
ca_size_t dim0 = ca->dim[0];
|
42
|
+
ca_size_t dim1 = ca->dim[1];
|
43
43
|
float a = (y1-y0)/(x1-x0);
|
44
44
|
for (x=x0; x<x1; x+=1) {
|
45
45
|
y = a*(x-x0)+y0;
|
@@ -56,9 +56,9 @@ static void
|
|
56
56
|
draw_liney (CArray *ca, float x0, float y0, float x1, float y1, char *ptr)
|
57
57
|
{
|
58
58
|
float x, y;
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
ca_size_t ix, iy;
|
60
|
+
ca_size_t dim0 = ca->dim[0];
|
61
|
+
ca_size_t dim1 = ca->dim[1];
|
62
62
|
float a = (x1-x0)/(y1-y0);
|
63
63
|
for (y=y0; y<y1; y+=1) {
|
64
64
|
x = a*(y-y0)+x0;
|
@@ -136,8 +136,8 @@ fill_rect (CArray *image, float x[4], float y[4], char *ptr)
|
|
136
136
|
CArray *mask;
|
137
137
|
float xmin, xmax, ymin, ymax;
|
138
138
|
float gx[4], gy[4];
|
139
|
-
|
140
|
-
|
139
|
+
ca_size_t dim[2];
|
140
|
+
ca_size_t i, j, ixmin, iymin, ixmax, iymax;
|
141
141
|
char one = 1;
|
142
142
|
|
143
143
|
xmin = x[0];
|
@@ -162,11 +162,11 @@ fill_rect (CArray *image, float x[4], float y[4], char *ptr)
|
|
162
162
|
}
|
163
163
|
}
|
164
164
|
|
165
|
-
ixmin = (
|
166
|
-
iymin = (
|
165
|
+
ixmin = (ca_size_t) floor(xmin);
|
166
|
+
iymin = (ca_size_t) floor(ymin);
|
167
167
|
|
168
|
-
ixmax = (
|
169
|
-
iymax = (
|
168
|
+
ixmax = (ca_size_t) ceil(xmax) + 1;
|
169
|
+
iymax = (ca_size_t) ceil(ymax) + 1;
|
170
170
|
|
171
171
|
dim[0] = ixmax - ixmin + 1;
|
172
172
|
dim[1] = iymax - iymin + 1;
|
@@ -240,7 +240,7 @@ rb_im_fill_rect (VALUE self,
|
|
240
240
|
}
|
241
241
|
|
242
242
|
void
|
243
|
-
draw_hline_gradation (CArray *image,
|
243
|
+
draw_hline_gradation (CArray *image, ca_size_t iy,
|
244
244
|
float x0, float x1, float z0, float z1);
|
245
245
|
|
246
246
|
static VALUE
|
@@ -251,7 +251,7 @@ rb_img_draw_hline_gradation (VALUE self, VALUE viy,
|
|
251
251
|
|
252
252
|
Data_Get_Struct(self, CArray, image);
|
253
253
|
|
254
|
-
draw_hline_gradation(image,
|
254
|
+
draw_hline_gradation(image, NUM2SIZE(viy),
|
255
255
|
NUM2DBL(vx0), NUM2DBL(vx1), NUM2DBL(vz0), NUM2DBL(vz1));
|
256
256
|
|
257
257
|
return Qnil;
|
data/ext/narray/ca_wrap_narray.c
CHANGED
@@ -123,7 +123,7 @@ rb_cary_na_ref_new_i (int argc, VALUE *argv, VALUE self, VALUE klass)
|
|
123
123
|
{
|
124
124
|
CArray *orig;
|
125
125
|
struct NARRAY *ary;
|
126
|
-
|
126
|
+
int8_t i;
|
127
127
|
|
128
128
|
Data_Get_Struct(self, CArray, orig);
|
129
129
|
|
@@ -147,20 +147,20 @@ rb_cary_na_ref_new_i (int argc, VALUE *argv, VALUE self, VALUE klass)
|
|
147
147
|
ary->rank = orig->rank;
|
148
148
|
ary->shape = ALLOC_N(int, ary->rank);
|
149
149
|
for (i=0; i<ary->rank; i++) {
|
150
|
-
ary->shape[i] = orig->dim[ary->rank-1-i];
|
150
|
+
ary->shape[i] = (int) orig->dim[ary->rank-1-i];
|
151
151
|
}
|
152
|
-
ary->total = orig->elements;
|
152
|
+
ary->total = (int) orig->elements;
|
153
153
|
ary->ptr = orig->ptr;
|
154
154
|
}
|
155
155
|
else {
|
156
|
-
|
156
|
+
ca_size_t elements = 1;
|
157
157
|
ary->rank = argc;
|
158
158
|
ary->shape = ALLOC_N(int, ary->rank);
|
159
159
|
for (i=0; i<ary->rank; i++) {
|
160
160
|
ary->shape[i] = NUM2INT(argv[i]);
|
161
161
|
elements *= ary->shape[i];
|
162
162
|
}
|
163
|
-
ary->total = elements;
|
163
|
+
ary->total = (int) elements;
|
164
164
|
ary->ptr = orig->ptr;
|
165
165
|
if ( elements != orig->elements ) {
|
166
166
|
free(ary->shape);
|
@@ -221,7 +221,14 @@ rb_cary_to_na_bang_i (VALUE self, VALUE klass)
|
|
221
221
|
obj = na_make_empty(type, klass);
|
222
222
|
}
|
223
223
|
else {
|
224
|
-
|
224
|
+
int shape[127];
|
225
|
+
int i;
|
226
|
+
|
227
|
+
for (i=0; i<ca->rank; i++) {
|
228
|
+
shape[i] = (int) ca->dim[ca->rank-i-1];
|
229
|
+
}
|
230
|
+
|
231
|
+
obj = na_make_object(type, ca->rank, shape, klass);
|
225
232
|
GetNArray(obj, na);
|
226
233
|
|
227
234
|
fary = rb_ca_farray(self);
|
@@ -281,13 +288,15 @@ rb_cary_to_na_i (VALUE self, VALUE klass)
|
|
281
288
|
obj = na_make_empty(type, klass);
|
282
289
|
}
|
283
290
|
else {
|
284
|
-
|
285
|
-
|
286
|
-
|
291
|
+
int shape[127];
|
292
|
+
|
287
293
|
for (i=0; i<ca->rank; i++) {
|
288
|
-
|
294
|
+
shape[i] = (int) ca->dim[ca->rank-i-1];
|
289
295
|
}
|
290
296
|
|
297
|
+
obj = na_make_object(type, ca->rank, shape, klass);
|
298
|
+
GetNArray(obj, na);
|
299
|
+
|
291
300
|
ca_copy_data(ca, na->ptr);
|
292
301
|
}
|
293
302
|
|
@@ -337,7 +346,7 @@ rb_na_ca_ref_new (int argc, VALUE *argv, VALUE self)
|
|
337
346
|
{
|
338
347
|
volatile VALUE obj;
|
339
348
|
struct NARRAY *na;
|
340
|
-
|
349
|
+
ca_size_t dim[CA_RANK_MAX];
|
341
350
|
int8_t data_type;
|
342
351
|
int i;
|
343
352
|
|
@@ -346,7 +355,7 @@ rb_na_ca_ref_new (int argc, VALUE *argv, VALUE self)
|
|
346
355
|
data_type = na_typecode_to_ca_data_type(na->type);
|
347
356
|
|
348
357
|
if ( na->total == 0 ) {
|
349
|
-
|
358
|
+
ca_size_t zero = 0;
|
350
359
|
obj = rb_carray_wrap_ptr(data_type, 1, &zero, 0, NULL,
|
351
360
|
&EMPTY_ARRAY_PTR, self); /* avoid ca->ptr == NULL */
|
352
361
|
}
|
@@ -387,16 +396,16 @@ rb_na_to_ca (VALUE self)
|
|
387
396
|
volatile VALUE obj;
|
388
397
|
CArray *ca;
|
389
398
|
struct NARRAY *na;
|
390
|
-
|
391
|
-
|
392
|
-
|
399
|
+
ca_size_t dim[CA_RANK_MAX];
|
400
|
+
ca_size_t data_type;
|
401
|
+
ca_size_t i;
|
393
402
|
|
394
403
|
GetNArray(self, na);
|
395
404
|
|
396
405
|
data_type = na_typecode_to_ca_data_type(na->type);
|
397
406
|
|
398
407
|
if ( na->total == 0 ) {
|
399
|
-
|
408
|
+
ca_size_t zero = 0;
|
400
409
|
obj = rb_carray_new(data_type, 1, &zero, 0, NULL);
|
401
410
|
}
|
402
411
|
else {
|
@@ -430,16 +439,16 @@ rb_na_to_ca_bang (VALUE self)
|
|
430
439
|
volatile VALUE obj, fary;
|
431
440
|
CArray *ca;
|
432
441
|
struct NARRAY *na;
|
433
|
-
|
434
|
-
|
435
|
-
|
442
|
+
ca_size_t dim[CA_RANK_MAX];
|
443
|
+
ca_size_t data_type;
|
444
|
+
ca_size_t i;
|
436
445
|
|
437
446
|
GetNArray(self, na);
|
438
447
|
|
439
448
|
data_type = na_typecode_to_ca_data_type(na->type);
|
440
449
|
|
441
450
|
if ( na->total == 0 ) {
|
442
|
-
|
451
|
+
ca_size_t zero = 0;
|
443
452
|
obj = rb_carray_new(data_type, 1, &zero, 0, NULL);
|
444
453
|
}
|
445
454
|
else {
|
@@ -449,7 +458,7 @@ rb_na_to_ca_bang (VALUE self)
|
|
449
458
|
dim[i] = na->shape[na->rank-i-1];
|
450
459
|
}
|
451
460
|
|
452
|
-
obj = rb_carray_new(data_type, na->rank,
|
461
|
+
obj = rb_carray_new(data_type, na->rank, dim, 0, NULL);
|
453
462
|
fary = rb_ca_farray(obj);
|
454
463
|
Data_Get_Struct(fary, CArray, ca);
|
455
464
|
|
data/extconf.rb
CHANGED
@@ -68,6 +68,8 @@ end
|
|
68
68
|
|
69
69
|
$CFLAGS += " -Wall -O2"
|
70
70
|
# $CFLAGS += " -m128bit-long-double" ### gcc only
|
71
|
+
# $CFLAGS += " -Wno-absolute-value"
|
72
|
+
# $LDFLAGS += " -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib"
|
71
73
|
|
72
74
|
# --- check data types
|
73
75
|
|
@@ -118,6 +120,9 @@ else
|
|
118
120
|
have_type("long long", header)
|
119
121
|
have_type("float", header)
|
120
122
|
have_type("double", header)
|
123
|
+
if have_type("long double", header)
|
124
|
+
check_sizeof("long double")
|
125
|
+
end
|
121
126
|
if have_header("complex.h")
|
122
127
|
complex_h = "complex.h"
|
123
128
|
have_type("float complex", complex_h)
|
data/lib/carray/base/basic.rb
CHANGED
@@ -20,7 +20,7 @@ end
|
|
20
20
|
|
21
21
|
class Array # :nodoc:
|
22
22
|
def +@
|
23
|
-
return
|
23
|
+
return CA_SIZE(self)
|
24
24
|
end
|
25
25
|
def to_ca
|
26
26
|
return CA_OBJECT(self)
|
@@ -29,7 +29,7 @@ end
|
|
29
29
|
|
30
30
|
class Range # :nodoc:
|
31
31
|
def +@
|
32
|
-
return
|
32
|
+
return CA_SIZE(self)
|
33
33
|
end
|
34
34
|
def to_ca
|
35
35
|
return CA_OBJECT(self)
|
@@ -149,6 +149,7 @@ end
|
|
149
149
|
"CA_DOUBLE",
|
150
150
|
"CA_COMPLEX",
|
151
151
|
"CA_DCOMPLEX",
|
152
|
+
"CA_SIZE",
|
152
153
|
].each do |name|
|
153
154
|
eval %{
|
154
155
|
def #{name} (*val)
|
@@ -920,7 +921,7 @@ class CArray
|
|
920
921
|
def self.join (*argv)
|
921
922
|
# get options
|
922
923
|
case argv.first
|
923
|
-
when
|
924
|
+
when Integer, Symbol, String
|
924
925
|
type, = *CArray.guess_type_and_bytes(argv.shift, 0)
|
925
926
|
else
|
926
927
|
type = argv.flatten.first.data_type
|
@@ -53,11 +53,11 @@ class CArray::Serializer # :nodoc:
|
|
53
53
|
char_p :data_type_name, :bytes=>8
|
54
54
|
char_p :endian, :bytes=>4
|
55
55
|
int32 :data_type
|
56
|
-
|
56
|
+
int64 :bytes
|
57
57
|
int32 :rank
|
58
|
-
|
58
|
+
int64 :elements
|
59
59
|
int32 :has_mask
|
60
|
-
array :dim, :type => CArray.
|
60
|
+
array :dim, :type => CArray.int64(CA_RANK_MAX)
|
61
61
|
int32 :has_attr
|
62
62
|
}
|
63
63
|
|
@@ -511,13 +511,13 @@ class CA::Gnuplot # :nodoc:
|
|
511
511
|
list = list.clone
|
512
512
|
conf = []
|
513
513
|
while not list.empty? and
|
514
|
-
( list.last.is_a?(
|
514
|
+
( list.last.is_a?(Integer) or
|
515
515
|
list.last.is_a?(Symbol) or
|
516
516
|
list.last.is_a?(String) or
|
517
517
|
list.last.nil? )
|
518
518
|
conf.unshift(list.pop)
|
519
519
|
end
|
520
|
-
if conf.last.is_a?(
|
520
|
+
if conf.last.is_a?(Integer)
|
521
521
|
idx = conf.pop
|
522
522
|
case idx
|
523
523
|
when 1,2
|
@@ -1920,17 +1920,21 @@ __EOD__
|
|
1920
1920
|
end
|
1921
1921
|
|
1922
1922
|
lines = text.split("\n").map{|line| line.strip }
|
1923
|
-
|
1924
|
-
model = "
|
1923
|
+
|
1924
|
+
model = "HSV"
|
1925
1925
|
entries = []
|
1926
1926
|
lines.each do |line|
|
1927
1927
|
case line
|
1928
|
-
when /\A\#\s*COLOR_MODEL\s*=\s
|
1928
|
+
when /\A\#\s*COLOR_MODEL\s*=\s*(.+)\s*\Z/
|
1929
1929
|
model = $1.upcase
|
1930
1930
|
when /\A\Z/, /\A#/, /\A([FBN])\s*(.*)\Z/
|
1931
1931
|
next
|
1932
1932
|
else
|
1933
|
-
|
1933
|
+
list = line.split(/\s+/)
|
1934
|
+
list[1] = list[1].split(/\-/)
|
1935
|
+
list[3] = list[3].split(/\-/)
|
1936
|
+
list = list.flatten.map{|x| x.to_f}
|
1937
|
+
entries.push(list)
|
1934
1938
|
end
|
1935
1939
|
end
|
1936
1940
|
|
@@ -1946,7 +1950,6 @@ __EOD__
|
|
1946
1950
|
color[level, nil] = entry[5, 3]
|
1947
1951
|
level += 1
|
1948
1952
|
end
|
1949
|
-
|
1950
1953
|
if model =~ /HSV/
|
1951
1954
|
color[nil, 0] /= 360
|
1952
1955
|
else
|
data/lib/carray/io/csv.rb
CHANGED
@@ -381,14 +381,15 @@ module CA
|
|
381
381
|
|
382
382
|
class CSVWriter # :nodoc:
|
383
383
|
|
384
|
-
def initialize (sep=",", rs=$/, &block)
|
384
|
+
def initialize (sep=",", rs=$/, fill="", &block)
|
385
385
|
@block = block
|
386
386
|
@sep = sep
|
387
387
|
@rs = rs
|
388
|
+
@fill = fill
|
388
389
|
end
|
389
390
|
|
390
391
|
def write_io (table, io)
|
391
|
-
return Processor.new(table, io, @sep, @rs, &@block).run
|
392
|
+
return Processor.new(table, io, @sep, @rs, @fill, &@block).run
|
392
393
|
end
|
393
394
|
|
394
395
|
def write_string (table, string)
|
@@ -404,10 +405,11 @@ module CA
|
|
404
405
|
|
405
406
|
class Processor # :nodoc:
|
406
407
|
|
407
|
-
def initialize (table, io, sep, rs, &block)
|
408
|
+
def initialize (table, io, sep, rs, fill, &block)
|
408
409
|
@io = io
|
409
410
|
@sep = sep
|
410
411
|
@rs = rs
|
412
|
+
@fill = fill
|
411
413
|
@block = block || proc { body }
|
412
414
|
if table.has_data_class?
|
413
415
|
@names = table.members
|
@@ -426,6 +428,9 @@ module CA
|
|
426
428
|
@table = table.object ### convert to CA_OBJECT
|
427
429
|
end
|
428
430
|
end
|
431
|
+
if @table.has_mask?
|
432
|
+
@table.unmask(@fill)
|
433
|
+
end
|
429
434
|
@regexp_simple = /#{@sep}/o
|
430
435
|
end
|
431
436
|
|
@@ -532,15 +537,15 @@ class CArray
|
|
532
537
|
end
|
533
538
|
end
|
534
539
|
|
535
|
-
def save_csv (file, option = {}, rs: $/, sep: ",", mode: "w", &block)
|
536
|
-
option = {:sep=>sep, :rs=>rs, :mode=>mode}.update(option)
|
537
|
-
writer = CA::CSVWriter.new(option[:sep], option[:rs], &block)
|
540
|
+
def save_csv (file, option = {}, rs: $/, sep: ",", fill: "", mode: "w", &block)
|
541
|
+
option = {:sep=>sep, :rs=>rs, :fill=>fill, :mode=>mode}.update(option)
|
542
|
+
writer = CA::CSVWriter.new(option[:sep], option[:rs], option[:fill], &block)
|
538
543
|
return writer.write_file(self, file, option[:mode])
|
539
544
|
end
|
540
545
|
|
541
|
-
def to_csv (io="", option ={}, rs: $/, sep: ",", &block)
|
542
|
-
option = {:sep=>sep, :rs=>rs}.update(option)
|
543
|
-
writer = CA::CSVWriter.new(option[:sep], option[:rs], &block)
|
546
|
+
def to_csv (io="", option ={}, rs: $/, sep: ",", fill: "", &block)
|
547
|
+
option = {:sep=>sep, :rs=>rs, :fill=>fill}.update(option)
|
548
|
+
writer = CA::CSVWriter.new(option[:sep], option[:rs], option[:fill], &block)
|
544
549
|
case io
|
545
550
|
when IO, StringIO
|
546
551
|
return writer.write_io(self, io)
|