Class: Hyperll::RegisterSet

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
ext/hyperll/register_set.c

Class Method Summary collapse

Instance Method Summary collapse

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;
}

#eachObject



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;
}

#serializeObject



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);
}

#sizeObject



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;
}