* t/pmc/complex.t:
[parrot.git] / src / pmc / fixedfloatarray.pmc
blob107aedefa975d91dc486caebb40e56730f462818
1 /*
2 Copyright (C) 2001-2008, The Perl Foundation.
3 $Id$
5 =head1 NAME
7 src/pmc/fixedfloatarray.pmc - fixed size array for floating point numbers only
9 =head1 DESCRIPTION
11 This class, FixedFloatArray, implements an array of fixed size which
12 stored FLOATVALs.  It uses Float PMCs to do all necessary conversions.
14 =head2 Functions
16 =over 4
18 =cut
22 #include "parrot/parrot.h"
24 pmclass FixedFloatArray need_ext provides array {
28 =back
30 =head2 Methods
32 =over 4
34 =item C<void init()>
36 Initializes the array.
38 =cut
42     VTABLE void init() {
43         PMC_int_val(SELF) = 0;
44         PMC_data(SELF)    = NULL;
45     }
49 =item C<void destroy()>
51 Destroys the array.
53 =cut
57     VTABLE void destroy() {
58         if (PMC_data(SELF))
59             mem_sys_free(PMC_data(SELF));
61         PMC_data(SELF)    = NULL;
62         PMC_int_val(SELF) = 0;
63     }
67 =item C<PMC *clone()>
69 Creates and returns a copy of the array.
71 =cut
75     VTABLE PMC *clone() {
76         INTVAL size;
77         size_t mem_size;
78         PMC   * const dest = pmc_new(INTERP, SELF->vtable->base_type);
80         if (!PMC_data(SELF))
81             return dest;
83         size              = PMC_int_val(SELF);
84         PMC_int_val(dest) = size;
85         mem_size          = size * sizeof (FLOATVAL);
87         PMC_data(dest)    = mem_sys_allocate(mem_size);
88         mem_sys_memcopy(PMC_data(dest), PMC_data(SELF), mem_size);
89         PObj_active_destroy_SET(dest);
91         return dest;
92     }
96 =item C<INTVAL get_bool()>
98 Returns whether the array has any elements (meaning been initialized, for a
99 fixed sized array).
101 =cut
104     VTABLE INTVAL get_bool() {
105         const INTVAL size = SELF.elements();
106         return (INTVAL)(size != 0);
107     }
111 =item C<INTVAL elements()>
113 =cut
117     VTABLE INTVAL elements() {
118         return PMC_int_val(SELF);
119     }
123 =item C<INTVAL get_integer()>
125 Returns the number of elements in the array.
127 =cut
131     VTABLE INTVAL get_integer() {
132         return SELF.elements();
133     }
138 =item C<INTVAL get_integer_keyed_int(INTVAL key)>
140 Returns the integer value of the element at index C<key>.
142 =cut
146     VTABLE INTVAL get_integer_keyed_int(INTVAL key) {
147         const FLOATVAL f = SELF.get_number_keyed_int(key);
148         return (INTVAL)f;
149     }
153 =item C<INTVAL get_integer_keyed(PMC *key)>
155 Returns the integer value of the element at index C<*key>.
157 =cut
161     VTABLE INTVAL get_integer_keyed(PMC *key) {
162         /* simple int keys only */
163         const INTVAL k = key_integer(INTERP, key);
164         return SELF.get_integer_keyed_int(k);
165     }
170 =item C<FLOATVAL get_number_keyed_int(INTVAL key)>
172 Returns the floating-point value of the element at index C<key>.
174 =cut
178     VTABLE FLOATVAL get_number_keyed_int(INTVAL key) {
179         FLOATVAL *data;
181         if (key < 0 || key >= PMC_int_val(SELF))
182             real_exception(INTERP, NULL, E_IndexError,
183                 "FixedFloatArray: index out of bounds!");
185         data = (FLOATVAL *)PMC_data(SELF);
186         return data[key];
187     }
191 =item C<FLOATVAL get_number_keyed(PMC *key)>
193 Returns the floating-point value of the element at index C<*key>.
195 =cut
199     VTABLE FLOATVAL get_number_keyed(PMC *key) {
200         const INTVAL k = key_integer(INTERP, key);
201         return SELF.get_number_keyed_int(k);
202     }
206 =item C<STRING *get_string_keyed_int(INTVAL key)>
208 Returns the Parrot string value of the element at index C<key>.
210 =cut
214     VTABLE STRING *get_string_keyed_int(INTVAL key) {
215         PMC * const e = SELF.get_pmc_keyed_int(key);
216         return VTABLE_get_string(INTERP, e);
217     }
221 =item C<STRING *get_string_keyed(PMC *key)>
223 Returns the Parrot string value of the element at index C<*key>.
225 =cut
229     VTABLE STRING *get_string_keyed(PMC *key) {
230         const INTVAL k = key_integer(INTERP, key);
231         return SELF.get_string_keyed_int(k);
232     }
237 =item C<PMC *get_pmc_keyed_int(INTVAL key)>
239 Returns the PMC value of the element at index C<key>.
241 =cut
245     VTABLE PMC *get_pmc_keyed_int(INTVAL key) {
246         PMC    * const ret = pmc_new(INTERP, enum_class_Float);
247         const FLOATVAL val = SELF.get_number_keyed_int(key);
249         VTABLE_set_number_native(INTERP, ret, val);
250         return ret;
251     }
255 =item C<PMC *get_pmc_keyed(PMC *key)>
257 Returns the PMC value of the element at index C<*key>.
259 =cut
263     VTABLE PMC *get_pmc_keyed(PMC *key) {
264         const INTVAL k = key_integer(INTERP, key);
265         return SELF.get_pmc_keyed_int(k);
266     }
270 =item C<void set_integer_native(INTVAL size)>
272 Resizes the array to C<size> elements.
274 =cut
278     VTABLE void set_integer_native(INTVAL size) {
279         if (PMC_int_val(SELF) || size < 1)
280             real_exception(INTERP, NULL, E_IndexError,
281                     "FixedFloatArray: Can't resize!");
283         PMC_int_val(SELF) = size;
284         PMC_data(SELF)    = mem_sys_allocate(size * sizeof (FLOATVAL));
285         PObj_active_destroy_SET(SELF);
286     }
290 =item C<void set_integer_keyed_int(INTVAL key, INTVAL value)>
292 Sets the integer value of the element at index C<key> to C<value>.
294 =cut
298     VTABLE void set_integer_keyed_int(INTVAL key, INTVAL value) {
299         SELF.set_number_keyed_int(key, (FLOATVAL)value);
300     }
304 =item C<void set_integer_keyed(PMC *key, INTVAL value)>
306 Sets the integer value of the element at index C<key> to C<value>.
308 =cut
312     VTABLE void set_integer_keyed(PMC *key, INTVAL value) {
313         const INTVAL k = key_integer(INTERP, key);
314         SELF.set_integer_keyed_int(k, value);
315     }
319 =item C<void set_number_keyed_int(INTVAL key, FLOATVAL value)>
321 Sets the floating-point value of the element at index C<key> to
322 C<value>.
324 =cut
328     VTABLE void set_number_keyed_int(INTVAL key, FLOATVAL value) {
329         FLOATVAL *data;
330         if (key < 0 || key >= PMC_int_val(SELF))
331             real_exception(INTERP, NULL, E_IndexError,
332                 "FixedFloatArray: index out of bounds!");
334         data      = (FLOATVAL *)PMC_data(SELF);
335         data[key] = value;
336     }
340 =item C<void set_number_keyed(PMC *key, FLOATVAL value)>
342 Sets the floating-point value of the element at index C<key> to
343 C<value>.
345 =cut
349     VTABLE void set_number_keyed(PMC *key, FLOATVAL value) {
350         const INTVAL k = key_integer(INTERP, key);
351         SELF.set_number_keyed_int(k, value);
352     }
356 =item C<void set_string_keyed_int(INTVAL key, STRING *value)>
358 Sets the Parrot string value of the element at index C<key> to C<value>.
360 =cut
364     VTABLE void set_string_keyed_int(INTVAL key, STRING *value) {
365         FLOATVAL tempNum;
366         PMC * const tempPMC = pmc_new(INTERP, enum_class_Float);
368         VTABLE_set_string_native(INTERP, tempPMC, value);
369         tempNum = VTABLE_get_number(INTERP, tempPMC);
370         SELF.set_number_keyed_int(key, tempNum);
371     }
375 =item C<void set_string_keyed(PMC *key, STRING *value)>
377 Sets the string value of the element at index C<key> to
378 C<value>.
380 =cut
384     VTABLE void set_string_keyed(PMC *key, STRING *value) {
385         const INTVAL k = key_integer(INTERP, key);
386         SELF.set_string_keyed_int(k, value);
387     }
391 =item C<void set_pmc_keyed_int(INTVAL key, PMC *src)>
393 Sets the PMC value of the element at index C<key> to C<*src>.
395 =cut
399     VTABLE void set_pmc_keyed_int(INTVAL key, PMC *src) {
400         const FLOATVAL tempNum = VTABLE_get_number(INTERP, src);
401         SELF.set_number_keyed_int(key, tempNum);
402     }
406 =item C<void set_pmc_keyed(PMC *key, PMC *value)>
408 Sets the string value of the element at index C<key> to
409 C<value>.
411 =cut
415     VTABLE void set_pmc_keyed(PMC *key, PMC *value) {
416         const INTVAL k = key_integer(INTERP, key);
417         SELF.set_pmc_keyed_int(k, value);
418     }
424 =back
426 =head1 SEE ALSO
428 F<docs/pdds/pdd17_basic_types.pod>.
430 =cut
435  * Local variables:
436  *   c-file-style: "parrot"
437  * End:
438  * vim: expandtab shiftwidth=4:
439  */