#ifndef NDATABLOCK_H #define NDATABLOCK_H #include "machdefs.h" // Classe pour permettre de partager des donnees avec // un autre systeme de gestion de references (ex avec Blitz) class Bridge { public: Bridge() { } virtual ~Bridge() { } }; // classe de container avec partage de reference template class NDataBlock { public: // Creation / destruction NDataBlock(size_t n); NDataBlock(size_t n, T* data, Bridge* br=NULL); NDataBlock(); NDataBlock(NDataBlock& a); NDataBlock(NDataBlock& a,bool share); virtual ~NDataBlock(); // Temporaire? inline bool IsTemp(void) {return mIsTemp;} inline void SetTemp(bool temp) {mIsTemp=temp;} // Gestion taille/Remplissage void Clone(NDataBlock& a); void Reset(T v=0); void ReSize(size_t n); void FillFrom(size_t n,T* data); // Informations pointeur/data inline T* Data() {if(mSRef) return mSRef->data; else return NULL;} inline size_t Size() const {return mSz;} inline T& operator()(size_t i) {return *(mSRef->data+i);} inline T* Begin() {return mSRef->data;} inline T const* Begin() const {return mSRef->data;} inline T* End() {return mSRef->data+mSz;} inline T const* End() const {return mSRef->data+mSz;} // Impression void Print(size_t i1=0,size_t n=0); // Surcharge d operateurs NDataBlock& operator = (NDataBlock& a); NDataBlock& operator = (T v); NDataBlock& operator += (T b); NDataBlock& operator -= (T b); NDataBlock& operator *= (T b); NDataBlock& operator /= (T b); NDataBlock& operator += (NDataBlock& a); NDataBlock& operator -= (NDataBlock& a); NDataBlock& operator *= (NDataBlock& a); NDataBlock& operator /= (NDataBlock& a); NDataBlock Add(T b); NDataBlock Sub(T b); NDataBlock SubInv(T b); NDataBlock Mul(T b); NDataBlock Div(T b); NDataBlock DivInv(T b); NDataBlock Add(NDataBlock& b); NDataBlock Sub(NDataBlock& b); NDataBlock SubInv(NDataBlock& b); NDataBlock Mul(NDataBlock& b); NDataBlock Div(NDataBlock& b); NDataBlock DivInv(NDataBlock& b); protected: typedef struct {size_t nref; T* data; Bridge* bridge; } NDREF; void Alloc(size_t n,T* data=NULL,Bridge* br=NULL); void Share(NDataBlock& a); void Delete(void); size_t mSz; NDREF* mSRef; bool mIsTemp; }; template inline NDataBlock operator + (NDataBlock& a,T b) {return a.Add(b);} template inline NDataBlock operator + (T b,NDataBlock& a) {return a.Add(b);} template inline NDataBlock operator - (NDataBlock& a,T b) {return a.Sub(b);} template inline NDataBlock operator - (T b,NDataBlock& a) {return a.SubInv(b);} template inline NDataBlock operator * (NDataBlock& a,T b) {return a.Mul(b);} template inline NDataBlock operator * (T b,NDataBlock& a) {return a.Mul(b);} template inline NDataBlock operator / (NDataBlock& a,T b) {return a.Div(b);} template inline NDataBlock operator / (T b,NDataBlock& a) {return a.DivInv(b);} template inline NDataBlock operator + (NDataBlock& a,NDataBlock& b) {return a.Add(b);} template inline NDataBlock operator - (NDataBlock& a,NDataBlock& b) {return a.Sub(b);} template inline NDataBlock operator * (NDataBlock& a,NDataBlock& b) {return a.Mul(b);} template inline NDataBlock operator / (NDataBlock& a,NDataBlock& b) {return a.Div(b);} #endif