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