Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef INCLUDE_ARRAY
00010 #define INCLUDE_ARRAY
00011
00012 #include "matlabexception.h"
00013 #include <string.h>
00014
00015
00016
00017 template <class Type> void copymemory (const Type* source, Type* dest,
00018 int length) {
00019 memcpy(dest,source,sizeof(Type)*length);
00020 }
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 template <class Type> class Array {
00038 public:
00039
00040
00041
00042 explicit Array (int length);
00043
00044
00045
00046 Array (Type* data, int length);
00047
00048
00049
00050 Array (const Array<Type>& source);
00051
00052
00053 ~Array();
00054
00055
00056 void setvalue (const Type& value);
00057
00058
00059
00060 void inject (const Type* source);
00061 void inject (const Array<Type>& source);
00062 Array<Type>& operator= (const Type* source);
00063 Array<Type>& operator= (const Array<Type>& source);
00064
00065
00066
00067
00068 void copyto (Type* dest) const;
00069
00070
00071 int length() const { return n; };
00072
00073
00074
00075
00076
00077
00078 Type& operator[] (int i);
00079 const Type& operator[] (int i) const;
00080
00081
00082
00083 bool operator== (const Array<Type>& a) const { return n == a.n; };
00084 bool operator!= (const Array<Type>& a) const { return !(*this == a); };
00085
00086 protected:
00087 Type* elems;
00088 int n;
00089 bool owner;
00090 };
00091
00092
00093
00094 template <class Type> Array<Type>::Array (int length) {
00095 n = length;
00096 owner = true;
00097 elems = 0;
00098 elems = new Type[length];
00099 }
00100
00101 template <class Type> Array<Type>::Array (Type* data, int length) {
00102 n = length;
00103 owner = false;
00104 elems = data;
00105 }
00106
00107 template <class Type> Array<Type>::Array (const Array<Type>& source) {
00108 n = source.n;
00109 owner = false;
00110 elems = source.elems;
00111 }
00112
00113 template <class Type> Array<Type>::~Array () {
00114 if (owner && elems)
00115 delete[] elems;
00116 }
00117
00118 template <class Type> void Array<Type>::setvalue (const Type& value) {
00119 for (int i = 0; i < n; i++)
00120 elems[i] = value;
00121 }
00122
00123 template <class Type> void Array<Type>::inject (const Type* source) {
00124
00125
00126
00127 if (elems != source)
00128 copymemory<Type>(source,elems,n);
00129 }
00130
00131 template <class Type> void Array<Type>::inject (const Array<Type>& source) {
00132 if (n != source.n)
00133 throw MatlabException("Unable to perform copy; arrays have \
00134 different lengths");
00135 inject(source.elems);
00136 }
00137
00138 template <class Type> Array<Type>& Array<Type>::operator=
00139 (const Type* source) {
00140 inject(source);
00141 return *this;
00142 }
00143
00144 template <class Type> Array<Type>& Array<Type>::operator=
00145 (const Array<Type>& source) {
00146 inject(source);
00147 return *this;
00148 }
00149
00150 template <class Type> void Array<Type>::copyto (Type* dest) const {
00151 Array destarray(dest,n);
00152 destarray.inject(*this);
00153 }
00154
00155 template <class Type> Type& Array<Type>::operator[] (int i) {
00156 return elems[i];
00157 }
00158
00159 template <class Type> const Type& Array<Type>::operator[] (int i) const {
00160 return elems[i];
00161 }
00162
00163 #endif