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

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

fin ndataBlock + AnyDataObj cree rz+cmv 26/4/99

File size: 4.8 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 <iostream.h>
11
12namespace PlanckDPC {
13
14// Classe pour permettre de partager des donnees avec
15// un autre systeme de gestion de references (ex avec Blitz)
16class Bridge {
17public:
18 Bridge() { }
19 virtual ~Bridge() { }
20};
21
22// classe de container avec partage de reference
23template <class T>
24class NDataBlock : public AnyDataObj {
25
26public:
27
28 // Creation / destruction
29 NDataBlock(size_t n);
30 NDataBlock(size_t n, T* data, Bridge* br=NULL);
31 NDataBlock();
32 NDataBlock(const NDataBlock<T>& a);
33 NDataBlock(const NDataBlock<T>& a,bool share);
34 virtual ~NDataBlock();
35
36 // Temporaire?
37 inline bool IsTemp(void) const {return mIsTemp;}
38 void SetTemp(bool temp=false) const;
39
40 // Gestion taille/Remplissage
41 void Clone(const NDataBlock<T>& a);
42 void Reset(T v=0);
43 void ReSize(size_t n);
44 void FillFrom(size_t n,T* data);
45
46 // Informations pointeur/data
47 inline T* Data()
48 {if(mSRef) return mSRef->data; else return NULL;}
49 inline T* Data() const
50 {if(mSRef) return mSRef->data; else return NULL;}
51 inline size_t Size() const {return mSz;}
52 inline T& operator()(size_t i) {return *(mSRef->data+i);}
53 inline T operator()(size_t i) const {return *(mSRef->data+i);}
54
55 inline T* Begin() {return mSRef->data;}
56 inline T const* Begin() const {return mSRef->data;}
57 inline T* End() {return mSRef->data+mSz;}
58 inline T const* End() const {return mSRef->data+mSz;}
59
60 // Impression
61 void Print(ostream& os, size_t i1=0,size_t n=10) const;
62 inline void Print(size_t i1=0,size_t n=0) const {Print(cout,i1,n);}
63
64 //
65 T Sum(size_t i1=0,size_t n=0) const;
66 T Product(size_t i1=0,size_t n=0) const;
67
68 // Surcharge d operateurs
69 NDataBlock<T>& operator = (const NDataBlock<T>& a);
70 NDataBlock<T>& operator = (T v);
71
72 NDataBlock<T>& operator += (T b);
73 NDataBlock<T>& operator -= (T b);
74 NDataBlock<T>& operator *= (T b);
75 NDataBlock<T>& operator /= (T b);
76
77 NDataBlock<T>& operator += (const NDataBlock<T>& a);
78 NDataBlock<T>& operator -= (const NDataBlock<T>& a);
79 NDataBlock<T>& operator *= (const NDataBlock<T>& a);
80 NDataBlock<T>& operator /= (const NDataBlock<T>& a);
81
82 NDataBlock<T> Add(T b) const;
83 NDataBlock<T> Sub(T b) const;
84 NDataBlock<T> SubInv(T b) const;
85 NDataBlock<T> Mul(T b) const;
86 NDataBlock<T> Div(T b) const;
87 NDataBlock<T> DivInv(T b) const;
88
89 NDataBlock<T> Add(const NDataBlock<T>& b) const;
90 NDataBlock<T> Sub(const NDataBlock<T>& b) const;
91 NDataBlock<T> SubInv(const NDataBlock<T>& b) const;
92 NDataBlock<T> Mul(const NDataBlock<T>& b) const;
93 NDataBlock<T> Div(const NDataBlock<T>& b) const;
94 NDataBlock<T> DivInv(const NDataBlock<T>& b) const;
95
96protected:
97
98 typedef struct {size_t nref; T* data; Bridge* bridge; } NDREF;
99
100 void Alloc(size_t n,T* data=NULL,Bridge* br=NULL);
101 void Share(const NDataBlock<T>& a);
102 void Delete(void);
103
104 size_t mSz;
105 NDREF* mSRef;
106 mutable bool mIsTemp;
107};
108
109
110template<class T>
111inline ostream& operator << (ostream& os, const NDataBlock<T>& a)
112 {Print(os); return(os);}
113template<class T>
114inline NDataBlock<T> operator + (const NDataBlock<T>& a,T b)
115 {return a.Add(b);}
116template<class T>
117inline NDataBlock<T> operator + (T b,const NDataBlock<T>& a)
118 {return a.Add(b);}
119template<class T>
120inline NDataBlock<T> operator - (const NDataBlock<T>& a,T b)
121 {return a.Sub(b);}
122template<class T>
123inline NDataBlock<T> operator - (T b,const NDataBlock<T>& a)
124 {return a.SubInv(b);}
125template<class T>
126inline NDataBlock<T> operator * (const NDataBlock<T>& a,T b)
127 {return a.Mul(b);}
128template<class T>
129inline NDataBlock<T> operator * (T b,const NDataBlock<T>& a)
130 {return a.Mul(b);}
131template<class T>
132inline NDataBlock<T> operator / (const NDataBlock<T>& a,T b)
133 {return a.Div(b);}
134template<class T>
135inline NDataBlock<T> operator / (T b,const NDataBlock<T>& a)
136 {return a.DivInv(b);}
137
138template<class T>
139inline NDataBlock<T> operator + (const NDataBlock<T>& a,const NDataBlock<T>& b)
140 {return a.Add(b);}
141template<class T>
142inline NDataBlock<T> operator - (const NDataBlock<T>& a,const NDataBlock<T>& b)
143 {return a.Sub(b);}
144template<class T>
145inline NDataBlock<T> operator * (const NDataBlock<T>& a,const NDataBlock<T>& b)
146 {return a.Mul(b);}
147template<class T>
148inline NDataBlock<T> operator / (const NDataBlock<T>& a,const NDataBlock<T>& b)
149 {return a.Div(b);}
150
151} // Fin du namespace
152
153#endif
Note: See TracBrowser for help on using the repository browser.