source: Sophya/trunk/SophyaLib/TArray/fiospsqmtx.cc@ 4086

Last change on this file since 4086 was 3824, checked in by ansari, 15 years ago

petites corrections (#ifdef/namespace) suite compil cxx, Reza 30/07/2010

File size: 6.7 KB
RevLine 
[3809]1// Persistence manager for template numerical arrays
2// R. Ansari, C.Magneville 03/2000
3
4#include "pexceptions.h"
5#include "fiondblock.h"
6#include "fiospsqmtx.h"
7#include "datatype.h"
8#include <typeinfo>
9
10
11//----------------------------------------------------------------------
12/*!
13 \class SOPHYA::FIO_SpecialSquareMatrix
14 \ingroup TArray
15
16 \brief Manager class the PPF I/O (SOPHYA persistence) of SpecialSquareMatrix<T> objects.
17
18 */
19///////////////////////////////////////////////////////////
20
21namespace SOPHYA {
22
23//! Default constructor
24template <class T>
25FIO_SpecialSquareMatrix<T>::FIO_SpecialSquareMatrix()
26{
27 dobj=NULL;
28 ownobj=false;
29}
30
31
32//! Constructor from the file \b filename - Reads the SpecialSquareMatrix object from the specified file.
33template <class T>
34FIO_SpecialSquareMatrix<T>::FIO_SpecialSquareMatrix(string const & filename)
35{
36 dobj=NULL;
37 ownobj=false;
38 Read(filename);
39}
40
41//! Constructor from the SpecialSquareMatrix \b obj
42template <class T>
43FIO_SpecialSquareMatrix<T>::FIO_SpecialSquareMatrix(const SpecialSquareMatrix<T> & obj)
44{
45 const SymmetricMatrix<T>* sym = dynamic_cast< const SymmetricMatrix<T> * >(&obj);
46 if (sym != NULL) dobj = new SymmetricMatrix<T>(*sym, true);
47 else {
48 const LowerTriangularMatrix<T>* trn = dynamic_cast< const LowerTriangularMatrix<T> * >(&obj);
49 if (trn != NULL) dobj = new LowerTriangularMatrix<T>(*trn, true);
50 else {
51 const DiagonalMatrix<T>* diag = dynamic_cast< const DiagonalMatrix<T> * >(&obj);
52 if (diag != NULL) dobj = new DiagonalMatrix<T>(*diag, true);
53 else throw TypeMismatchExc("FIO_SpecialSquareMatrix<T>::FIO_SpecialSquareMatrix(obj) Not a TriangularMatrix<T> / DiagonalMatrix<T> / SymmetricMatrix<T> ");
54 }
55 }
56 ownobj=true;
57}
58
59//! Connect with a SpecialSquareMatrix \b obj
60template <class T>
61FIO_SpecialSquareMatrix<T>::FIO_SpecialSquareMatrix(SpecialSquareMatrix<T> * obj)
62{
63 dobj = obj;
64 ownobj=false;
65}
66
67//! destructor
68template <class T>
69FIO_SpecialSquareMatrix<T>::~FIO_SpecialSquareMatrix()
70{
71 if (ownobj && dobj) delete dobj;
72}
73
74//! Return the pointer to the connected SpecialSquareMatrix<T> object
75template <class T>
76AnyDataObj* FIO_SpecialSquareMatrix<T>::DataObj()
77{
78 return(dobj);
79}
80
81//! Connect SpecialSquareMatrix \b o
82template <class T>
83void FIO_SpecialSquareMatrix<T>::SetDataObj(AnyDataObj & o)
84{
85 SpecialSquareMatrix<T> * po = dynamic_cast< SpecialSquareMatrix<T> * >(&o);
86 if (po == NULL) {
87 char buff[160];
88 sprintf(buff,"FIO_SpecialSquareMatrix<%s>::SetDataObj(%s) - Object type error ! ",
89 DataTypeInfo<T>::getTypeName().c_str(), typeid(o).name());
90 throw TypeMismatchExc(PExcLongMessage(buff));
91 }
92 if (ownobj && dobj) delete dobj;
93 dobj = po; ownobj = false;
94}
95
96//! Reads in the SpecialSquareMatrix<T> object from the PPF input stream \b is
97template <class T>
98void FIO_SpecialSquareMatrix<T>::ReadSelf(PInPersist& is)
99{
100// On lit les 4 premiers uint_4
101// 0: Numero de version, 1 : MtxType, 2 != 0 , has Info, 3 : Reserved
102 uint_4 itab[4];
103 is.Get(itab,4);
104
105 if (dobj == NULL) {
106 if (itab[1] == (uint_4)C_DiagonalMatrix) dobj = new DiagonalMatrix<T>;
107 else if (itab[1] == (uint_4)C_LowerTriangularMatrix) dobj = new LowerTriangularMatrix<T>;
108 else if (itab[1] == (uint_4)C_SymmetricMatrix) dobj = new SymmetricMatrix<T>;
109 else throw TypeMismatchExc("FIO_SpecialSquareMatrix<T>::ReadSelf() bad matrix type in file");
110 }
111 else {
112 if ((uint_4)dobj->MtxType() != itab[1]) {
113 // cout << " BUG*** dobj->MtxType()=" << (uint_4)(dobj->MtxType()) << " itab[1]=" << itab[1] << endl;
114 throw TypeMismatchExc("FIO_SpecialSquareMatrix<T>::ReadSelf() matrix type dobj <> in file ");
115 }
116 }
117
118// On lit les tailles, etc ...
119
120// Tous les sa_size_t sont ecrit/lu en int_8 afin de maintenir la compatibilite
121// -- 0: rowSize
122 int_8 tmpi8s[3];
123
124 is.Get(tmpi8s, 3);
125 dobj->SetSize(tmpi8s[0]);
126
127// On lit le datablock
128 is >> dobj->DataBlock();
129// On lit le DVList info si necessaire
130 if (itab[2] != 0) is >> dobj->Info();
131}
132
133//! Writes the SpecialSquareMatrix<T> object to the output PPF stream \b os
134template <class T>
135void FIO_SpecialSquareMatrix<T>::WriteSelf(POutPersist& os) const
136{
137 if (dobj == NULL) return;
138// On ecrit 3 uint_4 ....
139// 0: Numero de version, 1 : reserved 2 != 0 , has Info
140 uint_4 itab[4];
141 itab[0] = 1; // Numero de version a 1 - fev 2009
142 itab[1] = (uint_4)dobj->MtxType(); // Type de matrice : Diagonal, Triangular, Symmetric ...
143 // cout << " *** DBG** WriteSelf() dobj->MtxType()= " << itab[1] << endl;
144 itab[2] = (dobj->mInfo != NULL) ? 1 : 0;
145 itab[3] = 0; // Reserved
146 os.Put(itab,4);
147
148// On ecrit les tailles, etc ...
149// Tous les sa_size_t sont ecrit en int_8 afin de pouvoir etre ecrit/relu
150// entre version du programme utilisant int_4 OU int_8 pour sa_size_t
151 int_8 tmpi8s[3];
152 tmpi8s[0] = dobj->NRows();
153 tmpi8s[1] = tmpi8s[2] = 0;
154 os.Put(tmpi8s, 3);
155 // On ecrit le datablock
156 os << dobj->DataBlock();
157// On ecrit le DVList info si necessaire
158 if (itab[2] != 0) os << dobj->Info();
159}
160
161
162
163///////////////////////////////////////////////////////////////
164#ifdef __CXX_PRAGMA_TEMPLATES__
165// Instances des delegues FileIO (PPersist)
166#pragma define_template FIO_SpecialSquareMatrix<uint_1>
167#pragma define_template FIO_SpecialSquareMatrix<uint_2>
168#pragma define_template FIO_SpecialSquareMatrix<uint_4>
169#pragma define_template FIO_SpecialSquareMatrix<uint_8>
170#pragma define_template FIO_SpecialSquareMatrix<int_1>
171#pragma define_template FIO_SpecialSquareMatrix<int_2>
172#pragma define_template FIO_SpecialSquareMatrix<int_4>
173#pragma define_template FIO_SpecialSquareMatrix<int_8>
174#pragma define_template FIO_SpecialSquareMatrix<r_4>
175#pragma define_template FIO_SpecialSquareMatrix<r_8>
176#pragma define_template FIO_SpecialSquareMatrix< complex<r_4> >
177#pragma define_template FIO_SpecialSquareMatrix< complex<r_8> >
178#ifdef SO_LDBLE128
179#pragma define_template FIO_SpecialSquareMatrix<r_16>
180#pragma define_template FIO_SpecialSquareMatrix< complex<r_16> >
181#endif
182#endif
183
184#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
185template class FIO_SpecialSquareMatrix<uint_1>;
186template class FIO_SpecialSquareMatrix<uint_2>;
187template class FIO_SpecialSquareMatrix<uint_4>;
188template class FIO_SpecialSquareMatrix<uint_8>;
189template class FIO_SpecialSquareMatrix<int_1>;
190template class FIO_SpecialSquareMatrix<int_2>;
191template class FIO_SpecialSquareMatrix<int_4>;
192template class FIO_SpecialSquareMatrix<int_8>;
193template class FIO_SpecialSquareMatrix<r_4>;
194template class FIO_SpecialSquareMatrix<r_8>;
195template class FIO_SpecialSquareMatrix< complex<r_4> >;
196template class FIO_SpecialSquareMatrix< complex<r_8> >;
197#ifdef SO_LDBLE128
198template class FIO_SpecialSquareMatrix<r_16>;
199template class FIO_SpecialSquareMatrix< complex<r_16> >;
200#endif
201#endif
[3824]202
203} // Fin de namespace SOPHYA
Note: See TracBrowser for help on using the repository browser.