DynamicSize.hpp

00001 
00002 //
00003 // $Id: DynamicSize.hpp,v 1.5 2008/03/10 20:20:50 werner Exp $
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 } /* namespace Fiber */ 
00245 
00246 #endif /* __FIBER_DYNAMICSIZE_HPP */