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

Last change on this file since 911 was 802, checked in by ansari, 25 years ago

Mise au point du nouveau schema (Version=2) de PPersist - Mise en place

de tag complet pour toutes les donnees/objets ecrits - Gestion a peu
pres correct des objets references plusieurs fois, ecrit une seule fois.
Mecanisme d'enregistrement pour les DataObject associe et Methodes
(PutObject/GetObjet) facilitant l'ecriture/lecture de DataObject.
Separation du fichier de la classe FIO_NDataBlock<T>.

Reza03/04/2000

File size: 5.5 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"
10#include <iostream.h>
[245]11
[552]12namespace SOPHYA {
[268]13
[245]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
[246]22// classe de container avec partage de reference
[245]23template <class T>
[268]24class NDataBlock : public AnyDataObj {
[245]25
26public:
27
[246]28 // Creation / destruction
[245]29 NDataBlock(size_t n);
30 NDataBlock(size_t n, T* data, Bridge* br=NULL);
31 NDataBlock();
[268]32 NDataBlock(const NDataBlock<T>& a);
33 NDataBlock(const NDataBlock<T>& a,bool share);
[245]34 virtual ~NDataBlock();
35
36 // Temporaire?
[268]37 inline bool IsTemp(void) const {return mIsTemp;}
[289]38 inline void SetTemp(bool temp=false) const {mIsTemp = temp;}
[245]39
[257]40 // Gestion taille/Remplissage
[268]41 void Clone(const NDataBlock<T>& a);
[289]42 void CloneOrShare(const NDataBlock<T>& a);
43 void Share(const NDataBlock<T>& a);
[257]44 void FillFrom(size_t n,T* data);
[289]45 inline void Reset(T v=0)
46 {if(mSz==0) return; T *p=Begin(),*pe=End(); while(p<pe) *p++=v;}
[502]47
48 // ReSize redimmensionne une structure pour "n" donnees.
49 // Les donnees precedentes sont perdues (pour cette classe)
50 // et le nouveau tableau mis a zero. La nouvelle structure de
51 // donnees n'a qu'une reference (celle de cette classe).
[289]52 inline void ReSize(size_t n) {Alloc(n);}
[502]53
54 void Realloc(size_t nnew,bool force=false);
[245]55
56 // Informations pointeur/data
57 inline T* Data()
58 {if(mSRef) return mSRef->data; else return NULL;}
[268]59 inline T* Data() const
60 {if(mSRef) return mSRef->data; else return NULL;}
[249]61 inline size_t Size() const {return mSz;}
[268]62 inline T& operator()(size_t i) {return *(mSRef->data+i);}
63 inline T operator()(size_t i) const {return *(mSRef->data+i);}
[245]64 inline T* Begin() {return mSRef->data;}
[268]65 inline T const* Begin() const {return mSRef->data;}
[245]66 inline T* End() {return mSRef->data+mSz;}
67 inline T const* End() const {return mSRef->data+mSz;}
[502]68 inline size_t NRef() const {if(mSRef) return 0; else return mSRef->nref;}
[245]69
70 // Impression
[268]71 void Print(ostream& os, size_t i1=0,size_t n=10) const;
72 inline void Print(size_t i1=0,size_t n=0) const {Print(cout,i1,n);}
[245]73
[268]74 //
75 T Sum(size_t i1=0,size_t n=0) const;
76 T Product(size_t i1=0,size_t n=0) const;
77
[289]78 // Surcharge d'operateurs INPLACE: A = x , A = B , A @= x , A @= B
[268]79 NDataBlock<T>& operator = (const NDataBlock<T>& a);
[245]80 NDataBlock<T>& operator = (T v);
81
82 NDataBlock<T>& operator += (T b);
83 NDataBlock<T>& operator -= (T b);
84 NDataBlock<T>& operator *= (T b);
85 NDataBlock<T>& operator /= (T b);
86
[268]87 NDataBlock<T>& operator += (const NDataBlock<T>& a);
88 NDataBlock<T>& operator -= (const NDataBlock<T>& a);
89 NDataBlock<T>& operator *= (const NDataBlock<T>& a);
90 NDataBlock<T>& operator /= (const NDataBlock<T>& a);
[245]91
[289]92 // Surcharge d'operateurs: C = A @ x , C = A @ B
[268]93 NDataBlock<T> Add(T b) const;
94 NDataBlock<T> Sub(T b) const;
95 NDataBlock<T> SubInv(T b) const;
96 NDataBlock<T> Mul(T b) const;
97 NDataBlock<T> Div(T b) const;
98 NDataBlock<T> DivInv(T b) const;
[245]99
[268]100 NDataBlock<T> Add(const NDataBlock<T>& b) const;
101 NDataBlock<T> Sub(const NDataBlock<T>& b) const;
102 NDataBlock<T> SubInv(const NDataBlock<T>& b) const;
103 NDataBlock<T> Mul(const NDataBlock<T>& b) const;
104 NDataBlock<T> Div(const NDataBlock<T>& b) const;
105 NDataBlock<T> DivInv(const NDataBlock<T>& b) const;
[257]106
[245]107protected:
108 typedef struct {size_t nref; T* data; Bridge* bridge; } NDREF;
109
[773]110 void Alloc(size_t n,T* data=NULL,Bridge* br=NULL, bool zero=true);
[245]111 void Delete(void);
112
[285]113 size_t mSz;
114 NDREF* mSRef;
115 mutable bool mIsTemp;
[245]116};
117
118
[259]119template<class T>
[268]120inline ostream& operator << (ostream& os, const NDataBlock<T>& a)
[269]121 {a.Print(os); return(os);}
[268]122template<class T>
123inline NDataBlock<T> operator + (const NDataBlock<T>& a,T b)
[259]124 {return a.Add(b);}
125template<class T>
[268]126inline NDataBlock<T> operator + (T b,const NDataBlock<T>& a)
[259]127 {return a.Add(b);}
128template<class T>
[268]129inline NDataBlock<T> operator - (const NDataBlock<T>& a,T b)
[259]130 {return a.Sub(b);}
131template<class T>
[268]132inline NDataBlock<T> operator - (T b,const NDataBlock<T>& a)
[259]133 {return a.SubInv(b);}
134template<class T>
[268]135inline NDataBlock<T> operator * (const NDataBlock<T>& a,T b)
[259]136 {return a.Mul(b);}
137template<class T>
[268]138inline NDataBlock<T> operator * (T b,const NDataBlock<T>& a)
[259]139 {return a.Mul(b);}
140template<class T>
[268]141inline NDataBlock<T> operator / (const NDataBlock<T>& a,T b)
[259]142 {return a.Div(b);}
143template<class T>
[268]144inline NDataBlock<T> operator / (T b,const NDataBlock<T>& a)
[259]145 {return a.DivInv(b);}
[245]146
[259]147template<class T>
[268]148inline NDataBlock<T> operator + (const NDataBlock<T>& a,const NDataBlock<T>& b)
[265]149 {return a.Add(b);}
[259]150template<class T>
[268]151inline NDataBlock<T> operator - (const NDataBlock<T>& a,const NDataBlock<T>& b)
[259]152 {return a.Sub(b);}
153template<class T>
[268]154inline NDataBlock<T> operator * (const NDataBlock<T>& a,const NDataBlock<T>& b)
[259]155 {return a.Mul(b);}
156template<class T>
[268]157inline NDataBlock<T> operator / (const NDataBlock<T>& a,const NDataBlock<T>& b)
[259]158 {return a.Div(b);}
[245]159
[269]160
161
[268]162} // Fin du namespace
[257]163
[245]164#endif
Note: See TracBrowser for help on using the repository browser.