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
00093
00094
00095
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
00175 return true;
00176
00177
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 }
00195
00196
00197 #endif
00198
00199