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