Class: Hyperll::RegisterSet
- Inherits:
-
Object
- Object
- Hyperll::RegisterSet
- Includes:
- Enumerable
- Defined in:
- ext/hyperll/register_set.c
Class Method Summary collapse
Instance Method Summary collapse
- #[](position) ⇒ Object
- #[]=(position, value) ⇒ Object
- #each ⇒ Object
- #merge(other) ⇒ Object
- #serialize ⇒ Object
- #size ⇒ Object
- #update_if_greater(position, value) ⇒ Object
Class Method Details
.new(*args) ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'ext/hyperll/register_set.c', line 76
static VALUE rb_register_set_new(int argc, VALUE *argv, VALUE klass) {
VALUE count, values;
rb_scan_args(argc, argv, "11", &count, &values);
register_set *set = ALLOC(register_set);
register_set_init(set, NUM2INT(count));
VALUE setv = Data_Wrap_Struct(klass, 0, register_set_free, set);
if (!NIL_P(values)) {
Check_Type(values, T_ARRAY);
if (RARRAY_LEN(values) == set->size) {
for (int i = 0; i < set->size; i++) {
set->values[i] = NUM2ULONG(rb_ary_entry(values, i));
}
} else {
rb_raise(rb_eArgError, "initial set of values is not of the correct size");
}
}
return setv;
}
|
Instance Method Details
#[](position) ⇒ Object
109 110 111 112 113 114 115 |
# File 'ext/hyperll/register_set.c', line 109
static VALUE rb_register_set_index_get(VALUE self, VALUE position) {
Check_Type(position, T_FIXNUM);
register_set *set;
Data_Get_Struct(self, register_set, set);
return UINT2NUM(register_set_get(set, NUM2INT(position)));
}
|
#[]=(position, value) ⇒ Object
98 99 100 101 102 103 104 105 106 107 |
# File 'ext/hyperll/register_set.c', line 98
static VALUE rb_register_set_index_set(VALUE self, VALUE position, VALUE value) {
Check_Type(position, T_FIXNUM);
Check_Type(value, T_FIXNUM);
register_set *set;
Data_Get_Struct(self, register_set, set);
register_set_set(set, NUM2INT(position), NUM2ULONG(value));
return Qnil;
}
|
#each ⇒ Object
144 145 146 147 148 149 150 151 152 153 |
# File 'ext/hyperll/register_set.c', line 144
static VALUE rb_register_set_each(VALUE self) {
register_set *set;
Data_Get_Struct(self, register_set, set);
for (int i = 0; i < set->count; i++) {
rb_yield(UINT2NUM(register_set_get(set, i)));
}
return self;
}
|
#merge(other) ⇒ Object
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'ext/hyperll/register_set.c', line 128
static VALUE rb_register_set_merge(VALUE self, VALUE other) {
register_set *set;
Data_Get_Struct(self, register_set, set);
register_set *other_set;
Data_Get_Struct(other, register_set, other_set);
if (other_set == NULL) {
rb_raise(rb_eTypeError, "other must be another register set");
return Qnil;
}
register_set_merge(set, other_set);
return self;
}
|
#serialize ⇒ Object
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'ext/hyperll/register_set.c', line 155
static VALUE rb_register_set_serialize(VALUE self) {
register_set *set;
Data_Get_Struct(self, register_set, set);
int strsize = set->size * sizeof(int);
char *str = (char*)malloc(strsize + 1);
str[strsize] = 0;
for (int i = 0; i < set->size; i++) {
int value = set->values[i];
int offset = i * 4;
str[offset] = (char)(value >> 24);
str[offset + 1] = (char)(value >> 16);
str[offset + 2] = (char)(value >> 8);
str[offset + 3] = (char)value;
}
return rb_str_new(str, strsize);
}
|
#size ⇒ Object
176 177 178 179 180 181 |
# File 'ext/hyperll/register_set.c', line 176
static VALUE rb_register_set_size(VALUE self) {
register_set *set;
Data_Get_Struct(self, register_set, set);
return INT2NUM(set->size);
}
|
#update_if_greater(position, value) ⇒ Object
117 118 119 120 121 122 123 124 125 126 |
# File 'ext/hyperll/register_set.c', line 117
static VALUE rb_register_set_update_if_greater(VALUE self, VALUE position, VALUE value) {
Check_Type(position, T_FIXNUM);
Check_Type(value, T_FIXNUM);
register_set *set;
Data_Get_Struct(self, register_set, set);
int rv = register_set_update_if_greater(set, NUM2INT(position), NUM2ULONG(value));
return rv ? Qtrue : Qfalse;
}
|