nanoarrow 0.1.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 +7 -0
- data/CHANGELOG.md +3 -0
- data/LICENSE.txt +208 -0
- data/NOTICE.txt +5 -0
- data/README.md +54 -0
- data/ext/nanoarrow/array.c +99 -0
- data/ext/nanoarrow/array_builder.c +268 -0
- data/ext/nanoarrow/array_stream.c +201 -0
- data/ext/nanoarrow/array_view.c +177 -0
- data/ext/nanoarrow/buffer.c +46 -0
- data/ext/nanoarrow/capsule.c +89 -0
- data/ext/nanoarrow/ext.c +23 -0
- data/ext/nanoarrow/ext.h +89 -0
- data/ext/nanoarrow/extconf.rb +7 -0
- data/ext/nanoarrow/mat_array_stream.c +186 -0
- data/ext/nanoarrow/nanoarrow/nanoarrow.h +4482 -0
- data/ext/nanoarrow/nanoarrow.c +4117 -0
- data/ext/nanoarrow/rc.c +34 -0
- data/ext/nanoarrow/schema.c +346 -0
- data/ext/nanoarrow/schema_builder.c +251 -0
- data/ext/nanoarrow/schema_view.c +204 -0
- data/ext/nanoarrow/types.c +48 -0
- data/ext/nanoarrow/utils.c +202 -0
- data/lib/nanoarrow/array.rb +97 -0
- data/lib/nanoarrow/array_builder.rb +115 -0
- data/lib/nanoarrow/array_stream.rb +32 -0
- data/lib/nanoarrow/iterator.rb +113 -0
- data/lib/nanoarrow/schema.rb +85 -0
- data/lib/nanoarrow/types.rb +157 -0
- data/lib/nanoarrow/utils.rb +127 -0
- data/lib/nanoarrow/version.rb +3 -0
- data/lib/nanoarrow.rb +28 -0
- metadata +70 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
#include <ruby/ruby.h>
|
|
2
|
+
|
|
3
|
+
#include "ext.h"
|
|
4
|
+
#include "nanoarrow/nanoarrow.h"
|
|
5
|
+
|
|
6
|
+
VALUE cCArrayStream;
|
|
7
|
+
|
|
8
|
+
typedef struct array_stream {
|
|
9
|
+
VALUE base;
|
|
10
|
+
struct ArrowArrayStream* ptr;
|
|
11
|
+
VALUE cached_schema;
|
|
12
|
+
} array_stream_t;
|
|
13
|
+
|
|
14
|
+
static void array_stream_mark(void* ptr)
|
|
15
|
+
{
|
|
16
|
+
array_stream_t* stream = (array_stream_t*) ptr;
|
|
17
|
+
rb_gc_mark_movable(stream->base);
|
|
18
|
+
rb_gc_mark_movable(stream->cached_schema);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const rb_data_type_t array_stream_data_type = {
|
|
22
|
+
.wrap_struct_name = "Nanoarrow::CArrayStream",
|
|
23
|
+
.function = {
|
|
24
|
+
.dmark = array_stream_mark,
|
|
25
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
|
26
|
+
},
|
|
27
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
static VALUE array_stream_allocate(VALUE klass)
|
|
31
|
+
{
|
|
32
|
+
array_stream_t* stream;
|
|
33
|
+
VALUE obj = TypedData_Make_Struct(klass, array_stream_t, &array_stream_data_type, stream);
|
|
34
|
+
stream->base = Qnil;
|
|
35
|
+
stream->ptr = NULL;
|
|
36
|
+
stream->cached_schema = Qnil;
|
|
37
|
+
return obj;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static VALUE array_stream_import_from_c_capsule(VALUE klass, VALUE schema_capsule)
|
|
41
|
+
{
|
|
42
|
+
array_stream_t* stream;
|
|
43
|
+
VALUE obj = array_stream_allocate(klass);
|
|
44
|
+
GetArrayStream(obj, stream);
|
|
45
|
+
|
|
46
|
+
VALUE address = rb_funcall(schema_capsule, rb_intern("to_i"), 0);
|
|
47
|
+
stream->base = schema_capsule;
|
|
48
|
+
stream->ptr = (struct ArrowArrayStream*) NUM2ULL(address);
|
|
49
|
+
return obj;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static VALUE array_stream_from_c_arrays(VALUE klass, VALUE arrays, VALUE schema, VALUE validate)
|
|
53
|
+
{
|
|
54
|
+
array_stream_t* stream;
|
|
55
|
+
VALUE out = array_stream_allocate(klass);
|
|
56
|
+
GetArrayStream(out, stream);
|
|
57
|
+
|
|
58
|
+
// TODO move to parameter
|
|
59
|
+
VALUE move = Qfalse;
|
|
60
|
+
|
|
61
|
+
VALUE out_schema;
|
|
62
|
+
VALUE validate_schema;
|
|
63
|
+
if (RTEST(validate) && !RTEST(move))
|
|
64
|
+
{
|
|
65
|
+
validate_schema = schema;
|
|
66
|
+
out_schema = rb_funcall(schema, rb_intern("deep_dup"), 0);
|
|
67
|
+
}
|
|
68
|
+
else if (RTEST(validate))
|
|
69
|
+
{
|
|
70
|
+
validate_schema = rb_funcall(schema, rb_intern("deep_dup"), 0);
|
|
71
|
+
out_schema = schema;
|
|
72
|
+
}
|
|
73
|
+
else
|
|
74
|
+
out_schema = rb_funcall(schema, rb_intern("deep_dup"), 0);
|
|
75
|
+
|
|
76
|
+
schema_t* schema_ptr;
|
|
77
|
+
GetSchema(out_schema, schema_ptr);
|
|
78
|
+
|
|
79
|
+
Check_Type(arrays, T_ARRAY);
|
|
80
|
+
long arrays_len = RARRAY_LEN(arrays);
|
|
81
|
+
|
|
82
|
+
stream->base = alloc_c_array_stream(&stream->ptr);
|
|
83
|
+
|
|
84
|
+
int code = ArrowBasicArrayStreamInit(stream->ptr, schema_ptr->ptr, arrays_len);
|
|
85
|
+
raise_error_not_ok("ArrowBasicArrayStreamInit()", code);
|
|
86
|
+
|
|
87
|
+
struct ArrowArrayStream* c_array_stream_out = stream->ptr;
|
|
88
|
+
struct ArrowArray tmp;
|
|
89
|
+
for (long i = 0; i < arrays_len; i++)
|
|
90
|
+
{
|
|
91
|
+
array_t* array;
|
|
92
|
+
GetArray(rb_ary_entry(arrays, i), array);
|
|
93
|
+
|
|
94
|
+
if (RTEST(validate))
|
|
95
|
+
assert_type_equal(array->schema, validate_schema, Qfalse);
|
|
96
|
+
|
|
97
|
+
if (!RTEST(move))
|
|
98
|
+
{
|
|
99
|
+
c_array_shallow_copy(array->base, array->ptr, &tmp);
|
|
100
|
+
ArrowBasicArrayStreamSetArray(c_array_stream_out, i, &tmp);
|
|
101
|
+
}
|
|
102
|
+
else
|
|
103
|
+
ArrowBasicArrayStreamSetArray(c_array_stream_out, i, array->ptr);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (RTEST(validate))
|
|
107
|
+
{
|
|
108
|
+
struct ArrowError error;
|
|
109
|
+
int code = ArrowBasicArrayStreamValidate(c_array_stream_out, &error);
|
|
110
|
+
raise_message_not_ok(&error, "ArrowBasicArrayStreamValidate()", code);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static VALUE array_stream_assert_valid(VALUE self)
|
|
117
|
+
{
|
|
118
|
+
array_stream_t* stream;
|
|
119
|
+
GetArrayStream(self, stream);
|
|
120
|
+
|
|
121
|
+
if (stream->ptr == NULL)
|
|
122
|
+
rb_raise(rb_eRuntimeError, "array stream pointer is NULL");
|
|
123
|
+
if (stream->ptr->release == NULL)
|
|
124
|
+
rb_raise(rb_eRuntimeError, "array stream is released");
|
|
125
|
+
|
|
126
|
+
return Qnil;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
static VALUE array_stream_get_schema(VALUE self, VALUE schema)
|
|
130
|
+
{
|
|
131
|
+
array_stream_t* stream;
|
|
132
|
+
GetArrayStream(self, stream);
|
|
133
|
+
|
|
134
|
+
array_stream_assert_valid(self);
|
|
135
|
+
|
|
136
|
+
struct ArrowError error;
|
|
137
|
+
schema_t* schema_ptr;
|
|
138
|
+
GetSchema(schema, schema_ptr);
|
|
139
|
+
int code = ArrowArrayStreamGetSchema(stream->ptr, schema_ptr->ptr, &error);
|
|
140
|
+
raise_message_not_ok(&error, "ArrowArrayStream::get_schema()", code);
|
|
141
|
+
return Qnil;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
static VALUE array_stream_get_cached_schema(VALUE self)
|
|
145
|
+
{
|
|
146
|
+
array_stream_t* stream;
|
|
147
|
+
GetArrayStream(self, stream);
|
|
148
|
+
|
|
149
|
+
if (NIL_P(stream->cached_schema))
|
|
150
|
+
{
|
|
151
|
+
stream->cached_schema = rb_funcall(cCSchema, rb_intern("allocate"), 0);
|
|
152
|
+
array_stream_get_schema(self, stream->cached_schema);
|
|
153
|
+
}
|
|
154
|
+
return stream->cached_schema;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
static VALUE array_stream_get_next(VALUE self)
|
|
158
|
+
{
|
|
159
|
+
array_stream_t* stream;
|
|
160
|
+
GetArrayStream(self, stream);
|
|
161
|
+
|
|
162
|
+
array_stream_assert_valid(self);
|
|
163
|
+
|
|
164
|
+
array_t* array_ptr;
|
|
165
|
+
VALUE array = rb_funcall(cCArray, rb_intern("allocate"), 0);
|
|
166
|
+
GetArray(array, array_ptr);
|
|
167
|
+
array_ptr->schema = array_stream_get_cached_schema(self);
|
|
168
|
+
|
|
169
|
+
struct ArrowError error;
|
|
170
|
+
int code = ArrowArrayStreamGetNext(stream->ptr, array_ptr->ptr, &error);
|
|
171
|
+
raise_message_not_ok(&error, "ArrowArrayStreamGetNext()", code);
|
|
172
|
+
|
|
173
|
+
if (!RTEST(rb_funcall(array, rb_intern("valid?"), 0)))
|
|
174
|
+
return Qnil;
|
|
175
|
+
|
|
176
|
+
return array;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
static VALUE array_stream_arrow_c_stream(VALUE self)
|
|
180
|
+
{
|
|
181
|
+
array_stream_t* stream;
|
|
182
|
+
GetArrayStream(self, stream);
|
|
183
|
+
|
|
184
|
+
array_stream_assert_valid(self);
|
|
185
|
+
|
|
186
|
+
struct ArrowArrayStream* c_array_stream_out;
|
|
187
|
+
VALUE array_stream_capsule = alloc_c_array_stream(&c_array_stream_out);
|
|
188
|
+
ArrowArrayStreamMove(stream->ptr, c_array_stream_out);
|
|
189
|
+
return array_stream_capsule;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
void Init_array_stream(void)
|
|
193
|
+
{
|
|
194
|
+
cCArrayStream = rb_define_class_under(mNanoarrow, "CArrayStream", rb_cObject);
|
|
195
|
+
rb_define_alloc_func(cCArrayStream, array_stream_allocate);
|
|
196
|
+
rb_define_singleton_method(cCArrayStream, "import_from_c_capsule", array_stream_import_from_c_capsule, 1);
|
|
197
|
+
rb_define_singleton_method(cCArrayStream, "from_c_arrays", array_stream_from_c_arrays, 3);
|
|
198
|
+
rb_define_method(cCArrayStream, "get_next", array_stream_get_next, 0);
|
|
199
|
+
rb_define_method(cCArrayStream, "get_cached_schema", array_stream_get_cached_schema, 0);
|
|
200
|
+
rb_define_method(cCArrayStream, "arrow_c_stream", array_stream_arrow_c_stream, 0);
|
|
201
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
#include <ruby/ruby.h>
|
|
2
|
+
|
|
3
|
+
#include "ext.h"
|
|
4
|
+
#include "nanoarrow/nanoarrow.h"
|
|
5
|
+
|
|
6
|
+
VALUE cCArrayView;
|
|
7
|
+
|
|
8
|
+
typedef struct array_view {
|
|
9
|
+
VALUE base;
|
|
10
|
+
VALUE array_base;
|
|
11
|
+
struct ArrowArrayView* ptr;
|
|
12
|
+
} array_view_t;
|
|
13
|
+
|
|
14
|
+
static void array_view_mark(void* ptr)
|
|
15
|
+
{
|
|
16
|
+
array_view_t* view = (array_view_t*) ptr;
|
|
17
|
+
rb_gc_mark_movable(view->base);
|
|
18
|
+
rb_gc_mark_movable(view->array_base);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const rb_data_type_t array_view_data_type = {
|
|
22
|
+
.wrap_struct_name = "Nanoarrow::CArrayView",
|
|
23
|
+
.function = {
|
|
24
|
+
.dmark = array_view_mark,
|
|
25
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
|
26
|
+
},
|
|
27
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
static VALUE array_view_allocate(VALUE klass)
|
|
31
|
+
{
|
|
32
|
+
array_view_t* view;
|
|
33
|
+
VALUE obj = TypedData_Make_Struct(klass, array_view_t, &array_view_data_type, view);
|
|
34
|
+
view->base = Qnil;
|
|
35
|
+
view->array_base = Qnil;
|
|
36
|
+
view->ptr = NULL;
|
|
37
|
+
return obj;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static VALUE array_view_from_schema(VALUE klass, VALUE schema)
|
|
41
|
+
{
|
|
42
|
+
struct ArrowArrayView* c_array_view;
|
|
43
|
+
VALUE base = alloc_c_array_view(&c_array_view);
|
|
44
|
+
|
|
45
|
+
schema_t* schema_ptr;
|
|
46
|
+
GetSchema(schema, schema_ptr);
|
|
47
|
+
|
|
48
|
+
struct ArrowError error;
|
|
49
|
+
int code = ArrowArrayViewInitFromSchema(c_array_view, schema_ptr->ptr, &error);
|
|
50
|
+
raise_message_not_ok(&error, "ArrowArrayViewInitFromSchema()", code);
|
|
51
|
+
|
|
52
|
+
array_view_t* view;
|
|
53
|
+
VALUE obj = TypedData_Make_Struct(klass, array_view_t, &array_view_data_type, view);
|
|
54
|
+
view->base = base;
|
|
55
|
+
view->array_base = Qnil;
|
|
56
|
+
view->ptr = c_array_view;
|
|
57
|
+
return obj;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static VALUE array_view_set_array(VALUE self, VALUE array)
|
|
61
|
+
{
|
|
62
|
+
array_view_t* view;
|
|
63
|
+
GetArrayView(self, view);
|
|
64
|
+
|
|
65
|
+
struct ArrowError error;
|
|
66
|
+
int code;
|
|
67
|
+
|
|
68
|
+
array_t* array_ptr;
|
|
69
|
+
GetArray(array, array_ptr);
|
|
70
|
+
|
|
71
|
+
code = ArrowArrayViewSetArray(view->ptr, array_ptr->ptr, &error);
|
|
72
|
+
|
|
73
|
+
raise_message_not_ok(&error, "ArrowArrayViewSetArray()", code);
|
|
74
|
+
view->array_base = array_ptr->base;
|
|
75
|
+
|
|
76
|
+
return self;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
static VALUE array_view_each_bool(VALUE self)
|
|
80
|
+
{
|
|
81
|
+
array_view_t* view;
|
|
82
|
+
GetArrayView(self, view);
|
|
83
|
+
|
|
84
|
+
for (int64_t i = 0; i < view->ptr->length; i++)
|
|
85
|
+
rb_yield(ArrowArrayViewIsNull(view->ptr, i) ? Qnil : ArrowArrayViewGetIntUnsafe(view->ptr, i) ? Qtrue : Qfalse);
|
|
86
|
+
|
|
87
|
+
return self;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
static VALUE array_view_each_int(VALUE self)
|
|
91
|
+
{
|
|
92
|
+
array_view_t* view;
|
|
93
|
+
GetArrayView(self, view);
|
|
94
|
+
|
|
95
|
+
for (int64_t i = 0; i < view->ptr->length; i++)
|
|
96
|
+
rb_yield(ArrowArrayViewIsNull(view->ptr, i) ? Qnil : LL2NUM(ArrowArrayViewGetIntUnsafe(view->ptr, i)));
|
|
97
|
+
|
|
98
|
+
return self;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static VALUE array_view_each_uint(VALUE self)
|
|
102
|
+
{
|
|
103
|
+
array_view_t* view;
|
|
104
|
+
GetArrayView(self, view);
|
|
105
|
+
|
|
106
|
+
for (int64_t i = 0; i < view->ptr->length; i++)
|
|
107
|
+
rb_yield(ArrowArrayViewIsNull(view->ptr, i) ? Qnil : ULL2NUM(ArrowArrayViewGetUIntUnsafe(view->ptr, i)));
|
|
108
|
+
|
|
109
|
+
return self;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static VALUE array_view_each_double(VALUE self)
|
|
113
|
+
{
|
|
114
|
+
array_view_t* view;
|
|
115
|
+
GetArrayView(self, view);
|
|
116
|
+
|
|
117
|
+
for (int64_t i = 0; i < view->ptr->length; i++)
|
|
118
|
+
rb_yield(ArrowArrayViewIsNull(view->ptr, i) ? Qnil : DBL2NUM(ArrowArrayViewGetDoubleUnsafe(view->ptr, i)));
|
|
119
|
+
|
|
120
|
+
return self;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
static VALUE array_view_each_string(VALUE self)
|
|
124
|
+
{
|
|
125
|
+
array_view_t* view;
|
|
126
|
+
GetArrayView(self, view);
|
|
127
|
+
|
|
128
|
+
for (int64_t i = 0; i < view->ptr->length; i++)
|
|
129
|
+
{
|
|
130
|
+
VALUE v;
|
|
131
|
+
if (ArrowArrayViewIsNull(view->ptr, i))
|
|
132
|
+
v = Qnil;
|
|
133
|
+
else
|
|
134
|
+
{
|
|
135
|
+
struct ArrowStringView sv = ArrowArrayViewGetStringUnsafe(view->ptr, i);
|
|
136
|
+
v = rb_str_new(sv.data, sv.size_bytes);
|
|
137
|
+
}
|
|
138
|
+
rb_yield(v);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return self;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
static VALUE array_view_each_binary(VALUE self)
|
|
145
|
+
{
|
|
146
|
+
array_view_t* view;
|
|
147
|
+
GetArrayView(self, view);
|
|
148
|
+
|
|
149
|
+
for (int64_t i = 0; i < view->ptr->length; i++)
|
|
150
|
+
{
|
|
151
|
+
VALUE v;
|
|
152
|
+
if (ArrowArrayViewIsNull(view->ptr, i))
|
|
153
|
+
v = Qnil;
|
|
154
|
+
else
|
|
155
|
+
{
|
|
156
|
+
struct ArrowBufferView bv = ArrowArrayViewGetBytesUnsafe(view->ptr, i);
|
|
157
|
+
v = rb_str_new(bv.data.data, bv.size_bytes);
|
|
158
|
+
}
|
|
159
|
+
rb_yield(v);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return self;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
void Init_array_view(void)
|
|
166
|
+
{
|
|
167
|
+
cCArrayView = rb_define_class_under(mNanoarrow, "CArrayView", rb_cObject);
|
|
168
|
+
rb_define_alloc_func(cCArrayView, array_view_allocate);
|
|
169
|
+
rb_define_singleton_method(cCArrayView, "from_schema", array_view_from_schema, 1);
|
|
170
|
+
rb_define_method(cCArrayView, "set_array", array_view_set_array, 1);
|
|
171
|
+
rb_define_method(cCArrayView, "each_bool", array_view_each_bool, 0);
|
|
172
|
+
rb_define_method(cCArrayView, "each_int", array_view_each_int, 0);
|
|
173
|
+
rb_define_method(cCArrayView, "each_uint", array_view_each_uint, 0);
|
|
174
|
+
rb_define_method(cCArrayView, "each_double", array_view_each_double, 0);
|
|
175
|
+
rb_define_method(cCArrayView, "each_string", array_view_each_string, 0);
|
|
176
|
+
rb_define_method(cCArrayView, "each_binary", array_view_each_binary, 0);
|
|
177
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#include <ruby/ruby.h>
|
|
2
|
+
|
|
3
|
+
#include "ext.h"
|
|
4
|
+
#include "nanoarrow/nanoarrow.h"
|
|
5
|
+
|
|
6
|
+
VALUE cCBuffer;
|
|
7
|
+
|
|
8
|
+
static void buffer_mark(void* ptr)
|
|
9
|
+
{
|
|
10
|
+
buffer_t* buffer = (buffer_t*) ptr;
|
|
11
|
+
rb_gc_mark_movable(buffer->base);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const rb_data_type_t buffer_data_type = {
|
|
15
|
+
.wrap_struct_name = "Nanoarrow::CArrayView",
|
|
16
|
+
.function = {
|
|
17
|
+
.dmark = buffer_mark,
|
|
18
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
|
19
|
+
},
|
|
20
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
static VALUE buffer_allocate(VALUE klass)
|
|
24
|
+
{
|
|
25
|
+
buffer_t* buffer;
|
|
26
|
+
VALUE obj = TypedData_Make_Struct(klass, buffer_t, &buffer_data_type, buffer);
|
|
27
|
+
buffer->base = Qnil;
|
|
28
|
+
buffer->ptr = NULL;
|
|
29
|
+
return obj;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static VALUE buffer_empty(VALUE klass)
|
|
33
|
+
{
|
|
34
|
+
buffer_t* buffer;
|
|
35
|
+
VALUE out = buffer_allocate(klass);
|
|
36
|
+
GetBuffer(out, buffer);
|
|
37
|
+
buffer->base = alloc_c_buffer(&buffer->ptr);
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
void Init_buffer(void)
|
|
42
|
+
{
|
|
43
|
+
cCBuffer = rb_define_class_under(mNanoarrow, "CBuffer", rb_cObject);
|
|
44
|
+
rb_define_alloc_func(cCBuffer, buffer_allocate);
|
|
45
|
+
rb_define_singleton_method(cCBuffer, "empty", buffer_empty, 0);
|
|
46
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#include <ruby/ruby.h>
|
|
2
|
+
|
|
3
|
+
#include "ext.h"
|
|
4
|
+
#include "nanoarrow/nanoarrow.h"
|
|
5
|
+
|
|
6
|
+
VALUE cCapsule;
|
|
7
|
+
|
|
8
|
+
struct capsule {
|
|
9
|
+
void* ptr;
|
|
10
|
+
const char* name;
|
|
11
|
+
void (*destructor)(capsule_t*);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
static void capsule_free(void* ptr)
|
|
15
|
+
{
|
|
16
|
+
capsule_t* capsule = (capsule_t*) ptr;
|
|
17
|
+
|
|
18
|
+
if (capsule->destructor)
|
|
19
|
+
capsule->destructor(capsule);
|
|
20
|
+
|
|
21
|
+
xfree(ptr);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const rb_data_type_t capsule_data_type = {
|
|
25
|
+
.wrap_struct_name = "Nanoarrow::Capsule",
|
|
26
|
+
.function = {
|
|
27
|
+
.dfree = capsule_free,
|
|
28
|
+
},
|
|
29
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
VALUE capsule_new(void* ptr, const char* name, void (*destructor)(capsule_t*))
|
|
33
|
+
{
|
|
34
|
+
capsule_t* capsule;
|
|
35
|
+
VALUE obj = TypedData_Make_Struct(cCapsule, capsule_t, &capsule_data_type, capsule);
|
|
36
|
+
capsule->ptr = ptr;
|
|
37
|
+
capsule->name = name;
|
|
38
|
+
capsule->destructor = destructor;
|
|
39
|
+
return obj;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void* capsule_pointer(capsule_t* capsule, const char* name)
|
|
43
|
+
{
|
|
44
|
+
bool matches;
|
|
45
|
+
if (name == NULL || capsule->name == NULL)
|
|
46
|
+
matches = name == capsule->name;
|
|
47
|
+
else
|
|
48
|
+
matches = strcmp(name, capsule->name) == 0;
|
|
49
|
+
|
|
50
|
+
// cannot raise since may be called in dfree function
|
|
51
|
+
if (!matches)
|
|
52
|
+
return NULL;
|
|
53
|
+
|
|
54
|
+
return capsule->ptr;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
static VALUE capsule_allocate(VALUE klass)
|
|
58
|
+
{
|
|
59
|
+
capsule_t* capsule;
|
|
60
|
+
VALUE obj = TypedData_Make_Struct(klass, capsule_t, &capsule_data_type, capsule);
|
|
61
|
+
capsule->ptr = NULL;
|
|
62
|
+
capsule->name = NULL;
|
|
63
|
+
capsule->destructor = NULL;
|
|
64
|
+
return obj;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static VALUE capsule_to_i(VALUE self)
|
|
68
|
+
{
|
|
69
|
+
capsule_t* capsule;
|
|
70
|
+
GetCapsule(self, capsule);
|
|
71
|
+
|
|
72
|
+
return ULL2NUM((uintptr_t) capsule->ptr);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
static VALUE capsule_name(VALUE self)
|
|
76
|
+
{
|
|
77
|
+
capsule_t* capsule;
|
|
78
|
+
GetCapsule(self, capsule);
|
|
79
|
+
|
|
80
|
+
return rb_utf8_str_new_cstr(capsule->name);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
void Init_capsule(void)
|
|
84
|
+
{
|
|
85
|
+
cCapsule = rb_define_class_under(mNanoarrow, "Capsule", rb_cObject);
|
|
86
|
+
rb_define_alloc_func(cCapsule, capsule_allocate);
|
|
87
|
+
rb_define_method(cCapsule, "to_i", capsule_to_i, 0);
|
|
88
|
+
rb_define_method(cCapsule, "name", capsule_name, 0);
|
|
89
|
+
}
|
data/ext/nanoarrow/ext.c
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#include <ruby/ruby.h>
|
|
2
|
+
|
|
3
|
+
#include "ext.h"
|
|
4
|
+
#include "nanoarrow/nanoarrow.h"
|
|
5
|
+
|
|
6
|
+
VALUE mNanoarrow;
|
|
7
|
+
|
|
8
|
+
void Init_ext(void)
|
|
9
|
+
{
|
|
10
|
+
mNanoarrow = rb_define_module("Nanoarrow");
|
|
11
|
+
|
|
12
|
+
Init_array();
|
|
13
|
+
Init_array_builder();
|
|
14
|
+
Init_array_stream();
|
|
15
|
+
Init_array_view();
|
|
16
|
+
Init_buffer();
|
|
17
|
+
Init_capsule();
|
|
18
|
+
Init_materialized();
|
|
19
|
+
Init_schema();
|
|
20
|
+
Init_schema_builder();
|
|
21
|
+
Init_schema_view();
|
|
22
|
+
Init_types();
|
|
23
|
+
}
|
data/ext/nanoarrow/ext.h
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <ruby/ruby.h>
|
|
4
|
+
|
|
5
|
+
#include "nanoarrow/nanoarrow.h"
|
|
6
|
+
|
|
7
|
+
#define GetArray(obj, ptr) TypedData_Get_Struct((obj), array_t, &array_data_type, (ptr));
|
|
8
|
+
#define GetArrayBuilder(obj, ptr) TypedData_Get_Struct((obj), array_builder_t, &array_builder_data_type, (ptr));
|
|
9
|
+
#define GetArrayStream(obj, ptr) TypedData_Get_Struct((obj), array_stream_t, &array_stream_data_type, (ptr));
|
|
10
|
+
#define GetArrayView(obj, ptr) TypedData_Get_Struct((obj), array_view_t, &array_view_data_type, (ptr));
|
|
11
|
+
#define GetBuffer(obj, ptr) TypedData_Get_Struct((obj), buffer_t, &buffer_data_type, (ptr));
|
|
12
|
+
#define GetCapsule(obj, ptr) TypedData_Get_Struct((obj), capsule_t, &capsule_data_type, (ptr));
|
|
13
|
+
#define GetMatArrayStream(obj, ptr) TypedData_Get_Struct((obj), mat_array_stream_t, &mat_array_stream_data_type, (ptr));
|
|
14
|
+
#define GetSchema(obj, ptr) TypedData_Get_Struct((obj), schema_t, &schema_data_type, (ptr));
|
|
15
|
+
#define GetSchemaBuilder(obj, ptr) TypedData_Get_Struct((obj), schema_builder_t, &schema_builder_data_type, (ptr));
|
|
16
|
+
#define GetSchemaView(obj, ptr) TypedData_Get_Struct((obj), schema_view_t, &schema_view_data_type, (ptr));
|
|
17
|
+
|
|
18
|
+
typedef struct array {
|
|
19
|
+
VALUE base;
|
|
20
|
+
struct ArrowArray* ptr;
|
|
21
|
+
VALUE schema;
|
|
22
|
+
} array_t;
|
|
23
|
+
|
|
24
|
+
extern const rb_data_type_t array_data_type;
|
|
25
|
+
|
|
26
|
+
typedef struct buffer {
|
|
27
|
+
VALUE base;
|
|
28
|
+
struct ArrowBuffer* ptr;
|
|
29
|
+
} buffer_t;
|
|
30
|
+
|
|
31
|
+
extern const rb_data_type_t buffer_data_type;
|
|
32
|
+
|
|
33
|
+
typedef struct schema {
|
|
34
|
+
VALUE base;
|
|
35
|
+
struct ArrowSchema* ptr;
|
|
36
|
+
} schema_t;
|
|
37
|
+
|
|
38
|
+
extern const rb_data_type_t schema_data_type;
|
|
39
|
+
|
|
40
|
+
extern VALUE mNanoarrow;
|
|
41
|
+
extern VALUE cCArray;
|
|
42
|
+
extern VALUE cCArrayBuilder;
|
|
43
|
+
extern VALUE cCArrayStream;
|
|
44
|
+
extern VALUE cCArrayView;
|
|
45
|
+
extern VALUE cCBuffer;
|
|
46
|
+
extern VALUE cCapsule;
|
|
47
|
+
extern VALUE cCMatArrayStream;
|
|
48
|
+
extern VALUE cCSchema;
|
|
49
|
+
extern VALUE cCSchemaBuilder;
|
|
50
|
+
extern VALUE cCSchemaView;
|
|
51
|
+
|
|
52
|
+
void Init_array(void);
|
|
53
|
+
void Init_array_builder(void);
|
|
54
|
+
void Init_array_stream(void);
|
|
55
|
+
void Init_array_view(void);
|
|
56
|
+
void Init_buffer(void);
|
|
57
|
+
void Init_capsule(void);
|
|
58
|
+
void Init_materialized(void);
|
|
59
|
+
void Init_schema(void);
|
|
60
|
+
void Init_schema_builder(void);
|
|
61
|
+
void Init_schema_view(void);
|
|
62
|
+
void Init_types(void);
|
|
63
|
+
|
|
64
|
+
typedef struct capsule capsule_t;
|
|
65
|
+
|
|
66
|
+
extern const rb_data_type_t capsule_data_type;
|
|
67
|
+
|
|
68
|
+
VALUE capsule_new(void* ptr, const char* name, void (*destructor)(capsule_t*));
|
|
69
|
+
void* capsule_pointer(capsule_t* capsule, const char* name);
|
|
70
|
+
|
|
71
|
+
typedef struct rc rc_t;
|
|
72
|
+
|
|
73
|
+
rc_t* rc_new(void* ptr, void (*destructor)(void*));
|
|
74
|
+
void rc_increment(rc_t* rc);
|
|
75
|
+
void rc_decrement(rc_t* rc);
|
|
76
|
+
|
|
77
|
+
VALUE schema_assert_valid(VALUE self);
|
|
78
|
+
void assert_type_equal(VALUE actual, VALUE expected, VALUE check_nullability);
|
|
79
|
+
|
|
80
|
+
void raise_message_not_ok(struct ArrowError* error, const char* message, int code);
|
|
81
|
+
void raise_error_not_ok(const char* message, int code);
|
|
82
|
+
void raise_todo(void);
|
|
83
|
+
|
|
84
|
+
VALUE alloc_c_array(struct ArrowArray** c_array);
|
|
85
|
+
VALUE alloc_c_array_stream(struct ArrowArrayStream** c_stream);
|
|
86
|
+
VALUE alloc_c_array_view(struct ArrowArrayView** c_array_view);
|
|
87
|
+
VALUE alloc_c_buffer(struct ArrowBuffer** c_buffer);
|
|
88
|
+
VALUE alloc_c_schema(struct ArrowSchema** c_schema);
|
|
89
|
+
void c_array_shallow_copy(VALUE base, const struct ArrowArray* src, struct ArrowArray* dst);
|