source: Sophya/trunk/SophyaLib/BaseTools/ndatablock.h@ 489

Last change on this file since 489 was 489, checked in by ansari, 26 years ago

Definition d'operateur << >> pour PIOPersist Reza+cmv 21/10/99

File size: 5.9 KB
RevLine 
[268]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
[245]5#ifndef NDATABLOCK_H
6#define NDATABLOCK_H
7
8#include "machdefs.h"
[268]9#include "anydataobj.h"
[269]10#include "ppersist.h"
[268]11#include <iostream.h>
[245]12
[268]13namespace PlanckDPC {
14
[245]15// Classe pour permettre de partager des donnees avec
16// un autre systeme de gestion de references (ex avec Blitz)
17class Bridge {
18public:
19 Bridge() { }
20 virtual ~Bridge() { }
21};
22
[246]23// classe de container avec partage de reference
[245]24template <class T>
[268]25class NDataBlock : public AnyDataObj {
[245]26
27public:
28
[246]29 // Creation / destruction
[245]30 NDataBlock(size_t n);
31 NDataBlock(size_t n, T* data, Bridge* br=NULL);
32 NDataBlock();
[268]33 NDataBlock(const NDataBlock<T>& a);
34 NDataBlock(const NDataBlock<T>& a,bool share);
[245]35 virtual ~NDataBlock();
36
37 // Temporaire?
[268]38 inline bool IsTemp(void) const {return mIsTemp;}
[289]39 inline void SetTemp(bool temp=false) const {mIsTemp = temp;}
[245]40
[257]41 // Gestion taille/Remplissage
[268]42 void Clone(const NDataBlock<T>& a);
[289]43 void CloneOrShare(const NDataBlock<T>& a);
44 void Share(const NDataBlock<T>& a);
[257]45 void FillFrom(size_t n,T* data);
[289]46 inline void Reset(T v=0)
47 {if(mSz==0) return; T *p=Begin(),*pe=End(); while(p<pe) *p++=v;}
48 inline void ReSize(size_t n) {Alloc(n);}
[245]49
50 // Informations pointeur/data
51 inline T* Data()
52 {if(mSRef) return mSRef->data; else return NULL;}
[268]53 inline T* Data() const
54 {if(mSRef) return mSRef->data; else return NULL;}
[249]55 inline size_t Size() const {return mSz;}
[268]56 inline T& operator()(size_t i) {return *(mSRef->data+i);}
57 inline T operator()(size_t i) const {return *(mSRef->data+i);}
[245]58 inline T* Begin() {return mSRef->data;}
[268]59 inline T const* Begin() const {return mSRef->data;}
[245]60 inline T* End() {return mSRef->data+mSz;}
61 inline T const* End() const {return mSRef->data+mSz;}
62
63 // Impression
[268]64 void Print(ostream& os, size_t i1=0,size_t n=10) const;
65 inline void Print(size_t i1=0,size_t n=0) const {Print(cout,i1,n);}
[245]66
[268]67 //
68 T Sum(size_t i1=0,size_t n=0) const;
69 T Product(size_t i1=0,size_t n=0) const;
70
[289]71 // Surcharge d'operateurs INPLACE: A = x , A = B , A @= x , A @= B
[268]72 NDataBlock<T>& operator = (const NDataBlock<T>& a);
[245]73 NDataBlock<T>& operator = (T v);
74
75 NDataBlock<T>& operator += (T b);
76 NDataBlock<T>& operator -= (T b);
77 NDataBlock<T>& operator *= (T b);
78 NDataBlock<T>& operator /= (T b);
79
[268]80 NDataBlock<T>& operator += (const NDataBlock<T>& a);
81 NDataBlock<T>& operator -= (const NDataBlock<T>& a);
82 NDataBlock<T>& operator *= (const NDataBlock<T>& a);
83 NDataBlock<T>& operator /= (const NDataBlock<T>& a);
[245]84
[289]85 // Surcharge d'operateurs: C = A @ x , C = A @ B
[268]86 NDataBlock<T> Add(T b) const;
87 NDataBlock<T> Sub(T b) const;
88 NDataBlock<T> SubInv(T b) const;
89 NDataBlock<T> Mul(T b) const;
90 NDataBlock<T> Div(T b) const;
91 NDataBlock<T> DivInv(T b) const;
[245]92
[268]93 NDataBlock<T> Add(const NDataBlock<T>& b) const;
94 NDataBlock<T> Sub(const NDataBlock<T>& b) const;
95 NDataBlock<T> SubInv(const NDataBlock<T>& b) const;
96 NDataBlock<T> Mul(const NDataBlock<T>& b) const;
97 NDataBlock<T> Div(const NDataBlock<T>& b) const;
98 NDataBlock<T> DivInv(const NDataBlock<T>& b) const;
[257]99
[245]100protected:
101 typedef struct {size_t nref; T* data; Bridge* bridge; } NDREF;
102
103 void Alloc(size_t n,T* data=NULL,Bridge* br=NULL);
104 void Delete(void);
105
[285]106 size_t mSz;
107 NDREF* mSRef;
108 mutable bool mIsTemp;
[245]109};
110
111
[259]112template<class T>
[268]113inline ostream& operator << (ostream& os, const NDataBlock<T>& a)
[269]114 {a.Print(os); return(os);}
[268]115template<class T>
116inline NDataBlock<T> operator + (const NDataBlock<T>& a,T b)
[259]117 {return a.Add(b);}
118template<class T>
[268]119inline NDataBlock<T> operator + (T b,const NDataBlock<T>& a)
[259]120 {return a.Add(b);}
121template<class T>
[268]122inline NDataBlock<T> operator - (const NDataBlock<T>& a,T b)
[259]123 {return a.Sub(b);}
124template<class T>
[268]125inline NDataBlock<T> operator - (T b,const NDataBlock<T>& a)
[259]126 {return a.SubInv(b);}
127template<class T>
[268]128inline NDataBlock<T> operator * (const NDataBlock<T>& a,T b)
[259]129 {return a.Mul(b);}
130template<class T>
[268]131inline NDataBlock<T> operator * (T b,const NDataBlock<T>& a)
[259]132 {return a.Mul(b);}
133template<class T>
[268]134inline NDataBlock<T> operator / (const NDataBlock<T>& a,T b)
[259]135 {return a.Div(b);}
136template<class T>
[268]137inline NDataBlock<T> operator / (T b,const NDataBlock<T>& a)
[259]138 {return a.DivInv(b);}
[245]139
[259]140template<class T>
[268]141inline NDataBlock<T> operator + (const NDataBlock<T>& a,const NDataBlock<T>& b)
[265]142 {return a.Add(b);}
[259]143template<class T>
[268]144inline NDataBlock<T> operator - (const NDataBlock<T>& a,const NDataBlock<T>& b)
[259]145 {return a.Sub(b);}
146template<class T>
[268]147inline NDataBlock<T> operator * (const NDataBlock<T>& a,const NDataBlock<T>& b)
[259]148 {return a.Mul(b);}
149template<class T>
[268]150inline NDataBlock<T> operator / (const NDataBlock<T>& a,const NDataBlock<T>& b)
[259]151 {return a.Div(b);}
[245]152
[269]153
154// Classe pour la gestion de persistance
155template <class T>
156class FIO_NDataBlock : public PPersist {
157public:
[289]158 FIO_NDataBlock();
159 FIO_NDataBlock(string const & filename);
160 FIO_NDataBlock(const NDataBlock<T> & obj);
161 FIO_NDataBlock(NDataBlock<T> * obj);
162 virtual ~FIO_NDataBlock();
163 virtual AnyDataObj* DataObj();
[269]164 inline operator NDataBlock<T>() { return(*dobj); }
165protected :
166 virtual void ReadSelf(PInPersist&);
167 virtual void WriteSelf(POutPersist&) const;
168 NDataBlock<T> * dobj;
[277]169 bool ownobj;
[269]170};
171
[489]172template <class T>
173inline POutPersist& operator << (POutPersist& os, NDataBlock<T> & obj)
174{ FIO_NDataBlock<T> fio(&obj); fio.Write(os); return(os); }
175template <class T>
176inline PInPersist& operator >> (PInPersist& is, NDataBlock<T> & obj)
177{ FIO_NDataBlock<T> fio(&obj); fio.Read(is); return(is); }
178
[268]179} // Fin du namespace
[257]180
[245]181#endif
Note: See TracBrowser for help on using the repository browser.