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

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

Ajout de l'argument bool zero ds NDataBlock<T>::Alloc()
Fonction pour construire un message d'exception avec num de ligne et
nom de fichier ds pexceptions.h .cc

Reza 10/3/2000

File size: 6.3 KB
Line 
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
13namespace SOPHYA {
14
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
23// classe de container avec partage de reference
24template <class T>
25class NDataBlock : public AnyDataObj {
26
27public:
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
108protected:
109 typedef struct {size_t nref; T* data; Bridge* bridge; } NDREF;
110
111 void Alloc(size_t n,T* data=NULL,Bridge* br=NULL, bool zero=true);
112 void Delete(void);
113
114 size_t mSz;
115 NDREF* mSRef;
116 mutable bool mIsTemp;
117};
118
119
120template<class T>
121inline ostream& operator << (ostream& os, const NDataBlock<T>& a)
122 {a.Print(os); return(os);}
123template<class T>
124inline NDataBlock<T> operator + (const NDataBlock<T>& a,T b)
125 {return a.Add(b);}
126template<class T>
127inline NDataBlock<T> operator + (T b,const NDataBlock<T>& a)
128 {return a.Add(b);}
129template<class T>
130inline NDataBlock<T> operator - (const NDataBlock<T>& a,T b)
131 {return a.Sub(b);}
132template<class T>
133inline NDataBlock<T> operator - (T b,const NDataBlock<T>& a)
134 {return a.SubInv(b);}
135template<class T>
136inline NDataBlock<T> operator * (const NDataBlock<T>& a,T b)
137 {return a.Mul(b);}
138template<class T>
139inline NDataBlock<T> operator * (T b,const NDataBlock<T>& a)
140 {return a.Mul(b);}
141template<class T>
142inline NDataBlock<T> operator / (const NDataBlock<T>& a,T b)
143 {return a.Div(b);}
144template<class T>
145inline NDataBlock<T> operator / (T b,const NDataBlock<T>& a)
146 {return a.DivInv(b);}
147
148template<class T>
149inline NDataBlock<T> operator + (const NDataBlock<T>& a,const NDataBlock<T>& b)
150 {return a.Add(b);}
151template<class T>
152inline NDataBlock<T> operator - (const NDataBlock<T>& a,const NDataBlock<T>& b)
153 {return a.Sub(b);}
154template<class T>
155inline NDataBlock<T> operator * (const NDataBlock<T>& a,const NDataBlock<T>& b)
156 {return a.Mul(b);}
157template<class T>
158inline 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
163template <class T>
164class FIO_NDataBlock : public PPersist {
165public:
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 virtual void SetDataObj(AnyDataObj & o);
173 inline operator NDataBlock<T>() { return(*dobj); }
174protected :
175 virtual void ReadSelf(PInPersist&);
176 virtual void WriteSelf(POutPersist&) const;
177 NDataBlock<T> * dobj;
178 bool ownobj;
179};
180
181template <class T>
182inline POutPersist& operator << (POutPersist& os, NDataBlock<T> & obj)
183{ FIO_NDataBlock<T> fio(&obj); fio.Write(os); return(os); }
184template <class T>
185inline PInPersist& operator >> (PInPersist& is, NDataBlock<T> & obj)
186{ FIO_NDataBlock<T> fio(&obj); fio.Read(is); return(is); }
187
188} // Fin du namespace
189
190#endif
Note: See TracBrowser for help on using the repository browser.