CreativeArray.hpp

00001 #ifndef __FIELD_CREATIVE_MULTIARRAY_HPP
00002 #define __FIELD_CREATIVE_MULTIARRAY_HPP "Created 30.08.2004 12:12:12 by bzfbenge"
00003 
00004 #include "FieldAPI.h"
00005 #include <memcore/Ageable.hpp>
00006 #include "MemArray.hpp"
00007 
00008 namespace Fiber
00009 {
00010         using MemCore::RefPtr;
00011         using MemCore::CreatorBase;
00012         using MemCore::Creator;
00013 
00027 class   FIELD_API CreativeArray : public Creator<MemBase>
00028 {
00029 public:
00031         CreativeArray(const RefPtr<MemBase>&Mb, const RefPtr<MemCore::Cache>&Cache); 
00032 
00034         ~CreativeArray();
00035 };
00036 
00037 
00042 template <int N>
00043 inline void setSizeInterface(const RefPtr<CreativeArrayBase>&CAB, const MultiIndex<N>&FragmentSize)
00044 {
00045         if (!CAB) return;
00046 
00047         CAB->addInterface( new SizeInterface( FragmentSize ) );
00048 }
00049 
00054 inline int getRank(const RefPtr<CreativeArrayBase>&CAB)
00055 {
00056         if (!CAB)
00057                 return 0;
00058 
00059 RefPtr<SizeInterface> SI = MemCore::interface_cast<SizeInterface>(CAB); 
00060         if (SI) 
00061                 return SI->size(); 
00062 
00063         return 0;       
00064 }
00065 
00070 inline RefPtr<SizeInterface> getSize(const RefPtr<CreativeArrayBase>&CAB)
00071 {
00072         if (!CAB)
00073                 return MemCore::NullPtr();
00074 
00075         return MemCore::interface_cast<SizeInterface>(CAB);
00076 }
00077 
00082 template <int N>
00083 inline bool getDimensions(MultiIndex<N>&MI, const RefPtr<CreativeArrayBase>&CAB)
00084 {
00085         if (!CAB)
00086                 return false;
00087 
00088 RefPtr<SizeInterface> SI = MemCore::interface_cast<SizeInterface>(CAB); 
00089         if (SI)
00090                 return SI->get(MI); 
00091                 //{
00092                 //bool tmp = SI->get(MI); 
00093                         //std::cout << "getDimension() tmp: " << MI << std::endl;
00094                 //return tmp; 
00095                 //return SI->get(MI); 
00096         //}
00097         return false;   
00098 }
00099 
00100 template <int N>
00101 struct setDimensions
00102 {
00103 static  bool setSizeInterface(const RefPtr<CreativeArrayBase>&DC)
00104         {
00105                 if (!DC)
00106                         return false;
00107 
00108         RefPtr<MemBase> MemData = DC->create();
00109                 if (!MemData)
00110                         return false;
00111 
00112         RefPtr<MemArrayBase<N> > MemDataN = MemData;
00113                 if (!MemDataN)
00114                         return false;
00115 
00116         MultiIndex<N> Dims = MemDataN->Size();
00117                 ::Fiber::setSizeInterface( DC, Dims );
00118 
00119                 return true;
00120         }
00121 };
00122 
00134 template <int N>
00135 inline  bool makeSizeInterface(MultiIndex<N>&Dims, const RefPtr<CreativeArrayBase>&DC)
00136 {
00137         if (!DC)
00138                 return false; 
00139 
00140 RefPtr<MemBase> MemData = DC->create(); 
00141         if (!MemData)
00142                 return false; 
00143 
00144 RefPtr<MemArrayBase<N> > MemDataN = MemData; 
00145         if (!MemDataN)
00146                 return false; 
00147 
00148         Dims = MemDataN->Size();
00149         setSizeInterface( DC, Dims ); 
00150 
00151         return true;
00152 }
00153 
00166 template <int N>
00167 inline bool makeDimensions(MultiIndex<N>&Dims, const RefPtr<CreativeArrayBase>&DC)
00168 {
00169         if (!DC)
00170                 return false; 
00171 
00172         if (getDimensions(Dims, DC) )
00173                 //{
00174                 //printf("makeDimensions::getDimensions()\n");fflush(stdout);
00175                 return true; 
00176                 //} 
00177         //printf("makeDimensions::makeSizeInterface()");fflush(stdout);
00178         return makeSizeInterface(Dims, DC);
00179 }
00180 
00185 extern FIELD_API index_t NumberOfElements(const RefPtr<CreativeArrayBase>&CAB);
00186 
00191 extern FIELD_API MemCore::memsize_t getMemoryUsage(const CreativeArrayBase&CAB);
00192 
00193 
00194 } // namespace Fiber
00195 
00196 
00197 #endif /* __FIELD_CREATIVE_MULTIARRAY_HPP */
00198 
00199