RubyのMemoryView入門(2)
前
データを提供する側と使う側を作る必要があるが、まずは提供する側を作る。使う側は、Rubyに標準添付されているFiddle::MemoryViewを使う。ありがとう。
機能は[3]という一要素の配列をエクスポートするだけのmemory view。
Rubyのオブジェクトにデータを持たせたいんだけど、やり方が分からんので、先ずはCのファイルスコープ(static)に配列を持たせて、それをエクスポートする。
code:ext/learning_memory_view/learning_memory_view.c
VALUE cFloatArray;
VALUE cConstInt;
static int const_int_buf1 = { 3 }; static bool
const_int_get_memory_view(const VALUE obj, rb_memory_view_t *view, int flags)
{
/* int buf1 = { 3 }; /\* doesn't work *\/ */ view->obj = obj;
view->data = const_int_buf;
view->byte_size = sizeof(const_int_buf);
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 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_memory_view_register(cConstInt, &const_int_view_entry);
}
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
よく分からんこと
formatってどう使われるの? ユーザー側が調べるために使うだけで、Ruby側(MemoryView側)で何か使っているわけではない?
memory_view[nth]という風に添字アクセスする時に使われるっぽい
次