RubyのMemoryView入門(3)
前
Rubyのオブジェクト(VALUE)にデータを持たせる。
(TODO: 説明)
code:ext/learning_memory_view/learning_memory_view.c
VALUE cFloatArray;
VALUE cConstInt;
typedef struct {
} const_int_t;
static bool
const_int_get_memory_view(const VALUE obj, rb_memory_view_t *view, int flags)
{
const_int_t *const_int;
Data_Get_Struct(obj, const_int_t, const_int);
view->obj = obj;
view->data = const_int->data;
view->byte_size = sizeof(const_int->data);
view->readonly = true;
view->format = "l*";
view->item_size = sizeof(int);
view->item_desc.components = NULL;
view->item_desc.length = 0;
view->ndim = 1;
view->shape = NULL;
view->sub_offsets = NULL;
view->private_data = NULL;
return true;
}
static bool
const_int_release_memory_view(const VALUE obj, rb_memory_view_t *view)
{
return true;
}
static bool
const_int_memory_view_available_p(const VALUE obj)
{
return true;
}
static VALUE
const_int_s_allocate(VALUE klass)
{
const_int_t *const_int;
return Data_Make_Struct(klass, const_int_t, NULL, NULL, const_int);
}
static VALUE
const_int_initialize(VALUE self)
{
const_int_t *const_int;
Data_Get_Struct(self, const_int_t, const_int);
return Qnil;
}
static const rb_memory_view_entry_t const_int_view_entry = {
const_int_get_memory_view,
const_int_release_memory_view,
const_int_memory_view_available_p
};
void
Init_learning_memory_view(void)
{
VALUE mod = rb_define_module("LearningMemoryView");
cFloatArray = rb_define_class_under(mod, "FloatArray", rb_cObject);
cConstInt = rb_define_class_under(mod, "ConstInt", rb_cObject);
rb_define_alloc_func(cConstInt, const_int_s_allocate);
rb_memory_view_register(cConstInt, &const_int_view_entry);
rb_define_method(cConstInt, "initialize", const_int_initialize, 0);
}
code:test/test_learning_memory_view.rb
require "test/unit"
require "fiddle"
require "learning_memory_view"
class TestLearningMemoryView < Test::Unit::TestCase
include LearningMemoryView
def test_initialize
assert_instance_of FloatArray, FloatArray.new
end
class TestConstInt < self
def test_const_int
const_int = ConstInt.new
Fiddle::MemoryView.export const_int do |memory_view|
assert_equal 4, memory_view.item_size
assert_equal 4, memory_view.byte_size
assert_equal "l*", memory_view.format
assert_equal 3, memory_view.to_s.unpack(memory_view.format) end
end
end
end
参考
テスト用のMemoryView実装。MemoryViewの実装の参考に
Red ArrowのMemoryView機能のテストコード。MemoryViewのテスト方法、Fiddle::MemoryViewの使い方の参考に
よく分からんこと
formatってどう使われるの? ユーザー側が調べるために使うだけで、Ruby側(MemoryView側)で何か使っているわけではない?
エンディアンがどう関わってくるのか
Data_Make_Structの使い方ってこれでいい?
次