ArrayRef.hpp

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 */