00001 #ifndef __J2K__Vector_HPP__
00002 #define __J2K__Vector_HPP__
00003
00004 #include <j2k/Fred/Basic.hpp>
00005 #include <j2k/Fred/Boolean.hpp>
00006 #include <j2k/Fred/StdTypes.hpp>
00007
00008
00009
00010 #define MC_Create_Vector( NAME, TYPE ) \
00011 class Vector ## NAME \
00012 { \
00013 private: \
00014 \
00015 TYPE* data; \
00016 \
00017 \
00018 ULONG length; \
00019 \
00020 \
00021 \
00022 void init( ULONG newLen, const TYPE* newData = NULL ) { \
00023 empty(); \
00024 \
00025 length = newLen; \
00026 \
00027 if ( newData != NULL ) { \
00028 if ( length == 0 ) length++; \
00029 data = new TYPE[ length ]; \
00030 assert( data != NULL ); \
00031 \
00032 \
00033 memcpy( data, newData, length * sizeof( TYPE ) ); \
00034 } \
00035 } \
00036 \
00037 public: \
00038 Vector ## NAME ## ( ULONG length = 0, const TYPE* newData = NULL ) \
00039 : data( NULL ), length( 0 ) \
00040 { \
00041 init( length, newData ); \
00042 } \
00043 \
00044 Vector ## NAME ## ( const Vector ## NAME ## & v ) \
00045 : data( NULL ), length( 0 ) \
00046 { \
00047 init( v.length, v.data ); \
00048 } \
00049 \
00050 virtual ~Vector ## NAME ## () { \
00051 empty(); \
00052 } \
00053 \
00054 Vector ## NAME ## & setLength( ULONG newLen ) { \
00055 init( newLen ); \
00056 return *this; \
00057 } \
00058 \
00059 BOOL isEmpty() const { \
00060 return ( data == NULL ); \
00061 } \
00062 \
00063 \
00064 void empty() { \
00065 if ( data != NULL ) { \
00066 delete [] data; \
00067 data = NULL; \
00068 } \
00069 length = 0; \
00070 } \
00071 \
00072 ULONG length() const { return length; } \
00073 \
00074 Vector ## NAME ## & operator=( const Vector ## NAME ## & v ) { \
00075 if ( &v != this ) { \
00076 init( v.length, v.data ); \
00077 } \
00078 return *this; \
00079 } \
00080 \
00081 \
00082 Vector ## NAME ## & operator=( const TYPE t ) { \
00083 TYPE *pt = data; \
00084 for ( int i = 0; i < length; i++ ) { \
00085 *pt++ = t; \
00086 } \
00087 return *this; \
00088 } \
00089 \
00090 \
00091 TYPE& operator[]( ULONG element ) { \
00092 assert( !isEmpty() ); \
00093 assert( element < length ); \
00094 return data[element]; \
00095 } \
00096 \
00097 const TYPE operator[]( ULONG element ) const { \
00098 assert( !isEmpty() ); \
00099 assert( element < length ); \
00100 return data[element]; \
00101 } \
00102 \
00103 \
00104 const TYPE* getData( ULONG len, ULONG b = 0 ) const { \
00105 assert( !isEmpty() ); \
00106 assert( (b+len) < length ); \
00107 return &data[b]; \
00108 } \
00109 \
00110 \
00111 const Vector ## NAME ## operator()( ULONG b, ULONG len ) const { \
00112 assert( !isEmpty() ); \
00113 assert( (b+len) < length ); \
00114 \
00115 \
00116 \
00117 Vector ## NAME \
00118 vRet( len, &data[b] ); \
00119 \
00120 return vRet; \
00121 } \
00122 \
00123 }; \
00124 \
00125 \
00126 Vector ## NAME ## add( const Vector ## NAME ## & v1, \
00127 const Vector ## NAME ## & v2 ) \
00128 { \
00129 ULONG len = min( v1.length(), v2.length() ); \
00130 if ( len == 0 ) len++ \
00131 \
00132 Vector ## NAME \
00133 vRet( len ); \
00134 \
00135 for ( ULONG i = 0; i < len; i++ ) { \
00136 vRet[i] = v1[i] + v2[i]; \
00137 } \
00138 \
00139 return vRet; \
00140 } \
00141 \
00142 \
00143 \
00144 Vector ## NAME ## sub( const Vector ## NAME ## & v1, \
00145 const Vector ## NAME ## & v2 ) \
00146 { \
00147 ULONG len = min( v1.length(), v2.length() ); \
00148 if ( len == 0 ) len++; \
00149 Vector ## NAME \
00150 vRet( len ); \
00151 \
00152 for ( ULONG i = 0; i < len; i++ ) { \
00153 vRet[i] = v1[i] - v2[i]; \
00154 } \
00155 return vRet; \
00156 } \
00157 \
00158 \
00159 \
00160 Vector ## NAME ## pwisemult( const Vector ## NAME ## & v1, \
00161 const Vector ## NAME ## & v2 ) \
00162 { \
00163 ULONG len = min( v1.length(), v2.length() ); \
00164 if ( len == 0 ) len++; \
00165 Vector## NAME \
00166 vRet( len ); \
00167 for ( ULONG i = 0; i < len; i++ ) { \
00168 vRet[i] = v1[i] * v2[i]; \
00169 } \
00170 return vRet; \
00171 } \
00172 \
00173 \
00174 \
00175 TYPE mult( const Vector ## NAME ##& v1, const Vector ## NAME ## & v2 ) \
00176 { \
00177 ULONG len = min( v1.length(), v2.length() ); \
00178 if ( len == 0 ) len++; \
00179 TYPE t = (TYPE)0; \
00180 for ( ULONG i = 0; i < len; i++ ) { \
00181 t += v1[i] * v2[i]; \
00182 } \
00183 return t; \
00184 } \
00185 \
00186 \
00187 TYPE sum( const Vector ## NAME ## & v ) \
00188 { \
00189 ULONG len = v.length(); \
00190 if ( len == 0 ) len++; \
00191 TYPE t = (TYPE)0; \
00192 for ( ULONG i = 0; i < len; i++ ) { \
00193 t += v[i]; \
00194 } \
00195 return t; \
00196 } \
00197 \
00198 \
00199 Vector ## NAME ## scale( float scale, const Vector ## NAME ## & v ) \
00200 { \
00201 ULONG len = v.length(); \
00202 if ( len == 0 ) len++; \
00203 Vector## NAME \
00204 vRet( len ); \
00205 \
00206 for( ULONG i = 0; i < len; i++ ) { \
00207 vRet[i] = (TYPE)(scale * v[i]); \
00208 } \
00209 return vRet; \
00210 } \
00211 \
00212 ostream& operator<<( ostream& os, const Vector## NAME ##& v ) \
00213 { \
00214 ULONG len = v.length(); \
00215 os << "Vector<" << TYPEid( TYPE ).name(); \
00216 os << ">( " << len << " )\n{"; \
00217 \
00218 if ( v.isEmpty() ) { \
00219 os << "\n};\n"; \
00220 } else { \
00221 os << "\n\t"; \
00222 for( ULONG i = 0; i < len - 1; i++ ) { \
00223 os << v[i] << ", "; \
00224 } \
00225 os << v[i] << "\n};\n"; \
00226 } \
00227 return os; \
00228 } \
00229 \
00230 BOOL operator!=( const Vector## NAME ##& v1, const Vector## NAME ##& v2 ) \
00231 { \
00232 if ( &v1 == &v2 ) \
00233 return FALSE; \
00234 \
00235 if ( v1.length() != v2.length() ) \
00236 return TRUE; \
00237 \
00238 for ( ULONG i = 0; i < v1.length(); i++ ) \
00239 if ( v1[i] != v2[i] ) \
00240 return TRUE; \
00241 \
00242 return FALSE; \
00243 } \
00244 \
00245 BOOL operator==( const Vector## NAME ##& v1, const Vector## NAME ##& v2 ) \
00246 { \
00247 return ( ! ( v1 != v2 ) ); \
00248 } \
00249
00250
00251 #endif
00252
00253