Class: Hyperll::DeltaBytes
- Inherits:
-
Object
- Object
- Hyperll::DeltaBytes
- Defined in:
- ext/hyperll/delta_bytes.c
Class Method Summary collapse
Class Method Details
.compress(rvalues) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'ext/hyperll/delta_bytes.c', line 38 static VALUE rb_delta_bytes_compress(VALUE self, VALUE rvalues) { int rlen = RARRAY_LEN(rvalues); int offset = 0; uint8_t *dest = (uint8_t*)calloc(5 * rlen, sizeof(uint8_t)); uint32_t previous = 0; for (int i = 0; i < rlen; i++) { uint32_t value = NUM2ULONG(rb_ary_entry(rvalues, i)); offset += varint_write_unsigned(value - previous, dest + offset); previous = value; } VALUE rary = rb_ary_new2(offset); for (int i = 0; i < offset; i++) { rb_ary_push(rary, INT2NUM(dest[i])); } free(dest); return rary; } |
.uncompress(rcompressed) ⇒ Object
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'ext/hyperll/delta_bytes.c', line 60 static VALUE rb_delta_bytes_uncompress(VALUE self, VALUE rcompressed) { // copy to a native array int rlen = RARRAY_LEN(rcompressed); uint8_t *compressed = (uint8_t*)calloc(rlen, sizeof(uint8_t)); for (int i = 0; i < rlen; i++) { compressed[i] = (uint8_t)NUM2INT(rb_ary_entry(rcompressed, i)); } uint32_t *values = (uint32_t*)calloc(rlen, sizeof(uint32_t)); int vlen = delta_bytes_uncompress(compressed, rlen, values); if (vlen < 0) { rb_raise(rb_eRuntimeError, "corrupted values"); goto error; } VALUE rary = rb_ary_new2(vlen); for (int i = 0; i < vlen; i++) { rb_ary_push(rary, ULONG2NUM(values[i])); } free(compressed); free(values); return rary; error: free(compressed); free(values); return Qnil; } |