// This may look like C code, but it is really -*- C++ -*- // Gestion de block de donnees avec partage de references // C.Magneville 04/99 // LAL (Orsay) / IN2P3-CNRS DAPNIA/SPP (Saclay) / CEA #ifndef NDATABLOCK_H #define NDATABLOCK_H #include "machdefs.h" #include "anydataobj.h" #include namespace PlanckDPC { // 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 AnyDataObj { public: // Creation / destruction NDataBlock(size_t n); NDataBlock(size_t n, T* data, Bridge* br=NULL); NDataBlock(); NDataBlock(const NDataBlock& a); NDataBlock(const NDataBlock& a,bool share); virtual ~NDataBlock(); // Temporaire? inline bool IsTemp(void) const {return mIsTemp;} void SetTemp(bool temp=false) const; // Gestion taille/Remplissage void Clone(const 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 T* Data() const {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 operator()(size_t i) const {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(ostream& os, size_t i1=0,size_t n=10) const; inline void Print(size_t i1=0,size_t n=0) const {Print(cout,i1,n);} // T Sum(size_t i1=0,size_t n=0) const; T Product(size_t i1=0,size_t n=0) const; // Surcharge d operateurs NDataBlock& operator = (const NDataBlock& a); NDataBlock& operator = (T v); NDataBlock& operator += (T b); NDataBlock& operator -= (T b); NDataBlock& operator *= (T b); NDataBlock& operator /= (T b); NDataBlock& operator += (const NDataBlock& a); NDataBlock& operator -= (const NDataBlock& a); NDataBlock& operator *= (const NDataBlock& a); NDataBlock& operator /= (const NDataBlock& a); NDataBlock Add(T b) const; NDataBlock Sub(T b) const; NDataBlock SubInv(T b) const; NDataBlock Mul(T b) const; NDataBlock Div(T b) const; NDataBlock DivInv(T b) const; NDataBlock Add(const NDataBlock& b) const; NDataBlock Sub(const NDataBlock& b) const; NDataBlock SubInv(const NDataBlock& b) const; NDataBlock Mul(const NDataBlock& b) const; NDataBlock Div(const NDataBlock& b) const; NDataBlock DivInv(const NDataBlock& b) const; protected: typedef struct {size_t nref; T* data; Bridge* bridge; } NDREF; void Alloc(size_t n,T* data=NULL,Bridge* br=NULL); void Share(const NDataBlock& a); void Delete(void); size_t mSz; NDREF* mSRef; mutable bool mIsTemp; }; template inline ostream& operator << (ostream& os, const NDataBlock& a) {Print(os); return(os);} template inline NDataBlock operator + (const NDataBlock& a,T b) {return a.Add(b);} template inline NDataBlock operator + (T b,const NDataBlock& a) {return a.Add(b);} template inline NDataBlock operator - (const NDataBlock& a,T b) {return a.Sub(b);} template inline NDataBlock operator - (T b,const NDataBlock& a) {return a.SubInv(b);} template inline NDataBlock operator * (const NDataBlock& a,T b) {return a.Mul(b);} template inline NDataBlock operator * (T b,const NDataBlock& a) {return a.Mul(b);} template inline NDataBlock operator / (const NDataBlock& a,T b) {return a.Div(b);} template inline NDataBlock operator / (T b,const NDataBlock& a) {return a.DivInv(b);} template inline NDataBlock operator + (const NDataBlock& a,const NDataBlock& b) {return a.Add(b);} template inline NDataBlock operator - (const NDataBlock& a,const NDataBlock& b) {return a.Sub(b);} template inline NDataBlock operator * (const NDataBlock& a,const NDataBlock& b) {return a.Mul(b);} template inline NDataBlock operator / (const NDataBlock& a,const NDataBlock& b) {return a.Div(b);} } // Fin du namespace #endif