source: Sophya/trunk/SophyaLib/HiStats/datatable.cc@ 2827

Last change on this file since 2827 was 2827, checked in by ansari, 20 years ago

Modifs code BaseDataTable , DataTable et SwPPFDataTable pour la prise en compte
de colonnes de type complex (complex<r_4> ComplexField et complex<r_8> DoubleComplexField ) Reza , 2 Nov 2005

File size: 6.7 KB
RevLine 
[2688]1#include "datatable.h"
2#include "sopnamsp.h"
3#include "strutil.h"
4#include "pexceptions.h"
5#include "fiosegdb.h"
6
7
8/*!
9 \class SOPHYA::DataTable
10 \ingroup HiStats
11 This class can be used to organize data in table (row-column) form.
12 Each column holds homogeneous data (same data type), while different
[2808]13 columns can be used for different data types
14 (integer, float, string ...).
15 The whole data set is kept in memory.
[2688]16 \sa SOPHYA::MuTyV
17 \sa SOPHYA::BaseDataTable
[2808]18 \sa SOPHYA::SegDataBlock
[2688]19
20 \code
21 #include "datatable.h"
22 // ...
23 DataTable dt(64);
24 dt.AddFloatColumn("X0_f");
25 dt.AddFloatColumn("X1_f");
26 dt.AddDoubleColumn("X0X0pX1X1_d");
27 double x[5];
28 for(int i=0; i<63; i++) {
29 x[0] = (i%9)-4.; x[1] = (i/9)-3.; x[2] = x[0]*x[0]+x[1]*x[1];
30 dt.AddLine(x);
31 }
32 // Printing table info
33 cout << dt ;
34 // Saving object into a PPF file
35 POutPersist po("dtable.ppf");
36 po << dt ;
37 \endcode
38*/
39
40
41//! Default constructor - optional specification of block (or segment) size
42DataTable::DataTable(sa_size_t segsz)
43 : BaseDataTable(segsz)
44{
45}
46
[2808]47//! copy constructor
48/*!
49 The copy constructur shares the data if \b share=true.
50 Otherwise, the Clone() method is called to make a complete copy.
51*/
[2688]52DataTable::DataTable(DataTable const & a, bool share)
53 : BaseDataTable(a.SegmentSize())
54{
55 if (share) Share(a);
56 else Clone(a);
57 mNEnt = a.mNEnt;
58 mNSeg = a.mNSeg;
59 if (a.mInfo) mInfo = new DVList(*(a.mInfo));
60}
[2808]61//! Copy the table structure from \b a and shares the data (columns content)
[2688]62void DataTable::Share(DataTable const & a)
63{
64 // On copie la structure de table
65 CopyStructure(a);
66 // Et on partage les donnees des colonnes
67 for (size_t kk=0; kk<mNames.size(); kk++) {
68 sa_size_t sk = mNames[kk].ser;
69 sa_size_t ska = a.mNames[kk].ser;
70 switch (mNames[kk].type) {
71 case IntegerField :
72 mICols[sk].Share(a.mICols[ska]);
73 break;
74 case LongField :
75 mLCols[sk].Share(a.mLCols[ska]);
76 break;
77 case FloatField :
78 mFCols[sk].Share(a.mFCols[ska]);
79 break;
80 case DoubleField :
81 mDCols[sk].Share(a.mDCols[ska]);
82 break;
[2827]83 case ComplexField :
84 mYCols[sk].Share(a.mYCols[ska]);
85 break;
86 case DoubleComplexField :
87 mZCols[sk].Share(a.mZCols[ska]);
88 break;
[2688]89 case StringField :
90 mSCols[sk].Share(a.mSCols[ska]);
91 break;
92 default:
93 throw ForbiddenError("DataTable::Share() : unknown column type ");
94 break;
95 }
96 }
97}
98
[2808]99//! Copy the table structure from \b a and duplicate (copy) the data (columns content)
[2688]100void DataTable::Clone(DataTable const & a)
101{
102 // On copie la structure de table
103 CopyStructure(a);
104 // Et on partage les donnees des colonnes
105 for (size_t kk=0; kk<mNames.size(); kk++) {
106 sa_size_t sk = mNames[kk].ser;
107 sa_size_t ska = a.mNames[kk].ser;
108 switch (mNames[kk].type) {
109 case IntegerField :
110 mICols[sk].Clone(a.mICols[ska], true);
111 break;
112 case LongField :
113 mLCols[sk].Clone(a.mLCols[ska], true);
114 break;
115 case FloatField :
116 mFCols[sk].Clone(a.mFCols[ska], true);
117 break;
118 case DoubleField :
119 mDCols[sk].Clone(a.mDCols[ska], true);
120 break;
[2827]121 case ComplexField :
122 mYCols[sk].Clone(a.mYCols[ska], true);
123 break;
124 case DoubleComplexField :
125 mZCols[sk].Clone(a.mZCols[ska], true);
126 break;
[2688]127 case StringField :
128 mSCols[sk].Clone(a.mSCols[ska], true);
129 break;
130 default:
131 throw ForbiddenError("DataTable::Clone() : unknown column type ");
132 break;
133 }
134 }
135}
[2808]136//! Reset (/clear) the table content and structure
[2688]137void DataTable::Clear()
138{
139 if ( (NVar() == 0) && (NEntry() == 0)) return;
140 mNEnt = 0;
141 mNSeg = 0;
142 if (mVarD) delete[] mVarD;
143 mVarD = NULL;
144 if (mVarMTV) delete[] mVarMTV;
145 mVarMTV = NULL;
146 mNames.clear();
147 if (mInfo) delete mInfo;
148 mInfo = NULL;
149 mMin.clear();
150 mMax.clear();
151 mMinMaxNEnt.clear();
152 mIColsP.clear();
153 mLColsP.clear();
154 mFColsP.clear();
155 mDColsP.clear();
[2827]156 mYColsP.clear();
157 mZColsP.clear();
[2688]158 mSColsP.clear();
159
160 mIColIdx.clear();
161 mLColIdx.clear();
162 mFColIdx.clear();
163 mDColIdx.clear();
[2827]164 mYColIdx.clear();
165 mZColIdx.clear();
[2688]166 mSColIdx.clear();
167
168 mICols.clear();
169 mLCols.clear();
170 mFCols.clear();
171 mDCols.clear();
[2827]172 mYCols.clear();
173 mZCols.clear();
[2688]174 mSCols.clear();
175}
176
177
[2808]178/*!
179 Implements the action defined in the BaseDataTable interface.
180 In the current implementation, throws an exception (ParmError)
181 if the table contains some data already.
182*/
[2688]183sa_size_t DataTable::AddColumn(FieldType ft, string const & cnom)
184{
185 if (NEntry() > 0)
186 throw ParmError("DataTable::AddColumn() Table contains already data ");
187 CheckColName(cnom);
188 sa_size_t ser;
189 sa_size_t idx = NVar();
190 switch (ft) {
191 case IntegerField :
192 ser = mICols.size();
193 mICols.push_back(SegDataBlock<int_4>(mSegSz));
194 mIColIdx.push_back(idx);
195 mIColsP.push_back(NULL);
196 for(sa_size_t kk=0; kk<mICols.size(); kk++)
197 mIColsP[kk] = &(mICols[kk]);
198 break;
199 case LongField :
200 ser = mLCols.size();
201 mLCols.push_back(SegDataBlock<int_8>(mSegSz));
202 mLColIdx.push_back(idx);
203 mLColsP.push_back(NULL);
204 for(sa_size_t kk=0; kk<mLCols.size(); kk++)
205 mLColsP[kk] = &(mLCols[kk]);
206 break;
207 case FloatField :
208 ser = mFCols.size();
209 mFCols.push_back(SegDataBlock<r_4>(mSegSz));
210 mFColIdx.push_back(idx);
211 mFColsP.push_back(NULL);
212 for(sa_size_t kk=0; kk<mFCols.size(); kk++)
213 mFColsP[kk] = &(mFCols[kk]);
214 break;
215 case DoubleField :
216 ser = mDCols.size();
217 mDCols.push_back(SegDataBlock<r_8>(mSegSz));
218 mDColIdx.push_back(idx);
219 mDColsP.push_back(NULL);
220 for(sa_size_t kk=0; kk<mDCols.size(); kk++)
221 mDColsP[kk] = &(mDCols[kk]);
222 break;
[2827]223 case ComplexField :
224 ser = mYCols.size();
225 mYCols.push_back(SegDataBlock< complex<r_4> >(mSegSz));
226 mYColIdx.push_back(idx);
227 mYColsP.push_back(NULL);
228 for(sa_size_t kk=0; kk<mYCols.size(); kk++)
229 mYColsP[kk] = &(mYCols[kk]);
230 break;
231 case DoubleComplexField :
232 ser = mZCols.size();
233 mZCols.push_back(SegDataBlock< complex<r_8> >(mSegSz));
234 mZColIdx.push_back(idx);
235 mZColsP.push_back(NULL);
236 for(sa_size_t kk=0; kk<mZCols.size(); kk++)
237 mZColsP[kk] = &(mZCols[kk]);
238 break;
[2688]239 case StringField :
240 ser = mDCols.size();
241 mSCols.push_back(SegDataBlock<string>(mSegSz));
242 mSColIdx.push_back(idx);
243 mSColsP.push_back(NULL);
244 for(sa_size_t kk=0; kk<mSCols.size(); kk++)
245 mSColsP[kk] = &(mSCols[kk]);
246 break;
247 default:
248 throw ParmError("DataTable::AddColumn() unknown field type ");
249 break;
250 }
251 colst col;
252 col.nom = cnom;
253 col.type = ft;
254 col.ser = ser;
255 mNames.push_back(col);
[2696]256
257 // Tableaux de calcul min-max
258 mMin.push_back(0.);
259 mMax.push_back(0.);
260 mMinMaxNEnt.push_back(0);
261
[2688]262 return NVar();
263}
264
Note: See TracBrowser for help on using the repository browser.