00001
00002
00003
00004
00006 #ifndef __FIBER_DYNAMICSIZE_HPP
00007 #define __FIBER_DYNAMICSIZE_HPP
00008
00009 #include "FieldAPI.h"
00010 #include <memcore/RefPtr.hpp>
00011 #include <memcore/Interface.hpp>
00012 #include <vector/MultiIndex.hpp>
00013
00014 namespace Fiber
00015 {
00016
00028 class FIELD_API DynamicSize
00029 {
00030 int rank;
00031 index_t *dims;
00032
00033 protected:
00035 DynamicSize(int N, const DynamicSize&L, const DynamicSize&R);
00036
00037 public:
00039 template <int N>
00040 DynamicSize(const MultiIndex<N>&MI)
00041 : rank(N)
00042 {
00043 dims = new index_t[ N ];
00044 for(int i=0; i<N; i++)
00045 dims[i] = MI[i];
00046 }
00047
00049 template <class T>
00050 DynamicSize(int N, const T values[])
00051 : rank(N)
00052 {
00053 dims = new index_t[ N ];
00054 for(int i=0; i<N; i++)
00055 dims[i] = values[i];
00056 }
00057
00062 DynamicSize(int N)
00063 : rank(N)
00064 {
00065 if (N>0)
00066 {
00067 dims = new index_t[ N ];
00068 for(int i=0; i<N; i++)
00069 dims[i] = 1;
00070 }
00071 else
00072 dims = 0;
00073 }
00074
00076 DynamicSize()
00077 : rank(0)
00078 , dims(0)
00079 {}
00080
00082 DynamicSize(const DynamicSize&DS);
00083
00085 ~DynamicSize();
00086
00088 DynamicSize&operator=(const DynamicSize&DS);
00089
00091 bool operator!=(const DynamicSize&DS);
00092
00096 index_t nElements() const
00097 {
00098 if (!dims) return 0;
00099
00100 index_t N = 1;
00101 for(int i=0; i<rank; i++)
00102 {
00103 N *= dims[i];
00104 }
00105 return N;
00106 }
00107
00111 int size() const
00112 {
00113 return rank;
00114 }
00115
00119 int Rank() const
00120 {
00121 return rank;
00122 }
00123
00127 int dimensionality() const
00128 {
00129 return rank;
00130 }
00131
00138 index_t operator[](int i) const
00139 {
00140 if (!dims)
00141 return 0;
00142
00143 if (i>=0 && i<rank)
00144 return dims[i];
00145 else
00146 return 1;
00147 }
00148
00152 const index_t *dims_ptr() const
00153 {
00154 return dims;
00155 }
00156
00163 bool setSize(int i, index_t what)
00164 {
00165 if (!dims)
00166 return false;
00167
00168 if (i>=0 && i<rank)
00169 {
00170 dims[i] = what;
00171 return true;
00172 }
00173
00174 return 1;
00175 }
00176
00181 template <int N>
00182 bool get(MultiIndex<N>&MI) const
00183 {
00184 if (rank != N)
00185 return false;
00186
00187 for(int i=0; i<N; i++)
00188 MI[i] = dims[i];
00189
00190 return true;
00191 }
00192 };
00193
00206 class FIELD_API SizeInterface : public MemCore::Interface<SizeInterface>, public DynamicSize
00207 {
00209 SizeInterface(int rank, const SizeInterface&L, const SizeInterface&R);
00210
00211 public:
00213 template <int N>
00214 SizeInterface(const MultiIndex<N>&MI)
00215 : DynamicSize(MI)
00216 {}
00217
00221 SizeInterface(int N)
00222 : DynamicSize(N)
00223 {}
00224
00226 SizeInterface(const SizeInterface&DS);
00227
00229 ~SizeInterface();
00230
00231 using DynamicSize::size;
00232 using DynamicSize::operator[];
00233 using DynamicSize::operator!=;
00234 using DynamicSize::operator=;
00235
00240 friend MemCore::RefPtr<SizeInterface> operator+(const MemCore::RefPtr<SizeInterface>&L,
00241 const MemCore::RefPtr<SizeInterface>&R);
00242 };
00243
00244 }
00245
00246 #endif