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

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

1/ Prise en charge champ de type DateTimeField ds BaseDataTable , DataTable, SwPPFDataTable
2/ Methodes BaseDataTable completees - en particulier Print/WriteASCII, et
decodage de fichiers ASCII

Reza, 8 Nov 2005

File size: 6.8 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 :
[2831]81 case DateTimeField :
[2688]82 mDCols[sk].Share(a.mDCols[ska]);
83 break;
[2827]84 case ComplexField :
85 mYCols[sk].Share(a.mYCols[ska]);
86 break;
87 case DoubleComplexField :
88 mZCols[sk].Share(a.mZCols[ska]);
89 break;
[2688]90 case StringField :
91 mSCols[sk].Share(a.mSCols[ska]);
92 break;
93 default:
94 throw ForbiddenError("DataTable::Share() : unknown column type ");
95 break;
96 }
97 }
98}
99
[2808]100//! Copy the table structure from \b a and duplicate (copy) the data (columns content)
[2688]101void DataTable::Clone(DataTable const & a)
102{
103 // On copie la structure de table
104 CopyStructure(a);
105 // Et on partage les donnees des colonnes
106 for (size_t kk=0; kk<mNames.size(); kk++) {
107 sa_size_t sk = mNames[kk].ser;
108 sa_size_t ska = a.mNames[kk].ser;
109 switch (mNames[kk].type) {
110 case IntegerField :
111 mICols[sk].Clone(a.mICols[ska], true);
112 break;
113 case LongField :
114 mLCols[sk].Clone(a.mLCols[ska], true);
115 break;
116 case FloatField :
117 mFCols[sk].Clone(a.mFCols[ska], true);
118 break;
119 case DoubleField :
[2831]120 case DateTimeField :
[2688]121 mDCols[sk].Clone(a.mDCols[ska], true);
122 break;
[2827]123 case ComplexField :
124 mYCols[sk].Clone(a.mYCols[ska], true);
125 break;
126 case DoubleComplexField :
127 mZCols[sk].Clone(a.mZCols[ska], true);
128 break;
[2688]129 case StringField :
130 mSCols[sk].Clone(a.mSCols[ska], true);
131 break;
132 default:
133 throw ForbiddenError("DataTable::Clone() : unknown column type ");
134 break;
135 }
136 }
137}
[2808]138//! Reset (/clear) the table content and structure
[2688]139void DataTable::Clear()
140{
141 if ( (NVar() == 0) && (NEntry() == 0)) return;
142 mNEnt = 0;
143 mNSeg = 0;
144 if (mVarD) delete[] mVarD;
145 mVarD = NULL;
146 if (mVarMTV) delete[] mVarMTV;
147 mVarMTV = NULL;
148 mNames.clear();
149 if (mInfo) delete mInfo;
150 mInfo = NULL;
151 mMin.clear();
152 mMax.clear();
153 mMinMaxNEnt.clear();
154 mIColsP.clear();
155 mLColsP.clear();
156 mFColsP.clear();
157 mDColsP.clear();
[2827]158 mYColsP.clear();
159 mZColsP.clear();
[2688]160 mSColsP.clear();
161
162 mIColIdx.clear();
163 mLColIdx.clear();
164 mFColIdx.clear();
165 mDColIdx.clear();
[2827]166 mYColIdx.clear();
167 mZColIdx.clear();
[2688]168 mSColIdx.clear();
169
170 mICols.clear();
171 mLCols.clear();
172 mFCols.clear();
173 mDCols.clear();
[2827]174 mYCols.clear();
175 mZCols.clear();
[2688]176 mSCols.clear();
177}
178
179
[2808]180/*!
181 Implements the action defined in the BaseDataTable interface.
182 In the current implementation, throws an exception (ParmError)
183 if the table contains some data already.
184*/
[2688]185sa_size_t DataTable::AddColumn(FieldType ft, string const & cnom)
186{
187 if (NEntry() > 0)
188 throw ParmError("DataTable::AddColumn() Table contains already data ");
189 CheckColName(cnom);
190 sa_size_t ser;
191 sa_size_t idx = NVar();
192 switch (ft) {
193 case IntegerField :
194 ser = mICols.size();
195 mICols.push_back(SegDataBlock<int_4>(mSegSz));
196 mIColIdx.push_back(idx);
197 mIColsP.push_back(NULL);
198 for(sa_size_t kk=0; kk<mICols.size(); kk++)
199 mIColsP[kk] = &(mICols[kk]);
200 break;
201 case LongField :
202 ser = mLCols.size();
203 mLCols.push_back(SegDataBlock<int_8>(mSegSz));
204 mLColIdx.push_back(idx);
205 mLColsP.push_back(NULL);
206 for(sa_size_t kk=0; kk<mLCols.size(); kk++)
207 mLColsP[kk] = &(mLCols[kk]);
208 break;
209 case FloatField :
210 ser = mFCols.size();
211 mFCols.push_back(SegDataBlock<r_4>(mSegSz));
212 mFColIdx.push_back(idx);
213 mFColsP.push_back(NULL);
214 for(sa_size_t kk=0; kk<mFCols.size(); kk++)
215 mFColsP[kk] = &(mFCols[kk]);
216 break;
217 case DoubleField :
[2831]218 case DateTimeField :
[2688]219 ser = mDCols.size();
220 mDCols.push_back(SegDataBlock<r_8>(mSegSz));
221 mDColIdx.push_back(idx);
222 mDColsP.push_back(NULL);
223 for(sa_size_t kk=0; kk<mDCols.size(); kk++)
224 mDColsP[kk] = &(mDCols[kk]);
225 break;
[2827]226 case ComplexField :
227 ser = mYCols.size();
228 mYCols.push_back(SegDataBlock< complex<r_4> >(mSegSz));
229 mYColIdx.push_back(idx);
230 mYColsP.push_back(NULL);
231 for(sa_size_t kk=0; kk<mYCols.size(); kk++)
232 mYColsP[kk] = &(mYCols[kk]);
233 break;
234 case DoubleComplexField :
235 ser = mZCols.size();
236 mZCols.push_back(SegDataBlock< complex<r_8> >(mSegSz));
237 mZColIdx.push_back(idx);
238 mZColsP.push_back(NULL);
239 for(sa_size_t kk=0; kk<mZCols.size(); kk++)
240 mZColsP[kk] = &(mZCols[kk]);
241 break;
[2688]242 case StringField :
243 ser = mDCols.size();
244 mSCols.push_back(SegDataBlock<string>(mSegSz));
245 mSColIdx.push_back(idx);
246 mSColsP.push_back(NULL);
247 for(sa_size_t kk=0; kk<mSCols.size(); kk++)
248 mSColsP[kk] = &(mSCols[kk]);
249 break;
250 default:
251 throw ParmError("DataTable::AddColumn() unknown field type ");
252 break;
253 }
254 colst col;
255 col.nom = cnom;
256 col.type = ft;
257 col.ser = ser;
258 mNames.push_back(col);
[2696]259
260 // Tableaux de calcul min-max
261 mMin.push_back(0.);
262 mMax.push_back(0.);
263 mMinMaxNEnt.push_back(0);
264
[2688]265 return NVar();
266}
267
Note: See TracBrowser for help on using the repository browser.