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

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

version qui compile cmv 23/4/99

File size: 4.2 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 ReSize(size_t n);
35 void FillFrom(size_t n,T* data);
36
37 // Informations pointeur/data
38 inline T* Data()
39 {if(mSRef) return mSRef->data; else return NULL;}
40 inline size_t Size() const {return mSz;}
41 inline T& operator()(size_t i) {return *(mSRef->data+i);}
42
43 inline T* Begin() {return mSRef->data;}
44 inline T const* Begin() const {return mSRef->data;}
45 inline T* End() {return mSRef->data+mSz;}
46 inline T const* End() const {return mSRef->data+mSz;}
47
48 // Impression
49 void Print(size_t i1=0,size_t n=0);
50
51 // Surcharge d operateurs
52 NDataBlock<T>& operator = (NDataBlock<T>& a);
53 NDataBlock<T>& operator = (T v);
54
55 NDataBlock<T>& operator += (T b);
56 NDataBlock<T>& operator -= (T b);
57 NDataBlock<T>& operator *= (T b);
58 NDataBlock<T>& operator /= (T b);
59
60 NDataBlock<T>& operator += (NDataBlock<T>& a);
61 NDataBlock<T>& operator -= (NDataBlock<T>& a);
62 NDataBlock<T>& operator *= (NDataBlock<T>& a);
63 NDataBlock<T>& operator /= (NDataBlock<T>& a);
64
65 NDataBlock<T>& Add(T b);
66 NDataBlock<T>& Sub(T b);
67 NDataBlock<T>& SubInv(T b);
68 NDataBlock<T>& Mul(T b);
69 NDataBlock<T>& Div(T b);
70 NDataBlock<T>& DivInv(T b);
71
72 NDataBlock<T>& Add(const NDataBlock<T>& b);
73 NDataBlock<T>& Sub(const NDataBlock<T>& b);
74 NDataBlock<T>& SubInv(const NDataBlock<T>& b);
75 NDataBlock<T>& Mul(const NDataBlock<T>& b);
76 NDataBlock<T>& Div(const NDataBlock<T>& b);
77 NDataBlock<T>& DivInv(const NDataBlock<T>& b);
78
79protected:
80
81 typedef struct {size_t nref; T* data; Bridge* bridge; } NDREF;
82
83 void Alloc(size_t n,T* data=NULL,Bridge* br=NULL);
84 void Share(NDataBlock<T>& a);
85 void Delete(void);
86
87 size_t mSz;
88 NDREF* mSRef;
89 bool mIsTemp;
90};
91
92
93template<class T> inline NDataBlock<T> operator + (const NDataBlock<T>& a,T b)
94 {return a.Add(b);}
95template<class T> inline NDataBlock<T> operator + (T b,const NDataBlock<T>& a)
96 {return a.Add(b);}
97template<class T> inline NDataBlock<T> operator - (const NDataBlock<T>& a,T b)
98 {return a.Sub(b);}
99template<class T> inline NDataBlock<T> operator - (T b,const NDataBlock<T>& a)
100 {return a.SubInv(b);}
101template<class T> inline NDataBlock<T> operator * (const NDataBlock<T>& a,T b)
102 {return a.Mul(b);}
103template<class T> inline NDataBlock<T> operator * (T b,const NDataBlock<T>& a)
104 {return a.Mul(b);}
105template<class T> inline NDataBlock<T> operator / (const NDataBlock<T>& a,T b)
106 {return a.Div(b);}
107template<class T> inline NDataBlock<T> operator / (T b,const NDataBlock<T>& a)
108 {return a.DivInv(b);}
109
110template<class T> inline NDataBlock<T> operator + (const NDataBlock<T>& a,const NDataBlock<T>& b)
111 {return a.Add(b);}
112template<class T> inline NDataBlock<T> operator - (const NDataBlock<T>& a,const NDataBlock<T>& b)
113 {return a.Sub(b);}
114template<class T> inline NDataBlock<T> operator * (const NDataBlock<T>& a,const NDataBlock<T>& b)
115 {return a.Mul(b);}
116template<class T> inline NDataBlock<T> operator / (const NDataBlock<T>& a,const NDataBlock<T>& b)
117 {return a.Div(b);}
118
119
120#endif
Note: See TracBrowser for help on using the repository browser.