Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tag: RELEASE_0_4_4
Fetching contributors…

Cannot retrieve contributors at this time

463 lines (287 sloc) 7.931 kb
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
$Id$
=head1 NAME
src/pmc/fixedfloatarray.pmc - fixed size array for floating point numbers only
=head1 DESCRIPTION
This class, FixedFloatArray, implements an array of fixed size, which stored FLOATVALs,
it uses Float PMCs to do all necessary conversions
=head2 Functions
=over 4
=cut
*/
#include "parrot/parrot.h"
pmclass FixedFloatArray need_ext does array {
/*
=back
=head2 Methods
=over 4
=item C<void init()>
Initializes the array.
=cut
*/
void init () {
PMC_int_val(SELF) = 0;
PMC_data(SELF) = NULL;
}
/*
=item C<void morph(INTVAL type)>
Const PMCs must have a C<morph()>.
=cut
*/
void morph(INTVAL type) {
SUPER(type);
}
/*
=item C<void destroy()>
Destroys the array.
=cut
*/
void destroy () {
if (PMC_data(SELF))
mem_sys_free(PMC_data(SELF));
PMC_data(SELF) = NULL;
PMC_int_val(SELF) = 0;
}
/*
=item C<PMC *clone()>
Creates and returns a copy of the array.
=cut
*/
PMC* clone () {
INTVAL size;
PMC * dest = pmc_new(INTERP, SELF->vtable->base_type);
if (!PMC_data(SELF))
return dest;
size = PMC_int_val(SELF);
PMC_int_val(dest) = size;
PMC_data(dest) = mem_sys_allocate(size * sizeof(FLOATVAL));
mem_sys_memcopy(PMC_data(dest), PMC_data(SELF), size*sizeof(FLOATVAL));
PObj_active_destroy_SET(dest);
return dest;
}
/*
=item C<INTVAL get_bool()>
Returns whether the array has any elements (meaning been initialized, for a
fixed sized array).
=cut
*/
INTVAL get_bool () {
INTVAL size = SELF.elements();
return (INTVAL)(size != 0);
}
/*
=item C<INTVAL elements()>
=cut
*/
INTVAL elements () {
return PMC_int_val(SELF);
}
/*
=item C<INTVAL get_integer()>
Returns the number of elements in the array.
=cut
*/
INTVAL get_integer () {
return SELF.elements();
}
/*
=item C<INTVAL get_integer_keyed_int(INTVAL key)>
Returns the integer value of the element at index C<key>.
=cut
*/
INTVAL get_integer_keyed_int (INTVAL key) {
return (INTVAL)DYNSELF.get_number_keyed_int(key);
}
/*
=item C<INTVAL get_integer_keyed(PMC *key)>
Returns the integer value of the element at index C<*key>.
=cut
*/
INTVAL get_integer_keyed (PMC* key) {
/* simple int keys only */
INTVAL k = key_integer(INTERP, key);
return DYNSELF.get_integer_keyed_int(k);
}
/*
=item C<FLOATVAL get_number_keyed_int(INTVAL key)>
Returns the floating-point value of the element at index C<key>.
=cut
*/
FLOATVAL get_number_keyed_int (INTVAL key) {
FLOATVAL *data;
if (key < 0 || key >= PMC_int_val(SELF))
real_exception(INTERP, NULL, E_IndexError,
"FixedFloatArray: index out of bounds!");
data = (FLOATVAL *)PMC_data(SELF);
return data[key];
}
/*
=item C<FLOATVAL get_number_keyed (PMC* key)>
Returns the floating-point value of the element at index C<*key>.
=cut
*/
FLOATVAL get_number_keyed (PMC* key) {
INTVAL k = key_integer(INTERP, key);
return DYNSELF.get_number_keyed_int(k);
}
/*
=item C<STRING *get_string_keyed_int(INTVAL key)>
Returns the Parrot string value of the element at index C<key>.
=cut
*/
STRING* get_string_keyed_int (INTVAL key) {
PMC *temp;
temp = DYNSELF.get_pmc_keyed_int(key);
return VTABLE_get_string(INTERP, temp);
}
/*
=item C<STRING *get_string_keyed(PMC *key)>
Returns the Parrot string value of the element at index C<*key>.
=cut
*/
STRING* get_string_keyed(PMC* key) {
INTVAL k = key_integer(INTERP, key);
return DYNSELF.get_string_keyed_int(k);
}
/*
=item C<PMC *get_pmc_keyed_int(INTVAL key)>
Returns the PMC value of the element at index C<key>.
=cut
*/
PMC* get_pmc_keyed_int (INTVAL key) {
PMC *ret;
FLOATVAL val;
ret = pmc_new(INTERP, enum_class_Float);
val = DYNSELF.get_number_keyed_int(key);
VTABLE_set_number_native(INTERP, ret, val);
return ret;
}
/*
=item C<PMC *get_pmc_keyed(PMC *key)>
Returns the PMC value of the element at index C<*key>.
=cut
*/
PMC* get_pmc_keyed(PMC* key) {
INTVAL k = key_integer(INTERP, key);
return DYNSELF.get_pmc_keyed_int(k);
}
/*
=item C<void set_integer_native(INTVAL size)>
Resizes the array to C<size> elements.
=cut
*/
void set_integer_native (INTVAL size) {
if (PMC_int_val(SELF) || size < 1)
real_exception(INTERP, NULL, E_IndexError,
"FixedFloatArray: Can't resize!");
PMC_int_val(SELF) = size;
PMC_data(SELF) = mem_sys_allocate(size * sizeof(FLOATVAL));
PObj_active_destroy_SET(SELF);
}
/*
=item C<void set_integer_keyed_int(INTVAL key, INTVAL value)>
Sets the integer value of the element at index C<key> to C<value>.
=cut
*/
void set_integer_keyed_int (INTVAL key, INTVAL value) {
DYNSELF.set_number_keyed_int(key, (FLOATVAL)value);
}
/*
=item C<void set_integer_keyed(PMC *key, INTVAL value)>
Sets the integer value of the element at index C<key> to C<value>.
=cut
*/
void set_integer_keyed (PMC *key, INTVAL value) {
INTVAL k;
k = key_integer(INTERP, key);
DYNSELF.set_integer_keyed_int(k, value);
}
/*
=item C<void set_number_keyed_int(INTVAL key, FLOATVAL value)>
Sets the floating-point value of the element at index C<key> to
C<value>.
=cut
*/
void set_number_keyed_int (INTVAL key, FLOATVAL value) {
FLOATVAL *data;
if (key < 0 || key >= PMC_int_val(SELF))
real_exception(INTERP, NULL, E_IndexError,
"FixedFloatArray: index out of bounds!");
data = (FLOATVAL*)PMC_data(SELF);
data[key] = value;
}
/*
=item C<void set_number_keyed(PMC *key, FLOATVAL value)>
Sets the floating-point value of the element at index C<key> to
C<value>.
=cut
*/
void set_number_keyed(PMC *key, FLOATVAL value) {
INTVAL k;
k = key_integer(INTERP, key);
DYNSELF.set_number_keyed_int(k, value);
}
/*
=item C<void set_string_keyed_int(INTVAL key, STRING *value)>
Sets the Parrot string value of the element at index C<key> to C<value>.
=cut
*/
void set_string_keyed_int (INTVAL key, STRING* value) {
FLOATVAL tempNum;
PMC *tempPMC;
tempPMC = pmc_new(INTERP, enum_class_Float);
VTABLE_set_string_native(INTERP, tempPMC, value);
tempNum = VTABLE_get_number(INTERP, tempPMC);
DYNSELF.set_number_keyed_int(key, tempNum);
}
/*
=item C<void set_string_keyed(PMC *key, STRING* value)>
Sets the string value of the element at index C<key> to
C<value>.
=cut
*/
void set_string_keyed(PMC *key, STRING* value) {
INTVAL k;
k = key_integer(INTERP, key);
DYNSELF.set_string_keyed_int(k, value);
}
/*
=item C<void set_pmc_keyed_int(INTVAL key, PMC *src)>
Sets the PMC value of the element at index C<key> to C<*src>.
=cut
*/
void set_pmc_keyed_int (INTVAL key, PMC* src) {
FLOATVAL tempNum;
tempNum = VTABLE_get_number(INTERP, src);
DYNSELF.set_number_keyed_int(key, tempNum);
}
/*
=item C<void set_pmc_keyed(PMC *key, PMC* value)>
Sets the string value of the element at index C<key> to
C<value>.
=cut
*/
void set_pmc_keyed(PMC *key, PMC* value) {
INTVAL k;
k = key_integer(INTERP, key);
DYNSELF.set_pmc_keyed_int(k, value);
}
}
/*
=back
=head1 SEE ALSO
F<docs/pdds/pdd17_basic_types.pod>.
=head1 HISTORY
Initial version 2004.06.11 by Matt Fowles
=cut
*/
/*
* Local variables:
* c-indentation-style: bsd
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*
* vim: expandtab shiftwidth=4:
*/
Jump to Line
Something went wrong with that request. Please try again.