Class: Hikari::Buffer

Inherits:
Object
  • Object
show all
Defined in:
ext/hikari_buffer/buffer.c

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'ext/hikari_buffer/buffer.c', line 98

static VALUE
buffer_initialize(int argc, VALUE *argv, VALUE self)
{

    Buffer *buffer = get_buffer_struct(self);
    size_t capacity = BUFFER_INITIAL_CAPACITY;
    if (argc > 1)
        rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 0 or 1)", argc);
    if (argc == 1)
        capacity = NUM2SIZET(argv[0]);
    if (capacity == 0)
        rb_raise(rb_eArgError, "capacity must be greater than 0");
    buffer->capacity = capacity;
    buffer->size = 0;
    buffer->cursor = 0;
    buffer->data = ALLOC_N(uint8_t, capacity);
    return Qnil;
}

Instance Method Details

#capacityObject



134
135
136
137
138
139
140
# File 'ext/hikari_buffer/buffer.c', line 134

static VALUE
buffer_capacity(VALUE self)
{
    Buffer *buffer = get_buffer_struct(self);

    return SIZET2NUM(buffer->capacity);
}

#clearObject



158
159
160
161
162
163
164
165
166
167
# File 'ext/hikari_buffer/buffer.c', line 158

static VALUE
buffer_clear(VALUE self)
{
    Buffer *buffer = get_buffer_struct(self);

    buffer->size = 0;
    buffer->cursor = 0;

    return self;
}

#cursorObject



150
151
152
153
154
155
156
# File 'ext/hikari_buffer/buffer.c', line 150

static VALUE
buffer_cursor(VALUE self)
{
    Buffer *buffer = get_buffer_struct(self);

    return SIZET2NUM(buffer->cursor);
}

#peek_boolObject



363
364
365
366
367
368
369
370
371
372
373
# File 'ext/hikari_buffer/buffer.c', line 363

static VALUE
buffer_peek_bool(VALUE self)
{
    Buffer *buffer = get_buffer_struct(self);
    uint8_t value;
    buffer_peek(
        buffer,
        &value,
        sizeof(value));
    return value ? Qtrue : Qfalse;
}

#read_boolObject



352
353
354
355
356
357
358
359
360
361
362
# File 'ext/hikari_buffer/buffer.c', line 352

static VALUE
buffer_read_bool(VALUE self)
{
    Buffer *buffer = get_buffer_struct(self);
    uint8_t value;
    buffer_read(
        buffer,
        &value,
        sizeof(value));
    return value ? Qtrue : Qfalse;
}

#read_bytes(len) ⇒ Object



270
271
272
273
274
275
276
277
278
279
280
281
282
# File 'ext/hikari_buffer/buffer.c', line 270

static VALUE
buffer_read_bytes(VALUE self, VALUE len)
{
    Buffer *buffer = get_buffer_struct(self);
    size_t length = NUM2SIZET(len);

    VALUE str = rb_str_new(NULL, length);
    buffer_read(
        buffer,
        RSTRING_PTR(str),
        length);
    return str;
}

#read_stringObject



314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
# File 'ext/hikari_buffer/buffer.c', line 314

static VALUE
buffer_read_string(VALUE self)
{
    Buffer *buffer = get_buffer_struct(self);

    uint32_t length = 0;

    buffer_read(
        buffer,
        &length,
        sizeof(length));

    VALUE str = rb_str_new(NULL, length);
    rb_enc_associate(
        str,
        rb_utf8_encoding());

    buffer_read(
        buffer,
        RSTRING_PTR(str),
        length);

    return str;
}

#remainingObject



184
185
186
187
188
189
190
# File 'ext/hikari_buffer/buffer.c', line 184

static VALUE
buffer_remaining(VALUE self)
{
    Buffer *buffer = get_buffer_struct(self);

    return SIZET2NUM(buffer->size - buffer->cursor);
}

#rewindObject



168
169
170
171
172
173
174
175
176
# File 'ext/hikari_buffer/buffer.c', line 168

static VALUE
buffer_rewind(VALUE self)
{
    Buffer *buffer = get_buffer_struct(self);

    buffer->cursor = 0;

    return self;
}

#seek(pos) ⇒ Object



191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'ext/hikari_buffer/buffer.c', line 191

static VALUE
buffer_seek(VALUE self, VALUE pos)
{
    Buffer *buffer = get_buffer_struct(self);
    size_t position = NUM2SIZET(pos);
    if (position > buffer->size)
    {
        rb_raise(
            rb_eRangeError,
            "seek position %zu exceeds buffer size %zu",
            position,
            buffer->size);
    }
    buffer->cursor = position;
    return self;
}

#sizeObject



142
143
144
145
146
147
148
# File 'ext/hikari_buffer/buffer.c', line 142

static VALUE
buffer_size(VALUE self)
{
    Buffer *buffer = get_buffer_struct(self);

    return SIZET2NUM(buffer->size);
}

#skip(len) ⇒ Object



207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'ext/hikari_buffer/buffer.c', line 207

static VALUE
buffer_skip(VALUE self, VALUE len)
{
    Buffer *buffer = get_buffer_struct(self);

    size_t length = NUM2SIZET(len);

    buffer_check_read_bounds(buffer, length);

    buffer->cursor += length;

    return self;
}

#tellObject



177
178
179
180
181
182
183
# File 'ext/hikari_buffer/buffer.c', line 177

static VALUE
buffer_tell(VALUE self)
{
    Buffer *buffer = get_buffer_struct(self);

    return SIZET2NUM(buffer->cursor);
}

#write_bool(val) ⇒ Object



339
340
341
342
343
344
345
346
347
348
349
350
351
# File 'ext/hikari_buffer/buffer.c', line 339

static VALUE
buffer_write_bool(VALUE self, VALUE val)
{
    if (val != Qtrue && val != Qfalse)
        rb_raise(rb_eTypeError, "expected a boolean value");
    Buffer *buffer = get_buffer_struct(self);
    uint8_t value = (val == Qtrue);
    buffer_write(
        buffer,
        &value,
        sizeof(value));
    return self;
}

#write_bytesObject

#write_string(str) ⇒ Object



284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
# File 'ext/hikari_buffer/buffer.c', line 284

static VALUE
buffer_write_string(VALUE self, VALUE str)
{
    Buffer *buffer = get_buffer_struct(self);

    Check_Type(str, T_STRING);

    size_t len = RSTRING_LEN(str);

    if (len > UINT32_MAX)
    {
        rb_raise(
            rb_eRangeError,
            "string is too large");
    }

    uint32_t length = (uint32_t)len;

    buffer_write(
        buffer,
        &length,
        sizeof(length));

    buffer_write(
        buffer,
        RSTRING_PTR(str),
        len);

    return self;
}