00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _IMPULSE_ARRAY_H_
00009 #define _IMPULSE_ARRAY_H_
00010
00011 #include <vector>
00012
00013 namespace impulse {
00014
00015
00016
00017
00018
00025
00026 class Array : public Frame {
00027
00028 public:
00029
00030 Array( unsigned int size = 0 ) : _size( size ), _memory( _array )
00031 {
00032 if (size > 10) _memory = new Value[size];
00033 }
00034
00035 Array( Value value1 ) : _size( 1 ), _memory( _array )
00036 {
00037 _memory[0] = value1;
00038 }
00039
00040 Array( Value value1, Value value2 ) : _size( 2 ), _memory( _array )
00041 {
00042 _memory[0] = value1;
00043 _memory[1] = value2;
00044 }
00045
00046 string inspect() { return "[Array]"; }
00047
00048 Value at( unsigned int i );
00049 Value atPut( unsigned int i, Value value );
00050
00051 void push( Value value );
00052 void clear() { _size = 0; }
00053
00054 unsigned int size() { return _size; }
00055
00056 Value* data() { return _memory; }
00057
00058 private:
00059
00060 unsigned int _size;
00061 Value _array[10];
00062 Value* _memory;
00063 bool _usegc;
00064
00065 };
00066
00067
00068
00069
00070
00071 class GCArray : public Array {
00072
00073 public:
00074
00075 GCArray( Value value1 ) : Array( value1 )
00076 {
00077 value1.incrRef();
00078 }
00079
00080 GCArray( Value value1, Value value2 ) : Array( value1, value2 )
00081 {
00082 value1.incrRef();
00083 value2.incrRef();
00084 }
00085
00086 ~GCArray()
00087 {
00088 for (unsigned int i = 0; i < size(); i++)
00089 {
00090 data()[i].decrRef();
00091 }
00092 }
00093
00094 };
00095
00096
00097
00098
00099
00100 inline Value Array::at( unsigned int i )
00101 {
00102 if (i < _size)
00103 {
00104 return _memory[i];
00105 }
00106 else
00107 {
00108 return _nil_;
00109 }
00110 }
00111
00112 inline Value Array::atPut( unsigned int i, Value value )
00113 {
00114 if (i < _size)
00115 {
00116 _memory[i].decrRef();
00117
00118 value.incrRef();
00119
00120 return _memory[i] = value;
00121 }
00122 else
00123 {
00124 return Value();
00125 }
00126 }
00127
00128
00129 inline void Array::push( Value value )
00130 {
00131 if (_size >= 10)
00132 {
00133 cout << "Array::push() not fully implemented" << endl;
00134 }
00135
00136 value.incrRef();
00137
00138 _memory[_size++] = value;
00139 }
00140
00141 }
00142
00143 #endif