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

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

MAJ documentation - Reza 14/6/2005

File size: 5.7 KB
Line 
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
13 columns can be used for different data types
14 (integer, float, string ...).
15 The whole data set is kept in memory.
16 \sa SOPHYA::MuTyV
17 \sa SOPHYA::BaseDataTable
18 \sa SOPHYA::SegDataBlock
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
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*/
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}
61//! Copy the table structure from \b a and shares the data (columns content)
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;
83 case StringField :
84 mSCols[sk].Share(a.mSCols[ska]);
85 break;
86 default:
87 throw ForbiddenError("DataTable::Share() : unknown column type ");
88 break;
89 }
90 }
91}
92
93//! Copy the table structure from \b a and duplicate (copy) the data (columns content)
94void DataTable::Clone(DataTable const & a)
95{
96 // On copie la structure de table
97 CopyStructure(a);
98 // Et on partage les donnees des colonnes
99 for (size_t kk=0; kk<mNames.size(); kk++) {
100 sa_size_t sk = mNames[kk].ser;
101 sa_size_t ska = a.mNames[kk].ser;
102 switch (mNames[kk].type) {
103 case IntegerField :
104 mICols[sk].Clone(a.mICols[ska], true);
105 break;
106 case LongField :
107 mLCols[sk].Clone(a.mLCols[ska], true);
108 break;
109 case FloatField :
110 mFCols[sk].Clone(a.mFCols[ska], true);
111 break;
112 case DoubleField :
113 mDCols[sk].Clone(a.mDCols[ska], true);
114 break;
115 case StringField :
116 mSCols[sk].Clone(a.mSCols[ska], true);
117 break;
118 default:
119 throw ForbiddenError("DataTable::Clone() : unknown column type ");
120 break;
121 }
122 }
123}
124//! Reset (/clear) the table content and structure
125void DataTable::Clear()
126{
127 if ( (NVar() == 0) && (NEntry() == 0)) return;
128 mNEnt = 0;
129 mNSeg = 0;
130 if (mVarD) delete[] mVarD;
131 mVarD = NULL;
132 if (mVarMTV) delete[] mVarMTV;
133 mVarMTV = NULL;
134 mNames.clear();
135 if (mInfo) delete mInfo;
136 mInfo = NULL;
137 mMin.clear();
138 mMax.clear();
139 mMinMaxNEnt.clear();
140 mIColsP.clear();
141 mLColsP.clear();
142 mFColsP.clear();
143 mDColsP.clear();
144 mSColsP.clear();
145
146 mIColIdx.clear();
147 mLColIdx.clear();
148 mFColIdx.clear();
149 mDColIdx.clear();
150 mSColIdx.clear();
151
152 mICols.clear();
153 mLCols.clear();
154 mFCols.clear();
155 mDCols.clear();
156 mSCols.clear();
157}
158
159
160/*!
161 Implements the action defined in the BaseDataTable interface.
162 In the current implementation, throws an exception (ParmError)
163 if the table contains some data already.
164*/
165sa_size_t DataTable::AddColumn(FieldType ft, string const & cnom)
166{
167 if (NEntry() > 0)
168 throw ParmError("DataTable::AddColumn() Table contains already data ");
169 CheckColName(cnom);
170 sa_size_t ser;
171 sa_size_t idx = NVar();
172 switch (ft) {
173 case IntegerField :
174 ser = mICols.size();
175 mICols.push_back(SegDataBlock<int_4>(mSegSz));
176 mIColIdx.push_back(idx);
177 mIColsP.push_back(NULL);
178 for(sa_size_t kk=0; kk<mICols.size(); kk++)
179 mIColsP[kk] = &(mICols[kk]);
180 break;
181 case LongField :
182 ser = mLCols.size();
183 mLCols.push_back(SegDataBlock<int_8>(mSegSz));
184 mLColIdx.push_back(idx);
185 mLColsP.push_back(NULL);
186 for(sa_size_t kk=0; kk<mLCols.size(); kk++)
187 mLColsP[kk] = &(mLCols[kk]);
188 break;
189 case FloatField :
190 ser = mFCols.size();
191 mFCols.push_back(SegDataBlock<r_4>(mSegSz));
192 mFColIdx.push_back(idx);
193 mFColsP.push_back(NULL);
194 for(sa_size_t kk=0; kk<mFCols.size(); kk++)
195 mFColsP[kk] = &(mFCols[kk]);
196 break;
197 case DoubleField :
198 ser = mDCols.size();
199 mDCols.push_back(SegDataBlock<r_8>(mSegSz));
200 mDColIdx.push_back(idx);
201 mDColsP.push_back(NULL);
202 for(sa_size_t kk=0; kk<mDCols.size(); kk++)
203 mDColsP[kk] = &(mDCols[kk]);
204 break;
205 case StringField :
206 ser = mDCols.size();
207 mSCols.push_back(SegDataBlock<string>(mSegSz));
208 mSColIdx.push_back(idx);
209 mSColsP.push_back(NULL);
210 for(sa_size_t kk=0; kk<mSCols.size(); kk++)
211 mSColsP[kk] = &(mSCols[kk]);
212 break;
213 default:
214 throw ParmError("DataTable::AddColumn() unknown field type ");
215 break;
216 }
217 colst col;
218 col.nom = cnom;
219 col.type = ft;
220 col.ser = ser;
221 mNames.push_back(col);
222
223 // Tableaux de calcul min-max
224 mMin.push_back(0.);
225 mMax.push_back(0.);
226 mMinMaxNEnt.push_back(0);
227
228 return NVar();
229}
230
Note: See TracBrowser for help on using the repository browser.