| [658] | 1 | // This may look like C code, but it is really -*- C++ -*-
 | 
|---|
 | 2 | // Gestion de block de donnees avec partage de references
 | 
|---|
 | 3 | //                         C.Magneville          04/99
 | 
|---|
 | 4 | // LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
 | 
|---|
 | 5 | #ifndef NDATABLOCK_H
 | 
|---|
 | 6 | #define NDATABLOCK_H
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | #include "machdefs.h"
 | 
|---|
 | 9 | #include "anydataobj.h"
 | 
|---|
 | 10 | #include "ppersist.h"
 | 
|---|
 | 11 | #include <iostream.h>
 | 
|---|
 | 12 | 
 | 
|---|
 | 13 | namespace SOPHYA {
 | 
|---|
 | 14 | 
 | 
|---|
 | 15 | // Classe pour permettre de partager des donnees avec 
 | 
|---|
 | 16 | // un autre systeme de gestion de references (ex avec Blitz)
 | 
|---|
 | 17 | class Bridge {
 | 
|---|
 | 18 | public:
 | 
|---|
 | 19 |   Bridge() { } 
 | 
|---|
 | 20 |   virtual ~Bridge() { }
 | 
|---|
 | 21 | };
 | 
|---|
 | 22 | 
 | 
|---|
 | 23 | // classe de container avec partage de reference
 | 
|---|
 | 24 | template <class T>
 | 
|---|
 | 25 | class NDataBlock : public AnyDataObj {
 | 
|---|
 | 26 | 
 | 
|---|
 | 27 | public:
 | 
|---|
 | 28 | 
 | 
|---|
 | 29 |   // Creation / destruction 
 | 
|---|
 | 30 |   NDataBlock(size_t n);
 | 
|---|
 | 31 |   NDataBlock(size_t n, T* data, Bridge* br=NULL);
 | 
|---|
 | 32 |   NDataBlock();
 | 
|---|
 | 33 |   NDataBlock(const NDataBlock<T>& a);
 | 
|---|
 | 34 |   NDataBlock(const NDataBlock<T>& a,bool share);
 | 
|---|
 | 35 |   virtual ~NDataBlock();
 | 
|---|
 | 36 | 
 | 
|---|
 | 37 |   // Temporaire?
 | 
|---|
 | 38 |   inline bool IsTemp(void) const {return mIsTemp;}
 | 
|---|
 | 39 |   inline void SetTemp(bool temp=false) const {mIsTemp = temp;}
 | 
|---|
 | 40 | 
 | 
|---|
 | 41 |   // Gestion taille/Remplissage
 | 
|---|
 | 42 |   void Clone(const NDataBlock<T>& a);
 | 
|---|
 | 43 |   void CloneOrShare(const NDataBlock<T>& a);
 | 
|---|
 | 44 |   void Share(const NDataBlock<T>& a);
 | 
|---|
 | 45 |   void FillFrom(size_t n,T* data);
 | 
|---|
 | 46 |   inline void Reset(T v=0)
 | 
|---|
 | 47 |          {if(mSz==0) return; T *p=Begin(),*pe=End(); while(p<pe) *p++=v;}
 | 
|---|
 | 48 | 
 | 
|---|
 | 49 |   // ReSize redimmensionne une structure pour "n" donnees.
 | 
|---|
 | 50 |   // Les donnees precedentes sont perdues (pour cette classe)
 | 
|---|
 | 51 |   // et le nouveau tableau mis a zero. La nouvelle structure de
 | 
|---|
 | 52 |   // donnees n'a qu'une reference (celle de cette classe).
 | 
|---|
 | 53 |   inline void ReSize(size_t n) {Alloc(n);}
 | 
|---|
 | 54 | 
 | 
|---|
 | 55 |   void Realloc(size_t nnew,bool force=false);
 | 
|---|
 | 56 |   
 | 
|---|
 | 57 |   // Informations pointeur/data
 | 
|---|
 | 58 |   inline T* Data()
 | 
|---|
 | 59 |          {if(mSRef) return mSRef->data; else return NULL;}
 | 
|---|
 | 60 |   inline T* Data() const
 | 
|---|
 | 61 |          {if(mSRef) return mSRef->data; else return NULL;}
 | 
|---|
 | 62 |   inline size_t Size() const    {return mSz;}
 | 
|---|
 | 63 |   inline T& operator()(size_t i)       {return *(mSRef->data+i);}
 | 
|---|
 | 64 |   inline T  operator()(size_t i) const {return *(mSRef->data+i);}
 | 
|---|
 | 65 |   inline T*        Begin()        {return mSRef->data;}
 | 
|---|
 | 66 |   inline T const*  Begin() const  {return mSRef->data;} 
 | 
|---|
 | 67 |   inline T*        End()          {return mSRef->data+mSz;}
 | 
|---|
 | 68 |   inline T const*  End() const    {return mSRef->data+mSz;}
 | 
|---|
 | 69 |   inline size_t NRef() const {if(mSRef) return 0; else return mSRef->nref;}
 | 
|---|
 | 70 | 
 | 
|---|
 | 71 |   // Impression
 | 
|---|
 | 72 |   void Print(ostream& os, size_t i1=0,size_t n=10) const;
 | 
|---|
 | 73 |   inline void Print(size_t i1=0,size_t n=0) const {Print(cout,i1,n);}
 | 
|---|
 | 74 | 
 | 
|---|
 | 75 |   //
 | 
|---|
 | 76 |   T Sum(size_t i1=0,size_t n=0) const;
 | 
|---|
 | 77 |   T Product(size_t i1=0,size_t n=0) const;
 | 
|---|
 | 78 | 
 | 
|---|
 | 79 |   // Surcharge d'operateurs INPLACE: A = x , A = B , A @= x , A @= B
 | 
|---|
 | 80 |   NDataBlock<T>& operator = (const NDataBlock<T>& a);
 | 
|---|
 | 81 |   NDataBlock<T>& operator = (T v);
 | 
|---|
 | 82 | 
 | 
|---|
 | 83 |   NDataBlock<T>& operator += (T b);
 | 
|---|
 | 84 |   NDataBlock<T>& operator -= (T b);
 | 
|---|
 | 85 |   NDataBlock<T>& operator *= (T b);
 | 
|---|
 | 86 |   NDataBlock<T>& operator /= (T b);
 | 
|---|
 | 87 | 
 | 
|---|
 | 88 |   NDataBlock<T>& operator += (const NDataBlock<T>& a);
 | 
|---|
 | 89 |   NDataBlock<T>& operator -= (const NDataBlock<T>& a);
 | 
|---|
 | 90 |   NDataBlock<T>& operator *= (const NDataBlock<T>& a);
 | 
|---|
 | 91 |   NDataBlock<T>& operator /= (const NDataBlock<T>& a);
 | 
|---|
 | 92 | 
 | 
|---|
 | 93 |   // Surcharge d'operateurs: C = A @ x , C = A @ B
 | 
|---|
 | 94 |   NDataBlock<T> Add(T b) const;
 | 
|---|
 | 95 |   NDataBlock<T> Sub(T b) const;
 | 
|---|
 | 96 |   NDataBlock<T> SubInv(T b) const;
 | 
|---|
 | 97 |   NDataBlock<T> Mul(T b) const;
 | 
|---|
 | 98 |   NDataBlock<T> Div(T b) const;
 | 
|---|
 | 99 |   NDataBlock<T> DivInv(T b) const;
 | 
|---|
 | 100 | 
 | 
|---|
 | 101 |   NDataBlock<T> Add(const NDataBlock<T>& b) const;
 | 
|---|
 | 102 |   NDataBlock<T> Sub(const NDataBlock<T>& b) const;
 | 
|---|
 | 103 |   NDataBlock<T> SubInv(const NDataBlock<T>& b) const;
 | 
|---|
 | 104 |   NDataBlock<T> Mul(const NDataBlock<T>& b) const;
 | 
|---|
 | 105 |   NDataBlock<T> Div(const NDataBlock<T>& b) const;
 | 
|---|
 | 106 |   NDataBlock<T> DivInv(const NDataBlock<T>& b) const;
 | 
|---|
 | 107 | 
 | 
|---|
 | 108 | protected:
 | 
|---|
 | 109 |   typedef struct {size_t nref; T* data; Bridge* bridge; } NDREF;
 | 
|---|
 | 110 | 
 | 
|---|
 | 111 |   void Alloc(size_t n,T* data=NULL,Bridge* br=NULL);
 | 
|---|
 | 112 |   void Delete(void);
 | 
|---|
 | 113 | 
 | 
|---|
 | 114 |   size_t       mSz;
 | 
|---|
 | 115 |   NDREF*       mSRef;
 | 
|---|
 | 116 |   mutable bool mIsTemp;
 | 
|---|
 | 117 | };
 | 
|---|
 | 118 | 
 | 
|---|
 | 119 | 
 | 
|---|
 | 120 | template<class T>
 | 
|---|
 | 121 | inline ostream& operator << (ostream& os, const NDataBlock<T>& a)
 | 
|---|
 | 122 |                       {a.Print(os); return(os);}
 | 
|---|
 | 123 | template<class T>
 | 
|---|
 | 124 | inline NDataBlock<T> operator + (const NDataBlock<T>& a,T b)
 | 
|---|
 | 125 |                       {return a.Add(b);}
 | 
|---|
 | 126 | template<class T>
 | 
|---|
 | 127 | inline NDataBlock<T> operator + (T b,const NDataBlock<T>& a)
 | 
|---|
 | 128 |                       {return a.Add(b);}
 | 
|---|
 | 129 | template<class T>
 | 
|---|
 | 130 | inline NDataBlock<T> operator - (const NDataBlock<T>& a,T b)
 | 
|---|
 | 131 |                       {return a.Sub(b);}
 | 
|---|
 | 132 | template<class T>
 | 
|---|
 | 133 | inline NDataBlock<T> operator - (T b,const NDataBlock<T>& a)
 | 
|---|
 | 134 |                       {return a.SubInv(b);}
 | 
|---|
 | 135 | template<class T>
 | 
|---|
 | 136 | inline NDataBlock<T> operator * (const NDataBlock<T>& a,T b)
 | 
|---|
 | 137 |                       {return a.Mul(b);}
 | 
|---|
 | 138 | template<class T>
 | 
|---|
 | 139 | inline NDataBlock<T> operator * (T b,const NDataBlock<T>& a)
 | 
|---|
 | 140 |                       {return a.Mul(b);}
 | 
|---|
 | 141 | template<class T>
 | 
|---|
 | 142 | inline NDataBlock<T> operator / (const NDataBlock<T>& a,T b)
 | 
|---|
 | 143 |                       {return a.Div(b);}
 | 
|---|
 | 144 | template<class T>
 | 
|---|
 | 145 | inline NDataBlock<T> operator / (T b,const NDataBlock<T>& a)
 | 
|---|
 | 146 |                       {return a.DivInv(b);}
 | 
|---|
 | 147 | 
 | 
|---|
 | 148 | template<class T>
 | 
|---|
 | 149 | inline NDataBlock<T> operator + (const NDataBlock<T>& a,const NDataBlock<T>& b)
 | 
|---|
 | 150 |                       {return a.Add(b);}
 | 
|---|
 | 151 | template<class T>
 | 
|---|
 | 152 | inline NDataBlock<T> operator - (const NDataBlock<T>& a,const NDataBlock<T>& b)
 | 
|---|
 | 153 |                       {return a.Sub(b);}
 | 
|---|
 | 154 | template<class T>
 | 
|---|
 | 155 | inline NDataBlock<T> operator * (const NDataBlock<T>& a,const NDataBlock<T>& b)
 | 
|---|
 | 156 |                       {return a.Mul(b);}
 | 
|---|
 | 157 | template<class T>
 | 
|---|
 | 158 | inline NDataBlock<T> operator / (const NDataBlock<T>& a,const NDataBlock<T>& b)
 | 
|---|
 | 159 |                       {return a.Div(b);}
 | 
|---|
 | 160 | 
 | 
|---|
 | 161 | 
 | 
|---|
 | 162 | // Classe pour la gestion de persistance
 | 
|---|
 | 163 | template <class T>
 | 
|---|
 | 164 | class FIO_NDataBlock : public  PPersist  {
 | 
|---|
 | 165 | public:
 | 
|---|
 | 166 |   FIO_NDataBlock();
 | 
|---|
 | 167 |   FIO_NDataBlock(string const & filename); 
 | 
|---|
 | 168 |   FIO_NDataBlock(const NDataBlock<T> & obj);
 | 
|---|
 | 169 |   FIO_NDataBlock(NDataBlock<T> * obj);
 | 
|---|
 | 170 |   virtual ~FIO_NDataBlock();
 | 
|---|
 | 171 |   virtual AnyDataObj* DataObj();
 | 
|---|
 | 172 |   inline operator NDataBlock<T>() { return(*dobj); }
 | 
|---|
 | 173 | protected :
 | 
|---|
 | 174 |   virtual void       ReadSelf(PInPersist&);           
 | 
|---|
 | 175 |   virtual void       WriteSelf(POutPersist&) const;  
 | 
|---|
 | 176 |   NDataBlock<T> * dobj;
 | 
|---|
 | 177 |   bool ownobj;
 | 
|---|
 | 178 | };
 | 
|---|
 | 179 | 
 | 
|---|
 | 180 | template <class T>
 | 
|---|
 | 181 | inline POutPersist& operator << (POutPersist& os, NDataBlock<T> & obj)
 | 
|---|
 | 182 | { FIO_NDataBlock<T> fio(&obj);  fio.Write(os);  return(os); }
 | 
|---|
 | 183 | template <class T>
 | 
|---|
 | 184 | inline PInPersist& operator >> (PInPersist& is, NDataBlock<T> & obj)
 | 
|---|
 | 185 | { FIO_NDataBlock<T> fio(&obj);  fio.Read(is);  return(is); }
 | 
|---|
 | 186 | 
 | 
|---|
 | 187 | } // Fin du namespace
 | 
|---|
 | 188 | 
 | 
|---|
 | 189 | #endif
 | 
|---|