RangeMap.hpp
00001 //
00002 // Range Map class for the SAL3D library.
00003 // Copyright (C) 2008-2010 AQSENSE, S.L.
00004 //
00005 #if !defined (AQSENSE_SAL3DPP_RANGE_MAP_HPP)
00006 #define AQSENSE_SAL3DPP_RANGE_MAP_HPP
00007 
00008 #if defined (_MSC_VER) && (_MSC_VER >= 1020)
00009 #pragma once
00010 #endif // _MSC_VER && _MSC_VER >= 1020
00011 
00012 #include <limits>
00013 #include <stdexcept>
00014 #include <string>
00015 #include <vector>
00016 #include <sal3d/rangemap.h>
00017 #include <sal3dpp/Common.hpp>
00018 #include <sal3dpp/Frame.hpp>
00019 #include <sal3dpp/Profile.hpp>
00020 
00021 namespace sal3d
00022 {
00100     class RangeMap
00101     {
00102         public:
00124             RangeMap (int profilesLength, int maxProfiles)
00125             {
00126                 _rangemap.p = 0;
00127                 Error e;
00128                 sal3d_range_map_new (profilesLength, maxProfiles,
00129                         &_rangemap, &e.e);
00130                 if ( e.e.value < 0 )
00131                     throw e;
00132             }
00133 
00145             explicit RangeMap (const std::string &fileName)
00146             {
00147                 _rangemap.p = 0;
00148                 Error e;
00149                 sal3d_range_map_new_from_file (fileName.c_str (),
00150                         &_rangemap, 0, &e.e);
00151                 if ( e.e.value < 0 )
00152                     throw e;
00153             }
00154 
00174             RangeMap (const Frame &frame, int plane)
00175             {
00176                 _rangemap.p = 0;
00177                 Error e;
00178                 sal3d_range_map_new_from_frame (frame.c_frame (),
00179                         plane, &_rangemap, &e.e);
00180                 if ( e.e.value < 0 )
00181                     throw e;
00182             }
00183 
00189             RangeMap (const RangeMap &rangeMap):
00190                 _rangemap (rangeMap._rangemap)
00191             {
00192                 Error e;
00193                 sal3d_range_map_share (_rangemap, &e.e);
00194                 if ( e.e.value < 0 )
00195                     throw e;
00196             }
00197 
00210             explicit RangeMap (sal3d_range_map rangemap):
00211                 _rangemap (rangemap)
00212             {
00213                 Error e;
00214                 sal3d_range_map_check_validity (rangemap, &e.e);
00215                 if ( e.e.value < 0 )
00216                     throw e;
00217             }
00218 
00225             ~RangeMap ()
00226             {
00227                 sal3d_range_map_release (_rangemap);
00228             }
00229 
00240             RangeMap
00241             copy() const
00242             {
00243                 sal3d_range_map rangemap;
00244                 Error e;
00245                 sal3d_range_map_duplicate (_rangemap, &rangemap, &e.e);
00246                 if ( e.e.value < 0 )
00247                     throw e;
00248                 return RangeMap (rangemap);
00249             }
00250 
00260             int
00261             countProfiles () const
00262             {
00263                 Error e;
00264                 int count = sal3d_range_map_count_profiles (_rangemap, &e.e);
00265                 if ( e.e.value < 0 )
00266                     throw e;
00267                 return count;
00268             }
00269 
00281             int
00282             maxProfiles () const
00283             {
00284                 Error e;
00285                 int count = sal3d_range_map_max_profiles (_rangemap, &e.e);
00286                 if ( e.e.value < 0 )
00287                     throw e;
00288                 return count;
00289             }
00290 
00300             sal3d_range_map
00301             c_range_map () const
00302             {
00303                 return _rangemap;
00304             }
00305 
00313             RangeMap &
00314             operator= (const RangeMap &rhs)
00315             {
00316                 Error e;
00317                 sal3d_range_map_share (rhs._rangemap, &e.e);
00318                 if ( e.e.value < 0 )
00319                     throw e;
00320                 sal3d_range_map_release (_rangemap);
00321                 _rangemap = rhs._rangemap;
00322 
00323                 return *this;
00324             }
00325 
00343             Profile
00344             getNewProfile () const
00345             {
00346                 sal3d_profile profile;
00347                 profile.p = 0;
00348                 Error e;
00349                 sal3d_range_map_get_new_profile (_rangemap,
00350                         &profile, &e.e);
00351                 if ( e.e.value < 0 )
00352                     throw e;
00353                 return Profile (profile);
00354             }
00355 
00366             const Profile
00367             operator[] (int index) const
00368             {
00369                 sal3d_profile profile;
00370                 profile.p = 0;
00371                 Error e;
00372                 sal3d_range_map_get_profile (_rangemap, index,
00373                         &profile, &e.e);
00374                 if ( e.e.value < 0 )
00375                     throw e;
00376                 return Profile (profile);
00377             }
00378 
00389             Profile
00390             operator[] (int index)
00391             {
00392                 return static_cast<const RangeMap &>(*this)[index];
00393             }
00394 
00400             int
00401             profilesLength () const
00402             {
00403                 Error e;
00404                 int length = sal3d_range_map_get_profiles_length (_rangemap,
00405                         &e.e);
00406                 if ( e.e.value < 0 )
00407                     throw e;
00408 
00409                 return length;
00410             }
00411 
00424             Frame
00425             newFrame () const
00426             {
00427                 sal3d_frame frame;
00428                 Error e;
00429                 sal3d_range_map_get_frame (_rangemap,
00430                         &frame, &e.e);
00431                 if ( e.e.value < 0 )
00432                     throw e;
00433                 return Frame (frame);
00434             }
00435 
00445             void
00446             saveToFile (const std::string &fileName) const
00447             {
00448                 Error e;
00449                 sal3d_range_map_save_to_file (_rangemap, fileName.c_str (),
00450                         &e.e);
00451                 if ( e.e.value < 0 )
00452                     throw e;
00453             }
00454 
00455         private:
00457             sal3d_range_map _rangemap;
00458     };
00459 }
00460 
00461 #endif // !AQSENSE_SAL3DPP_RANGE_MAP_HPP