Method: DataView.new
- Defined in:
- ext/type_array/data_view.c
.new(buf) ⇒ DataView .new("buffer") ⇒ DataView
Creates a new DataView instance. Both ArrayBuffer and data (String) constructors are supported.
Examples
buf = ArrayBuffer.new(8) => ArrayBuffer
view = DataView.new(buf) => DataView
view = DataView.new(buf, 2) => DataView
view.byte_offset => 2
view.byte_length => 6
view = DataView.new(buf, 2, 4) => DataView
view.byte_offset => 2
view.byte_length => 2
view = DataView.new("buffer") => DataView
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'ext/type_array/data_view.c', line 74
static VALUE rb_data_view_s_new(int argc, VALUE *argv, VALUE klass)
{
VALUE data_view;
unsigned long new_byte_length;
rb_data_view_t *view = NULL;
VALUE obj, byte_offset, byte_length, buffer;
new_byte_length = 0;
rb_scan_args(argc, argv, "12", &obj, &byte_offset, &byte_length);
data_view = Data_Make_Struct(klass, rb_data_view_t, rb_mark_data_view, rb_free_data_view, view);
view->byte_offset = 0;
view->byte_length = 0;
if (rb_class_of(obj) == rb_cArrayBuffer) {
GetArrayBuffer(obj);
view->byte_length = buf->length;
view->buf = obj;
} else if (rb_type(obj) == T_STRING){
ArrayBufferEncode(obj);
buffer = rb_alloc_array_buffer((unsigned long)RSTRING_LEN(obj), (void *)RSTRING_PTR(obj));
GetArrayBuffer(buffer);
view->byte_length = buf->length;
view->buf = buffer;
} else {
rb_raise(rb_eTypeError, "DataView constructor %s not supported.", RSTRING_PTR(rb_obj_as_string(obj)));
}
if (!NIL_P(byte_offset)) {
Check_Type(byte_offset, T_FIXNUM);
view->byte_offset = FIX2ULONG(byte_offset);
if (view->byte_offset >= view->byte_length)
rb_raise(rb_eRangeError, "Byte offset out of range.");
}
if (!NIL_P(byte_length)) {
Check_Type(byte_length, T_FIXNUM);
new_byte_length = FIX2ULONG(byte_length);
if (new_byte_length > view->byte_length)
rb_raise(rb_eRangeError, "Byte length out of range.");
if ((view->byte_offset + new_byte_length) > view->byte_length)
rb_raise(rb_eRangeError, "Byte offset / length is not aligned.");
view->byte_length = new_byte_length;
}
view->byte_length -= view->byte_offset;
rb_obj_call_init(data_view, 0, NULL);
return data_view;
}
|