00001 #ifndef __FIBER_ARRAYREF_HPP 00002 #define __FIBER_ARRAYREF_HPP 00003 00004 #include "MemArray.hpp" 00005 00006 namespace Fiber 00007 { 00008 00026 template <class T, int N=1> 00027 class ArrayRef 00028 { 00029 public: 00030 typedef MemArray<N,T> MemArray_t; 00031 typedef MultiArray<N,T> MultiArray_t; 00032 typedef std::vector<T> Storage_t; 00033 00035 const Ref<MemArray<N,T> > myMemArray; 00036 00038 MultiArray<N,T> &Data; 00039 00041 Storage_t &DataStorage; 00042 00044 typedef typename std::vector<T>::iterator iterator; 00045 00047 typedef typename std::vector<T>::const_iterator const_iterator; 00048 00050 RefPtr<MemCore::TypedChunk<T> > getTypedStorage() const 00051 { 00052 return myMemArray->getTypedStorage(); 00053 } 00054 00056 ArrayRef(const MultiIndex<N>&NumberOfElements, const MemBase::Creator_t&C = NullPtr() ) 00057 : myMemArray(NumberOfElements, C) 00058 , Data(*myMemArray ) 00059 , DataStorage( getTypedStorage()->get_vector() ) 00060 { 00061 assert( NumberOfElements.size() == size() ); 00062 assert( DataStorage.size() == myMemArray->nElements() ); 00063 assert( DataStorage.size() == Data.nElements() ); 00064 assert( DataStorage.size() == size() ); 00065 } 00066 00068 T & operator[](const index_t&i) 00069 { 00070 assert( i < DataStorage.size() ); 00071 return DataStorage[i]; 00072 } 00073 00075 const T & operator[](const index_t&i) const 00076 { 00077 return DataStorage[i]; 00078 } 00079 00081 T & operator[](const MultiIndex<N>&I) 00082 { 00083 return Data[I]; 00084 } 00085 00087 const T & operator[](const MultiIndex<N>&I) const 00088 { 00089 return Data[I]; 00090 } 00091 00092 00094 iterator begin() { return DataStorage.begin(); } 00096 iterator end () { return DataStorage.end (); } 00098 const_iterator begin() const { return DataStorage.begin(); } 00100 const_iterator end () const { return DataStorage.end (); } 00101 00102 00104 const MultiIndex<N>&Size() const 00105 { 00106 return Data.Size(); 00107 } 00108 00110 size_t size() const 00111 { 00112 return DataStorage.size(); 00113 } 00114 00120 operator RefPtr<MemBase> () const 00121 { 00122 return myMemArray; 00123 } 00124 }; 00125 00126 00127 } /* namespace Fiber */ 00128 00129 #endif /* __FIBER_ARRAYREF_HPP */