carray 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/ca_obj_bitarray.c
CHANGED
@@ -17,17 +17,17 @@ typedef struct {
|
|
17
17
|
int8_t data_type;
|
18
18
|
int8_t rank;
|
19
19
|
int32_t flags;
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
ca_size_t bytes;
|
21
|
+
ca_size_t elements;
|
22
|
+
ca_size_t *dim;
|
23
23
|
char *ptr;
|
24
24
|
CArray *mask;
|
25
25
|
CArray *parent;
|
26
26
|
uint32_t attach;
|
27
27
|
uint8_t nosync;
|
28
28
|
/* -------------*/
|
29
|
-
|
30
|
-
|
29
|
+
ca_size_t bytelen;
|
30
|
+
ca_size_t bitlen;
|
31
31
|
} CABitarray;
|
32
32
|
|
33
33
|
static int8_t CA_OBJ_BITARRAY;
|
@@ -56,7 +56,7 @@ int
|
|
56
56
|
ca_bitarray_setup (CABitarray *ca, CArray *parent)
|
57
57
|
{
|
58
58
|
int8_t rank;
|
59
|
-
|
59
|
+
ca_size_t bitlen, elements;
|
60
60
|
|
61
61
|
/* check arguments */
|
62
62
|
|
@@ -76,7 +76,7 @@ ca_bitarray_setup (CABitarray *ca, CArray *parent)
|
|
76
76
|
ca->elements = elements;
|
77
77
|
ca->ptr = NULL;
|
78
78
|
ca->mask = NULL;
|
79
|
-
ca->dim = ALLOC_N(
|
79
|
+
ca->dim = ALLOC_N(ca_size_t, rank);
|
80
80
|
|
81
81
|
ca->parent = parent;
|
82
82
|
ca->attach = 0;
|
@@ -85,7 +85,7 @@ ca_bitarray_setup (CABitarray *ca, CArray *parent)
|
|
85
85
|
ca->bytelen = parent->bytes;
|
86
86
|
ca->bitlen = bitlen;
|
87
87
|
|
88
|
-
memcpy(ca->dim, parent->dim, (rank-1) * sizeof(
|
88
|
+
memcpy(ca->dim, parent->dim, (rank-1) * sizeof(ca_size_t));
|
89
89
|
ca->dim[rank-1] = bitlen;
|
90
90
|
|
91
91
|
if ( ca_has_mask(parent) ) {
|
@@ -128,7 +128,7 @@ ca_bitarray_func_clone (void *ap)
|
|
128
128
|
}
|
129
129
|
|
130
130
|
static char *
|
131
|
-
ca_bitarray_func_ptr_at_addr (void *ap,
|
131
|
+
ca_bitarray_func_ptr_at_addr (void *ap, ca_size_t addr)
|
132
132
|
{
|
133
133
|
CABitarray *ca = (CABitarray *) ap;
|
134
134
|
if ( ! ca->ptr ) {
|
@@ -141,7 +141,7 @@ ca_bitarray_func_ptr_at_addr (void *ap, int32_t addr)
|
|
141
141
|
}
|
142
142
|
|
143
143
|
static char *
|
144
|
-
ca_bitarray_func_ptr_at_index (void *ap,
|
144
|
+
ca_bitarray_func_ptr_at_index (void *ap, ca_size_t *idx)
|
145
145
|
{
|
146
146
|
CABitarray *ca = (CABitarray *) ap;
|
147
147
|
if ( ! ca->ptr ) {
|
@@ -154,13 +154,13 @@ ca_bitarray_func_ptr_at_index (void *ap, int32_t *idx)
|
|
154
154
|
}
|
155
155
|
|
156
156
|
static void
|
157
|
-
ca_bitarray_func_fetch_index (void *ap,
|
157
|
+
ca_bitarray_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
|
158
158
|
{
|
159
159
|
CABitarray *ca = (CABitarray *) ap;
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
160
|
+
ca_size_t bytes = ca->parent->bytes;
|
161
|
+
ca_size_t offset = idx[ca->rank-1];
|
162
|
+
ca_size_t major, minor;
|
163
|
+
|
164
164
|
if ( ca_endian == CA_BIG_ENDIAN &&
|
165
165
|
ca->parent->bytes != 1 &&
|
166
166
|
( ! ca_is_fixlen_type(ca->parent) ) ) {
|
@@ -186,13 +186,13 @@ ca_bitarray_func_fetch_index (void *ap, int32_t *idx, void *ptr)
|
|
186
186
|
}
|
187
187
|
|
188
188
|
static void
|
189
|
-
ca_bitarray_func_store_index (void *ap,
|
189
|
+
ca_bitarray_func_store_index (void *ap, ca_size_t *idx, void *ptr)
|
190
190
|
{
|
191
191
|
CABitarray *ca = (CABitarray *) ap;
|
192
192
|
uint8_t test = *(uint8_t *) ptr;
|
193
|
-
|
194
|
-
|
195
|
-
|
193
|
+
ca_size_t offset = idx[ca->rank-1];
|
194
|
+
ca_size_t bytes = ca->parent->bytes;
|
195
|
+
ca_size_t major, minor;
|
196
196
|
|
197
197
|
if ( ca_endian == CA_BIG_ENDIAN &&
|
198
198
|
ca->parent->bytes != 1 &&
|
@@ -307,8 +307,8 @@ static void
|
|
307
307
|
ca_bitarray_func_create_mask (void *ap)
|
308
308
|
{
|
309
309
|
CABitarray *ca = (CABitarray *) ap;
|
310
|
-
|
311
|
-
|
310
|
+
ca_size_t count[CA_RANK_MAX];
|
311
|
+
int8_t i;
|
312
312
|
|
313
313
|
for (i=0; i<ca->rank-1; i++) {
|
314
314
|
count[i] = 0;
|
@@ -354,9 +354,9 @@ ca_bitarray_attach (CABitarray *ca)
|
|
354
354
|
uint8_t *q = (uint8_t *)ca_ptr_at_addr(ca->parent, 0);
|
355
355
|
uint8_t *r;
|
356
356
|
uint8_t rr;
|
357
|
-
|
358
|
-
|
359
|
-
|
357
|
+
ca_size_t elements = ca->parent->elements;
|
358
|
+
ca_size_t bytes = ca->parent->bytes;
|
359
|
+
ca_size_t n, m;
|
360
360
|
if ( ca_endian == CA_BIG_ENDIAN &&
|
361
361
|
ca->parent->bytes != 1 &&
|
362
362
|
( ! ca_is_fixlen_type(ca->parent) ) ) {
|
@@ -401,9 +401,9 @@ ca_bitarray_sync (CABitarray *ca)
|
|
401
401
|
boolean8_t *p = (boolean8_t *)ca_ptr_at_addr(ca, 0);
|
402
402
|
uint8_t *q = (uint8_t *)ca_ptr_at_addr(ca->parent, 0);
|
403
403
|
uint8_t *r;
|
404
|
-
|
405
|
-
|
406
|
-
|
404
|
+
ca_size_t elements = ca->parent->elements;
|
405
|
+
ca_size_t bytes = ca->parent->bytes;
|
406
|
+
ca_size_t n, m, i;
|
407
407
|
if ( ca_endian == CA_BIG_ENDIAN &&
|
408
408
|
ca->parent->bytes != 1 &&
|
409
409
|
( ! ca_is_fixlen_type(ca->parent) ) ) {
|
data/ca_obj_bitfield.c
CHANGED
@@ -17,18 +17,18 @@ typedef struct {
|
|
17
17
|
int8_t data_type;
|
18
18
|
int8_t rank;
|
19
19
|
int32_t flags;
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
ca_size_t bytes;
|
21
|
+
ca_size_t elements;
|
22
|
+
ca_size_t *dim;
|
23
23
|
char *ptr;
|
24
24
|
CArray *mask;
|
25
25
|
CArray *parent;
|
26
26
|
uint32_t attach;
|
27
27
|
uint8_t nosync;
|
28
28
|
/* -------------*/
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
ca_size_t byte_offset;
|
30
|
+
ca_size_t bit_offset;
|
31
|
+
uint64_t bit_mask;
|
32
32
|
} CABitfield;
|
33
33
|
|
34
34
|
static int8_t CA_OBJ_BITFIELD;
|
@@ -40,12 +40,12 @@ static VALUE rb_cCABitfield;
|
|
40
40
|
end
|
41
41
|
*/
|
42
42
|
|
43
|
-
static
|
44
|
-
bitfield_bitlen (
|
43
|
+
static ca_size_t
|
44
|
+
bitfield_bitlen (uint64_t bit_mask, ca_size_t bytes)
|
45
45
|
{
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
ca_size_t bitsize = bytes * 8;
|
47
|
+
ca_size_t count = 0;
|
48
|
+
ca_size_t i;
|
49
49
|
for (i=0; i<bitsize; i++) {
|
50
50
|
if ( ( bit_mask >> i ) & 1 ) {
|
51
51
|
count++;
|
@@ -55,12 +55,12 @@ bitfield_bitlen (uint32_t bit_mask, int32_t bytes)
|
|
55
55
|
}
|
56
56
|
|
57
57
|
static void
|
58
|
-
bitfield_fetch(char *dst,
|
59
|
-
char *src,
|
60
|
-
|
61
|
-
|
58
|
+
bitfield_fetch(char *dst, ca_size_t dbytes,
|
59
|
+
char *src, ca_size_t sbytes,
|
60
|
+
ca_size_t byte_offset, ca_size_t bit_offset, uint64_t bit_mask,
|
61
|
+
ca_size_t elements)
|
62
62
|
{
|
63
|
-
|
63
|
+
ca_size_t k;
|
64
64
|
switch ( dbytes ) {
|
65
65
|
case 1: {
|
66
66
|
char *p;
|
@@ -128,12 +128,12 @@ bitfield_fetch(char *dst, int dbytes,
|
|
128
128
|
}
|
129
129
|
|
130
130
|
static void
|
131
|
-
bitfield_store(char *src,
|
132
|
-
char *dst,
|
133
|
-
|
134
|
-
|
131
|
+
bitfield_store(char *src, ca_size_t sbytes,
|
132
|
+
char *dst, ca_size_t dbytes,
|
133
|
+
ca_size_t byte_offset, ca_size_t bit_offset, uint64_t bit_mask,
|
134
|
+
ca_size_t elements)
|
135
135
|
{
|
136
|
-
|
136
|
+
ca_size_t k;
|
137
137
|
switch ( dbytes ) {
|
138
138
|
case 1: {
|
139
139
|
char *q;
|
@@ -209,16 +209,16 @@ bitfield_store(char *src, int sbytes,
|
|
209
209
|
|
210
210
|
int
|
211
211
|
ca_bitfield_setup (CABitfield *ca, CArray *parent,
|
212
|
-
|
212
|
+
ca_size_t offset, ca_size_t bitlen)
|
213
213
|
{
|
214
214
|
int8_t rank;
|
215
215
|
int8_t data_type;
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
216
|
+
ca_size_t bytes = 0, elements;
|
217
|
+
ca_size_t bitsize;
|
218
|
+
ca_size_t byte_offset;
|
219
|
+
ca_size_t bit_offset;
|
220
|
+
uint64_t bit_mask;
|
221
|
+
ca_size_t i;
|
222
222
|
|
223
223
|
/* check arguments */
|
224
224
|
|
@@ -298,7 +298,7 @@ ca_bitfield_setup (CABitfield *ca, CArray *parent,
|
|
298
298
|
ca->elements = elements;
|
299
299
|
ca->ptr = NULL;
|
300
300
|
ca->mask = NULL;
|
301
|
-
ca->dim = ALLOC_N(
|
301
|
+
ca->dim = ALLOC_N(ca_size_t, rank);
|
302
302
|
|
303
303
|
ca->parent = parent;
|
304
304
|
ca->attach = 0;
|
@@ -308,7 +308,7 @@ ca_bitfield_setup (CABitfield *ca, CArray *parent,
|
|
308
308
|
ca->bit_offset = bit_offset;
|
309
309
|
ca->bit_mask = bit_mask;
|
310
310
|
|
311
|
-
memcpy(ca->dim, parent->dim, rank * sizeof(
|
311
|
+
memcpy(ca->dim, parent->dim, rank * sizeof(ca_size_t));
|
312
312
|
|
313
313
|
if ( ca_has_mask(parent) ) {
|
314
314
|
ca_create_mask(ca);
|
@@ -318,7 +318,7 @@ ca_bitfield_setup (CABitfield *ca, CArray *parent,
|
|
318
318
|
}
|
319
319
|
|
320
320
|
CABitfield *
|
321
|
-
ca_bitfield_new (CArray *parent,
|
321
|
+
ca_bitfield_new (CArray *parent, ca_size_t offset, ca_size_t bitlen)
|
322
322
|
{
|
323
323
|
CABitfield *ca = ALLOC(CABitfield);
|
324
324
|
ca_bitfield_setup(ca, parent, offset, bitlen);
|
@@ -352,7 +352,7 @@ ca_bitfield_func_clone (void *ap)
|
|
352
352
|
}
|
353
353
|
|
354
354
|
static char *
|
355
|
-
ca_bitfield_func_ptr_at_addr (void *ap,
|
355
|
+
ca_bitfield_func_ptr_at_addr (void *ap, ca_size_t addr)
|
356
356
|
{
|
357
357
|
CABitfield *ca = (CABitfield *) ap;
|
358
358
|
if ( ! ca->ptr ) {
|
@@ -365,7 +365,7 @@ ca_bitfield_func_ptr_at_addr (void *ap, int32_t addr)
|
|
365
365
|
}
|
366
366
|
|
367
367
|
static char *
|
368
|
-
ca_bitfield_func_ptr_at_index (void *ap,
|
368
|
+
ca_bitfield_func_ptr_at_index (void *ap, ca_size_t *idx)
|
369
369
|
{
|
370
370
|
CABitfield *ca = (CABitfield *) ap;
|
371
371
|
if ( ! ca->ptr ) {
|
@@ -378,7 +378,7 @@ ca_bitfield_func_ptr_at_index (void *ap, int32_t *idx)
|
|
378
378
|
}
|
379
379
|
|
380
380
|
static void
|
381
|
-
ca_bitfield_func_fetch_index (void *ap,
|
381
|
+
ca_bitfield_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
|
382
382
|
{
|
383
383
|
CABitfield *ca = (CABitfield *) ap;
|
384
384
|
char *v = xmalloc(ca->parent->bytes);
|
@@ -390,7 +390,7 @@ ca_bitfield_func_fetch_index (void *ap, int32_t *idx, void *ptr)
|
|
390
390
|
}
|
391
391
|
|
392
392
|
static void
|
393
|
-
ca_bitfield_func_store_index (void *ap,
|
393
|
+
ca_bitfield_func_store_index (void *ap, ca_size_t *idx, void *ptr)
|
394
394
|
{
|
395
395
|
CABitfield *ca = (CABitfield *) ap;
|
396
396
|
char *v = xmalloc(ca->parent->bytes);
|
@@ -529,12 +529,12 @@ static void
|
|
529
529
|
ca_bitfield_fill (CABitfield *ca, char *ptr)
|
530
530
|
{
|
531
531
|
char *q = ca->parent->ptr;
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
532
|
+
ca_size_t bytesp = ca->bytes;
|
533
|
+
ca_size_t bytesq = ca->parent->bytes;
|
534
|
+
ca_size_t byte_offset = ca->byte_offset;
|
535
|
+
ca_size_t bit_offset = ca->bit_offset;
|
536
|
+
uint64_t bit_mask = ca->bit_mask;
|
537
|
+
ca_size_t i;
|
538
538
|
|
539
539
|
for (i=0; i<ca->elements; i++) {
|
540
540
|
bitfield_store(ptr, bytesp, q, bytesq,
|
@@ -546,7 +546,7 @@ ca_bitfield_fill (CABitfield *ca, char *ptr)
|
|
546
546
|
/* ------------------------------------------------------------------- */
|
547
547
|
|
548
548
|
VALUE
|
549
|
-
rb_ca_bitfield_new (VALUE cary,
|
549
|
+
rb_ca_bitfield_new (VALUE cary, ca_size_t offset, ca_size_t bitlen)
|
550
550
|
{
|
551
551
|
volatile VALUE obj;
|
552
552
|
CArray *parent;
|
@@ -571,10 +571,11 @@ rb_ca_bitfield (int argc, VALUE *argv, VALUE self)
|
|
571
571
|
{
|
572
572
|
volatile VALUE rrange, rtype;
|
573
573
|
CArray *ca;
|
574
|
-
|
575
|
-
int
|
574
|
+
ca_size_t offset, bitlen, step;
|
575
|
+
int data_type = CA_NONE;
|
576
|
+
ca_size_t bitsize;
|
576
577
|
|
577
|
-
rb_scan_args(argc, argv, "11", &rrange, &rtype);
|
578
|
+
rb_scan_args(argc, argv, "11", (VALUE *) &rrange, (VALUE *) &rtype);
|
578
579
|
|
579
580
|
Data_Get_Struct(self, CArray, ca);
|
580
581
|
|
data/ca_obj_block.c
CHANGED
@@ -20,13 +20,13 @@ VALUE rb_cCABlock;
|
|
20
20
|
*/
|
21
21
|
|
22
22
|
static int
|
23
|
-
ca_block_setup (CABlock *ca, CArray *parent, int8_t rank,
|
24
|
-
|
23
|
+
ca_block_setup (CABlock *ca, CArray *parent, int8_t rank, ca_size_t *dim,
|
24
|
+
ca_size_t *start, ca_size_t *step, ca_size_t *count, ca_size_t offset)
|
25
25
|
{
|
26
26
|
int8_t data_type;
|
27
27
|
int8_t maxdim_index;
|
28
|
-
|
29
|
-
|
28
|
+
ca_size_t maxdim_step, maxdim_step0;
|
29
|
+
ca_size_t elements, bytes;
|
30
30
|
int i;
|
31
31
|
|
32
32
|
data_type = parent->data_type;
|
@@ -67,10 +67,10 @@ ca_block_setup (CABlock *ca, CArray *parent, int8_t rank, int32_t *dim,
|
|
67
67
|
ca->attach = 0;
|
68
68
|
ca->nosync = 0;
|
69
69
|
ca->offset = offset;
|
70
|
-
ca->start = ALLOC_N(
|
71
|
-
ca->step = ALLOC_N(
|
72
|
-
ca->count = ALLOC_N(
|
73
|
-
ca->size0 = ALLOC_N(
|
70
|
+
ca->start = ALLOC_N(ca_size_t, rank);
|
71
|
+
ca->step = ALLOC_N(ca_size_t, rank);
|
72
|
+
ca->count = ALLOC_N(ca_size_t, rank);
|
73
|
+
ca->size0 = ALLOC_N(ca_size_t, rank);
|
74
74
|
|
75
75
|
ca->maxdim_index = maxdim_index;
|
76
76
|
ca->maxdim_step = maxdim_step;
|
@@ -80,10 +80,10 @@ ca_block_setup (CABlock *ca, CArray *parent, int8_t rank, int32_t *dim,
|
|
80
80
|
|
81
81
|
ca->dim = ca->count; /* ca->dim should not be free */
|
82
82
|
|
83
|
-
memcpy(ca->start, start, rank * sizeof(
|
84
|
-
memcpy(ca->step, step, rank * sizeof(
|
85
|
-
memcpy(ca->count, count, rank * sizeof(
|
86
|
-
memcpy(ca->size0, dim, rank * sizeof(
|
83
|
+
memcpy(ca->start, start, rank * sizeof(ca_size_t));
|
84
|
+
memcpy(ca->step, step, rank * sizeof(ca_size_t));
|
85
|
+
memcpy(ca->count, count, rank * sizeof(ca_size_t));
|
86
|
+
memcpy(ca->size0, dim, rank * sizeof(ca_size_t));
|
87
87
|
|
88
88
|
if ( ca_has_mask(parent) ) {
|
89
89
|
ca_create_mask(ca);
|
@@ -93,8 +93,8 @@ ca_block_setup (CABlock *ca, CArray *parent, int8_t rank, int32_t *dim,
|
|
93
93
|
}
|
94
94
|
|
95
95
|
CABlock *
|
96
|
-
ca_block_new (CArray *parent, int8_t rank,
|
97
|
-
|
96
|
+
ca_block_new (CArray *parent, int8_t rank, ca_size_t *dim,
|
97
|
+
ca_size_t *start, ca_size_t *step, ca_size_t *count, ca_size_t offset)
|
98
98
|
{
|
99
99
|
CABlock *ca = ALLOC(CABlock);
|
100
100
|
ca_block_setup(ca, parent, rank, dim, start, step, count, offset);
|
@@ -131,24 +131,24 @@ ca_block_func_clone (void *ap)
|
|
131
131
|
}
|
132
132
|
|
133
133
|
static char *
|
134
|
-
ca_block_func_ptr_at_index (void *ap,
|
134
|
+
ca_block_func_ptr_at_index (void *ap, ca_size_t *idx) ;
|
135
135
|
|
136
136
|
static char *
|
137
|
-
ca_block_func_ptr_at_addr (void *ap,
|
137
|
+
ca_block_func_ptr_at_addr (void *ap, ca_size_t addr)
|
138
138
|
{
|
139
139
|
CABlock *ca = (CABlock *) ap;
|
140
140
|
if ( ca->ptr ) {
|
141
141
|
return ca->ptr + ca->bytes * addr;
|
142
142
|
}
|
143
143
|
else {
|
144
|
-
|
144
|
+
ca_size_t idx[CA_RANK_MAX];
|
145
145
|
ca_addr2index(ca, addr, idx);
|
146
146
|
return ca_block_func_ptr_at_index(ca, idx);
|
147
147
|
}
|
148
148
|
}
|
149
149
|
|
150
150
|
static char *
|
151
|
-
ca_block_func_ptr_at_index (void *ap,
|
151
|
+
ca_block_func_ptr_at_index (void *ap, ca_size_t *idx)
|
152
152
|
{
|
153
153
|
CABlock *ca = (CABlock *) ap;
|
154
154
|
|
@@ -156,10 +156,11 @@ ca_block_func_ptr_at_index (void *ap, int32_t *idx)
|
|
156
156
|
return ca_array_func_ptr_at_index(ca, idx);
|
157
157
|
}
|
158
158
|
else {
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
159
|
+
ca_size_t *start = ca->start;
|
160
|
+
ca_size_t *step = ca->step;
|
161
|
+
ca_size_t *size0 = ca->size0;
|
162
|
+
int8_t i;
|
163
|
+
ca_size_t n;
|
163
164
|
n = start[0] + idx[0]*step[0];
|
164
165
|
for (i=1; i<ca->rank; i++) {
|
165
166
|
n *= size0[i];
|
@@ -176,13 +177,14 @@ ca_block_func_ptr_at_index (void *ap, int32_t *idx)
|
|
176
177
|
}
|
177
178
|
|
178
179
|
static void
|
179
|
-
ca_block_func_fetch_index (void *ap,
|
180
|
+
ca_block_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
|
180
181
|
{
|
181
182
|
CABlock *ca = (CABlock *) ap;
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
183
|
+
ca_size_t *start = ca->start;
|
184
|
+
ca_size_t *step = ca->step;
|
185
|
+
ca_size_t *size0 = ca->size0;
|
186
|
+
int8_t i;
|
187
|
+
ca_size_t n;
|
186
188
|
n = start[0] + idx[0]*step[0];
|
187
189
|
for (i=1; i<ca->rank; i++) {
|
188
190
|
n *= size0[i];
|
@@ -193,13 +195,14 @@ ca_block_func_fetch_index (void *ap, int32_t *idx, void *ptr)
|
|
193
195
|
}
|
194
196
|
|
195
197
|
static void
|
196
|
-
ca_block_func_store_index (void *ap,
|
198
|
+
ca_block_func_store_index (void *ap, ca_size_t *idx, void *ptr)
|
197
199
|
{
|
198
200
|
CABlock *ca = (CABlock *) ap;
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
201
|
+
ca_size_t *start = ca->start;
|
202
|
+
ca_size_t *step = ca->step;
|
203
|
+
ca_size_t *size0 = ca->size0;
|
204
|
+
int8_t i;
|
205
|
+
ca_size_t n;
|
203
206
|
n = start[0] + idx[0]*step[0];
|
204
207
|
for (i=1; i<ca->rank; i++) {
|
205
208
|
n *= size0[i];
|
@@ -317,8 +320,8 @@ ca_operation_function_t ca_block_func = {
|
|
317
320
|
/* ------------------------------------------------------------------- */
|
318
321
|
|
319
322
|
VALUE
|
320
|
-
rb_ca_block_new (VALUE cary, int8_t rank,
|
321
|
-
|
323
|
+
rb_ca_block_new (VALUE cary, int8_t rank, ca_size_t *dim,
|
324
|
+
ca_size_t *start, ca_size_t *step, ca_size_t *count, ca_size_t offset)
|
322
325
|
{
|
323
326
|
volatile VALUE obj;
|
324
327
|
CArray *parent;
|
@@ -343,10 +346,10 @@ static void *mfill_step(void *dest,
|
|
343
346
|
size_t bytes, size_t n, size_t dstep, const void *src);
|
344
347
|
|
345
348
|
static void
|
346
|
-
ca_block_attach_loop2 (CABlock *ca, int8_t level,
|
349
|
+
ca_block_attach_loop2 (CABlock *ca, int8_t level, ca_size_t saddr, ca_size_t saddr0)
|
347
350
|
{
|
348
|
-
|
349
|
-
|
351
|
+
ca_size_t count = ca->count[level];
|
352
|
+
ca_size_t addr, addr0, i;
|
350
353
|
|
351
354
|
if ( level == ca->rank - 1 ) {
|
352
355
|
if ( ca->parent->ptr ) {
|
@@ -378,10 +381,10 @@ ca_block_attach_loop2 (CABlock *ca, int8_t level, int32_t saddr, int32_t saddr0)
|
|
378
381
|
}
|
379
382
|
|
380
383
|
static void
|
381
|
-
ca_block_attach_loop (CABlock *ca,
|
384
|
+
ca_block_attach_loop (CABlock *ca, ca_size_t level, ca_size_t saddr, ca_size_t saddr0)
|
382
385
|
{
|
383
|
-
|
384
|
-
|
386
|
+
ca_size_t count = ca->count[level];
|
387
|
+
ca_size_t addr, addr0, i;
|
385
388
|
|
386
389
|
if ( level == ca->rank - 1 ) {
|
387
390
|
if ( level == ca->maxdim_index ) {
|
@@ -395,8 +398,8 @@ ca_block_attach_loop (CABlock *ca, int32_t level, int32_t saddr, int32_t saddr0)
|
|
395
398
|
char *p = ca_ptr_at_addr(ca, saddr* ca->dim[level]);
|
396
399
|
char *q = ca_ptr_at_addr(ca->parent,
|
397
400
|
saddr0*ca->size0[level]+ca->start[level]+ca->offset);
|
398
|
-
|
399
|
-
|
401
|
+
ca_size_t pstep = ca->bytes;
|
402
|
+
ca_size_t qstep = ca->bytes*ca->step[level];
|
400
403
|
for (i=0; i<count; i++) {
|
401
404
|
mcopy_step(p,
|
402
405
|
q,
|
@@ -427,7 +430,7 @@ ca_block_attach_loop (CABlock *ca, int32_t level, int32_t saddr, int32_t saddr0)
|
|
427
430
|
static void
|
428
431
|
ca_block_attach (CABlock *ca)
|
429
432
|
{
|
430
|
-
|
433
|
+
ca_size_t addr = 0, addr0 = 0;
|
431
434
|
if ( ca->rank <= 2 ) {
|
432
435
|
ca_block_attach_loop2(ca, 0, addr, addr0);
|
433
436
|
}
|
@@ -437,10 +440,10 @@ ca_block_attach (CABlock *ca)
|
|
437
440
|
}
|
438
441
|
|
439
442
|
static void
|
440
|
-
ca_block_sync_loop2 (CABlock *ca,
|
443
|
+
ca_block_sync_loop2 (CABlock *ca, int8_t level, ca_size_t saddr, ca_size_t saddr0)
|
441
444
|
{
|
442
|
-
|
443
|
-
|
445
|
+
ca_size_t count = ca->count[level];
|
446
|
+
ca_size_t addr, addr0, i;
|
444
447
|
|
445
448
|
if ( level == ca->rank - 1 ) {
|
446
449
|
if ( ca->parent->ptr ) {
|
@@ -471,10 +474,10 @@ ca_block_sync_loop2 (CABlock *ca, int32_t level, int32_t saddr, int32_t saddr0)
|
|
471
474
|
}
|
472
475
|
|
473
476
|
static void
|
474
|
-
ca_block_sync_loop (CABlock *ca,
|
477
|
+
ca_block_sync_loop (CABlock *ca, int8_t level, ca_size_t saddr, ca_size_t saddr0)
|
475
478
|
{
|
476
|
-
|
477
|
-
|
479
|
+
ca_size_t count = ca->count[level];
|
480
|
+
ca_size_t addr, addr0, i;
|
478
481
|
|
479
482
|
if ( level == ca->rank - 1 ) {
|
480
483
|
if ( level == ca->maxdim_index ) {
|
@@ -516,7 +519,7 @@ ca_block_sync_loop (CABlock *ca, int32_t level, int32_t saddr, int32_t saddr0)
|
|
516
519
|
static void
|
517
520
|
ca_block_sync (CABlock *cb)
|
518
521
|
{
|
519
|
-
|
522
|
+
ca_size_t addr = 0, addr0 = 0;
|
520
523
|
if ( cb->rank <= 2 ) {
|
521
524
|
ca_block_sync_loop2(cb, 0, addr, addr0);
|
522
525
|
}
|
@@ -526,10 +529,10 @@ ca_block_sync (CABlock *cb)
|
|
526
529
|
}
|
527
530
|
|
528
531
|
static void
|
529
|
-
ca_block_fill_loop2 (CABlock *ca,
|
532
|
+
ca_block_fill_loop2 (CABlock *ca, int8_t level, ca_size_t saddr, char *val)
|
530
533
|
{
|
531
|
-
|
532
|
-
|
534
|
+
ca_size_t count = ca->count[level];
|
535
|
+
ca_size_t addr, i;
|
533
536
|
if ( level == ca->rank - 1 ) {
|
534
537
|
addr = saddr * ca->dim[level];
|
535
538
|
mfill_step(ca_ptr_at_addr(ca, addr),
|
@@ -544,10 +547,10 @@ ca_block_fill_loop2 (CABlock *ca, int32_t level, int32_t saddr, char *val)
|
|
544
547
|
}
|
545
548
|
|
546
549
|
static void
|
547
|
-
ca_block_fill_loop (CABlock *ca,
|
550
|
+
ca_block_fill_loop (CABlock *ca, int8_t level, ca_size_t saddr, char *val)
|
548
551
|
{
|
549
|
-
|
550
|
-
|
552
|
+
ca_size_t count = ca->count[level];
|
553
|
+
ca_size_t addr, i;
|
551
554
|
if ( level == ca->rank - 1 ) {
|
552
555
|
if ( level == ca->maxdim_index ) {
|
553
556
|
addr = saddr * ca->dim[level];
|
@@ -582,7 +585,7 @@ ca_block_fill_loop (CABlock *ca, int32_t level, int32_t saddr, char *val)
|
|
582
585
|
static void
|
583
586
|
ca_block_fill (CABlock *ca, char *val)
|
584
587
|
{
|
585
|
-
|
588
|
+
ca_size_t addr = 0;
|
586
589
|
if ( ca->rank <= 2 ) {
|
587
590
|
ca_block_fill_loop2(ca, 0, addr, val);
|
588
591
|
}
|
@@ -605,7 +608,7 @@ mcopy_step (void *dest, const void *src,
|
|
605
608
|
int *dp = (int*) dest;
|
606
609
|
char *scp;
|
607
610
|
char *dcp;
|
608
|
-
|
611
|
+
ca_size_t i;
|
609
612
|
for (i=words; i; i--) {
|
610
613
|
*dp++ = *sp++;
|
611
614
|
}
|
@@ -698,8 +701,8 @@ static VALUE
|
|
698
701
|
rb_cb_initialize_copy (VALUE self, VALUE other)
|
699
702
|
{
|
700
703
|
CABlock *ca, *cs;
|
701
|
-
|
702
|
-
|
704
|
+
ca_size_t shrink[CA_RANK_MAX];
|
705
|
+
int8_t i;
|
703
706
|
|
704
707
|
Data_Get_Struct(self, CABlock, ca);
|
705
708
|
Data_Get_Struct(other, CABlock, cs);
|
@@ -723,7 +726,7 @@ rb_cb_initialize_copy (VALUE self, VALUE other)
|
|
723
726
|
{ \
|
724
727
|
volatile VALUE ary; \
|
725
728
|
CABlock *cb; \
|
726
|
-
|
729
|
+
int8_t i; \
|
727
730
|
Data_Get_Struct(self, CABlock, cb); \
|
728
731
|
ary = rb_ary_new2(cb->rank); \
|
729
732
|
for (i=0; i<cb->rank; i++) { \
|
@@ -757,7 +760,7 @@ rb_cb_offset (VALUE self)
|
|
757
760
|
{
|
758
761
|
CABlock *cb;
|
759
762
|
Data_Get_Struct(self, CABlock, cb);
|
760
|
-
return
|
763
|
+
return SIZE2NUM(cb->offset);
|
761
764
|
}
|
762
765
|
|
763
766
|
/* rdoc:
|
@@ -771,8 +774,9 @@ static VALUE
|
|
771
774
|
rb_cb_idx2addr0 (int argc, VALUE *argv, VALUE self)
|
772
775
|
{
|
773
776
|
CABlock *cb;
|
774
|
-
|
775
|
-
|
777
|
+
ca_size_t addr;
|
778
|
+
int8_t i;
|
779
|
+
ca_size_t idxi;
|
776
780
|
|
777
781
|
Data_Get_Struct(self, CABlock, cb);
|
778
782
|
|
@@ -783,12 +787,12 @@ rb_cb_idx2addr0 (int argc, VALUE *argv, VALUE self)
|
|
783
787
|
|
784
788
|
addr = 0;
|
785
789
|
for (i=0; i<cb->rank; i++) {
|
786
|
-
idxi =
|
790
|
+
idxi = NUM2SIZE(argv[i]);
|
787
791
|
CA_CHECK_INDEX(idxi, cb->dim[i]);
|
788
792
|
addr = cb->size0[i] * addr + cb->start[i] + idxi * cb->step[i];
|
789
793
|
}
|
790
794
|
|
791
|
-
return
|
795
|
+
return SIZE2NUM(addr + cb->offset);
|
792
796
|
}
|
793
797
|
|
794
798
|
/* rdoc:
|
@@ -802,9 +806,9 @@ static VALUE
|
|
802
806
|
rb_cb_addr2addr0 (VALUE self, VALUE raddr)
|
803
807
|
{
|
804
808
|
CABlock *cb;
|
805
|
-
|
806
|
-
|
807
|
-
|
809
|
+
ca_size_t addr = NUM2SIZE(raddr);
|
810
|
+
ca_size_t idx[CA_RANK_MAX];
|
811
|
+
int8_t i;
|
808
812
|
|
809
813
|
Data_Get_Struct(self, CABlock, cb);
|
810
814
|
|
@@ -816,7 +820,7 @@ rb_cb_addr2addr0 (VALUE self, VALUE raddr)
|
|
816
820
|
addr += cb->start[i] + idx[i] * cb->step[i];
|
817
821
|
}
|
818
822
|
|
819
|
-
return
|
823
|
+
return SIZE2NUM(addr + cb->offset);
|
820
824
|
}
|
821
825
|
|
822
826
|
|
@@ -831,7 +835,8 @@ static VALUE
|
|
831
835
|
rb_cb_move (int argc, VALUE *argv, VALUE self)
|
832
836
|
{
|
833
837
|
CABlock *cb;
|
834
|
-
|
838
|
+
ca_size_t start;
|
839
|
+
int8_t i;
|
835
840
|
|
836
841
|
Data_Get_Struct(self, CABlock, cb);
|
837
842
|
|
@@ -842,7 +847,7 @@ rb_cb_move (int argc, VALUE *argv, VALUE self)
|
|
842
847
|
ca_update_mask(cb);
|
843
848
|
|
844
849
|
for (i=0; i<cb->rank; i++) {
|
845
|
-
start =
|
850
|
+
start = NUM2SIZE(argv[i]);
|
846
851
|
if ( start < 0 ) {
|
847
852
|
start += cb->size0[i];
|
848
853
|
}
|