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

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

version intermediaire cmv 23/4/99

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