00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef _KDPOINT_H_
00020 #define _KDPOINT_H_
00021
00022 #include "Object.h"
00023 #include <stdio.h>
00024 #include <iostream>
00025 #include <math.h>
00026
00027
00028
00029
00030
00031 template <class KDData>
00032 class KDPoint : public FD::Object
00033 {
00034 public:
00035
00036
00037
00038
00039
00040 KDPoint()
00041 : m_dimSize(0), m_point(NULL)
00042 {
00043
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 KDPoint(int i_dimSize)
00055 : m_dimSize(i_dimSize)
00056 {
00057 m_point = new KDData[m_dimSize];
00058 }
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 KDPoint(int i_dimSize, KDData *i_point)
00070 : m_dimSize(i_dimSize)
00071 {
00072 m_point = new KDData[m_dimSize];
00073
00074 for (int i=0; i<m_dimSize; ++i) {
00075 m_point[i] = i_point[i];
00076 }
00077 }
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 KDPoint(int i_dimSize, KDData i_point)
00089 : m_dimSize(i_dimSize)
00090 {
00091 m_point = new KDData[m_dimSize];
00092
00093 for (int i=0; i<m_dimSize; ++i) {
00094 m_point[i] = i_point;
00095 }
00096 }
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 KDPoint(const KDPoint & i_cpy)
00107 {
00108 m_dimSize = i_cpy.m_dimSize;
00109 m_point = new KDData[m_dimSize];
00110
00111 for (int i=0; i<m_dimSize; ++i) {
00112 m_point[i] = i_cpy.m_point[i];
00113 }
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 KDPoint & operator =(const KDPoint &i_ref)
00128 {
00129
00130 if (&i_ref == this) {
00131 return *this;
00132 }
00133
00134
00135 delete [] m_point;
00136
00137 m_dimSize = i_ref.m_dimSize;
00138 m_point = new KDData[m_dimSize];
00139
00140 for (int i=0; i<m_dimSize; ++i) {
00141 m_point[i] = i_ref.m_point[i];
00142 }
00143
00144 return *this;
00145 }
00146
00147
00148
00149
00150
00151
00152
00153 ~KDPoint()
00154 {
00155 delete [] m_point;
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 void printOn(std::ostream &out) const
00167 {
00168 out << "<KDPoint " << std::endl;
00169 out << "<DimSize " << m_dimSize << " >" << std::endl;
00170
00171 out << "<PointData " << std::endl;
00172 for (int d=0; d<m_dimSize; ++d) {
00173 out << (int)(m_point[d]) << std::endl;
00174 }
00175 out << " >" << std::endl;
00176
00177 out << " >" << std::endl;
00178 }
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 void readFrom(std::istream &in)
00189 {
00190 std::string tag;
00191
00192 while (1) {
00193 char ch;
00194 in >> ch;
00195
00196 if (ch == '>') {
00197 break;
00198 }
00199 else if (ch != '<') {
00200 throw new FD::GeneralException ("KDPoint::readFrom : Parse error: '<' expected",__FILE__,__LINE__);
00201 }
00202
00203 in >> tag;
00204
00205 if (tag == "KDPoint") {
00206 continue;
00207 }
00208 else if (tag == "DimSize") {
00209 in >> m_dimSize;
00210 }
00211 else if (tag == "PointData") {
00212
00213 m_point = new KDData[m_dimSize];
00214
00215 for (int d=0; d<m_dimSize; ++d) {
00216 in >> m_point[d];
00217 }
00218 }
00219 else {
00220 throw new FD::GeneralException ("KDPoint::readFrom : Unknown argument: " + tag,__FILE__,__LINE__);
00221 }
00222
00223 if (!in) {
00224 throw new FD::GeneralException ("KDPoint::readFrom : Parse error trying to build " + tag,__FILE__,__LINE__);
00225 }
00226
00227 in >> tag;
00228 if (tag != ">") {
00229 throw new FD::GeneralException ("KDPoint::readFrom : Parse error: '>' expected ",__FILE__,__LINE__);
00230 }
00231 }
00232 }
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242 void SetPoint(KDData *i_point)
00243 {
00244 for (int i=0; i<m_dimSize; ++i) {
00245 m_point[i] = i_point[i];
00246 }
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 void SetCoord(int i_dim, KDData i_coord)
00260 {
00261 m_point[i_dim] = i_coord;
00262 }
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272 void SetDimSize(int i_dimSize)
00273 {
00274 m_dimSize = i_dimSize;
00275
00276 delete [] m_point;
00277 m_point = new KDData[m_dimSize];
00278 }
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288 inline KDData *GetPoint() const
00289 {
00290 return m_point;
00291 }
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 inline KDData GetCoord(int i_dim) const
00305 {
00306 return m_point[i_dim];
00307 }
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 inline int GetDimSize() const
00318 {
00319 return m_dimSize;
00320 }
00321
00322 private:
00323
00324 int m_dimSize;
00325
00326 KDData *m_point;
00327 };
00328
00329 #endif