Class: Binyo::ByteList

Inherits:
Object
  • Object
show all
Defined in:
ext/binyo/bytelist.c

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Object



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'ext/binyo/bytelist.c', line 110

static VALUE
binyo_bytelist_initialize(int argc, VALUE *argv, VALUE self)
{
    VALUE vfirst;
    VALUE vsize = Qnil;
    binyo_bytelist *bytelist;
    
    rb_scan_args(argc, argv, "11", &vfirst, &vsize);

    if (NIL_P(vfirst))
	rb_raise(rb_eArgError, "First argument may not be nil");
    if (argc == 2 && NIL_P(vsize))
	rb_raise(rb_eArgError, "Size argument may not be nil");

    if (TYPE(vfirst) == T_STRING) {
	bytelist = binyo_bytelist_new_bytes((uint8_t *) RSTRING_PTR(vfirst), (size_t) RSTRING_LEN(vfirst));
    } else {
	bytelist = binyo_bytelist_new_size((size_t) NUM2LONG(vfirst));
    }

    DATA_PTR(self) = bytelist;
    return self;
}

Instance Method Details

#<<(byteval) ⇒ Object



166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'ext/binyo/bytelist.c', line 166

static VALUE
binyo_bytelist_push(VALUE self, VALUE byteval)
{
    binyo_bytelist *bytelist;

    int_bytelist_get(self, bytelist);

    if (bytelist->len == bytelist->limit)
	rb_raise(eBinyoError, "Cannot append to ByteList"); /* TODO auto-resize */

    bytelist->bytes[bytelist->len++] = NUM2INT(byteval) & 0xff;
    return self;
}

#[](vidx) ⇒ Object



134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'ext/binyo/bytelist.c', line 134

static VALUE
binyo_bytelist_get_index(VALUE self, VALUE vidx)
{
    binyo_bytelist *bytelist;
    size_t i = (size_t) NUM2LONG(vidx);

    int_bytelist_get(self, bytelist);

    if (i >= bytelist->len)
	rb_raise(eBinyoError, "Index out of bounds: %lu", i); /* TODO treat it like Array */

    return INT2NUM(bytelist->bytes[i]);
}

#[]=(vidx, byteval) ⇒ Object



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'ext/binyo/bytelist.c', line 148

static VALUE
binyo_bytelist_set_index(VALUE self, VALUE vidx, VALUE byteval)
{
    binyo_bytelist *bytelist;
    size_t i = (size_t) NUM2LONG(vidx);

    int_bytelist_get(self, bytelist);

    if (i >= bytelist->limit)
	rb_raise(eBinyoError, "Index out of bounds: %lu", i); /* TODO treat it like Array */

    bytelist->bytes[i] = NUM2INT(byteval) & 0xff;
    if (i >= bytelist->len)
	bytelist->len = i + 1;

    return byteval;
}

#eachObject



180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'ext/binyo/bytelist.c', line 180

static VALUE
binyo_bytelist_each(VALUE self)
{
    binyo_bytelist *bytelist;
    size_t i;

    if (!rb_block_given_p()) {
	/* TODO */
	rb_raise(eBinyoError, "No block given");
    }

    int_bytelist_get(self, bytelist);

    for (i=0; i < bytelist->len; i++) {
	rb_yield(INT2NUM(bytelist->bytes[i]));
    }

    return self;
}

#to_sObject



200
201
202
203
204
205
206
207
208
# File 'ext/binyo/bytelist.c', line 200

static VALUE
binyo_bytelist_to_s(VALUE self)
{
    binyo_bytelist *bytelist;

    int_bytelist_get(self, bytelist);

    return rb_str_new((const char *)bytelist->bytes, (long) bytelist->len);
}