Changeset 1568:3e2973e11579


Ignore:
Timestamp:
02/11/10 19:37:25 (6 months ago)
Author:
Howard Butler <hobu.inc@…>
Branch:
default
Message:

refactor our ReaderImpl? to be a ReaderI

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • include/liblas/detail/reader/reader.hpp

    r1561 r1568  
    4545#include <liblas/detail/fwd.hpp> 
    4646#include <liblas/detail/reader/point.hpp> 
     47#include <liblas/detail/reader/header.hpp> 
     48#include <liblas/lasreader.hpp> 
    4749 
    4850// std 
     
    5860namespace liblas { namespace detail {  
    5961 
    60 class ReaderImpl 
     62class ReaderImpl : public ReaderI 
    6163{ 
    6264public: 
     
    6567    ~ReaderImpl(); 
    6668 
    67     bool ReadHeader(LASHeader& header); 
    68     bool ReadNextPoint(LASPoint& point, const LASHeader& header); 
    69     bool ReadPointAt(std::size_t n, LASPoint& record, const LASHeader& header); 
     69    LASHeader const& ReadHeader(); 
     70    LASPoint const& ReadNextPoint(const LASHeader& header); 
     71    LASPoint const& ReadPointAt(std::size_t n, const LASHeader& header); 
    7072 
    7173    std::istream& GetStream() const; 
     
    9799     
    98100    detail::reader::Point* m_point_reader; 
     101    detail::reader::Header* m_header_reader; 
    99102 
    100103}; 
  • include/liblas/lasreader.hpp

    r1567 r1568  
    6060namespace liblas { 
    6161 
     62class ReaderI; 
     63     
    6264/// Defines public interface to LAS reader implementation. 
    6365class LASReader 
     
    7072    LASReader(std::istream& ifs); 
    7173 
     74    LASReader(ReaderI* reader); 
     75     
    7276    /// User-defined consructor initializes reader with input stream and 
    7377    /// a header to override the values in the file 
     
    141145    const std::auto_ptr<detail::ReaderImpl> m_pimpl; 
    142146    LASHeader m_header; 
    143     LASPoint m_point; 
    144     std::vector<LASVariableRecord> m_vlrs; 
     147    LASPoint* m_point; 
     148    LASPoint* m_empty_point; 
     149    // std::vector<LASVariableRecord> m_vlrs; 
    145150     
    146151    // Set if the user provides a header to override the header as  
     
    155160public: 
    156161 
    157     virtual ~ReaderI() {} 
    158  
    159     virtual LASHeader& ReadHeader(const LASHeader& header) const = 0; 
     162    virtual LASHeader const& ReadHeader() = 0; 
    160163    virtual LASPoint const& ReadNextPoint(const LASHeader& header) = 0; 
    161164    virtual LASPoint const& ReadPointAt(std::size_t n, const LASHeader& header) = 0; 
    162165 
    163     virtual void Reset(const LASHeader& header); 
    164     virtual void SetInputSRS(const LASSpatialReference& srs); 
    165     virtual void SetOutputSRS(const LASSpatialReference& srs, const LASHeader& header); 
     166    virtual void Reset(const LASHeader& header) = 0; 
     167    virtual void SetInputSRS(const LASSpatialReference& srs) = 0; 
     168    virtual void SetOutputSRS(const LASSpatialReference& srs, const LASHeader& header) = 0; 
     169 
     170    virtual ~ReaderI() {};     
    166171}; 
     172 
    167173} // namespace liblas 
    168174 
  • src/detail/reader/reader.cpp

    r1561 r1568  
    4141 
    4242#include <liblas/detail/reader/reader.hpp> 
    43 #include <liblas/detail/reader/header.hpp> 
    44 #include <liblas/detail/reader/vlr.hpp> 
    4543 
    4644#include <liblas/detail/utility.hpp> 
     
    6361ReaderImpl::ReaderImpl(std::istream& ifs) : 
    6462    m_ifs(ifs), m_size(0), m_current(0), 
    65     m_transform(0), m_in_ref(0), m_out_ref(0), m_point_reader(0) 
     63    m_transform(0), m_in_ref(0), m_out_ref(0), m_point_reader(0),      
     64    m_header_reader(new reader::Header(m_ifs)) 
     65 
    6666{ 
    6767} 
     
    8686 
    8787    delete m_point_reader; 
     88    delete m_header_reader; 
    8889} 
    8990 
     
    106107    if (m_point_reader == 0) { 
    107108        if (m_transform != 0) { 
    108             m_point_reader = new detail::reader::Point(m_ifs, header, m_transform); 
     109            m_point_reader = new reader::Point(m_ifs, header, m_transform); 
    109110        } else { 
    110             m_point_reader = new detail::reader::Point(m_ifs, header); 
     111            m_point_reader = new reader::Point(m_ifs, header); 
    111112        } 
    112113    }  
     
    122123        delete m_point_reader; 
    123124        m_point_reader = 0; 
    124         m_point_reader = new detail::reader::Point(m_ifs, header, m_transform); 
     125        m_point_reader = new reader::Point(m_ifs, header, m_transform); 
    125126    } 
    126127} 
     
    180181 
    181182 
    182 bool ReaderImpl::ReadHeader(LASHeader& header) 
    183 { 
    184     using detail::read_n; 
    185     using detail::reader::Header; 
    186      
    187     Header h(m_ifs); 
    188     h.read(); 
    189     header = h.GetHeader(); 
     183LASHeader const& ReaderImpl::ReadHeader() 
     184{ 
     185    m_header_reader->read(); 
     186    const LASHeader& header = m_header_reader->GetHeader(); 
    190187     
    191188    Reset(header); 
     
    195192    m_in_srs = header.GetSRS(); 
    196193     
    197     return true; 
    198 } 
    199  
    200 bool ReaderImpl::ReadNextPoint(LASPoint& point, const LASHeader& header) 
     194    return header; 
     195} 
     196 
     197LASPoint const& ReaderImpl::ReadNextPoint(const LASHeader& header) 
    201198{ 
    202199    if (0 == m_current) 
     
    204201        m_ifs.clear(); 
    205202        m_ifs.seekg(header.GetDataOffset(), std::ios::beg); 
     203 
    206204    } 
    207205 
     
    209207    { 
    210208        m_point_reader->read(); 
    211         point = m_point_reader->GetPoint(); 
     209        const LASPoint& point = m_point_reader->GetPoint(); 
    212210        ++m_current; 
    213         return true; 
    214     } 
    215  
    216     return false; 
    217 } 
    218  
    219 bool ReaderImpl::ReadPointAt(std::size_t n, LASPoint& point, const LASHeader& header) 
    220 { 
    221     if (m_size <= n) 
    222         return false; 
     211        return point; 
     212        // return true; 
     213    } else if (m_current == m_size ){ 
     214        throw std::out_of_range("file has no more points to read, end of file reached"); 
     215    } else { 
     216        throw std::runtime_error("ReadNextPoint: m_current > m_size, something has gone extremely awry"); 
     217    } 
     218 
     219    // return false; 
     220} 
     221 
     222LASPoint const& ReaderImpl::ReadPointAt(std::size_t n, const LASHeader& header) 
     223{ 
     224    // FIXME: Throw in this case. 
     225    if (m_size == n) { 
     226        throw std::out_of_range("file has no more points to read, end of file reached"); 
     227    } else if (m_size < n) { 
     228        std::ostringstream output; 
     229        output << "ReadPointAt:: Inputted value: " << n << " is greater than the number of points: " << m_size; 
     230        std::string out(output.str()); 
     231        throw std::runtime_error(out); 
     232    }  
    223233 
    224234    std::streamsize pos = (static_cast<std::streamsize>(n) * header.GetDataRecordLength()) + header.GetDataOffset();     
     
    228238 
    229239    m_point_reader->read(); 
    230     point = m_point_reader->GetPoint(); 
    231  
    232  
    233     return true; 
     240    const LASPoint& point = m_point_reader->GetPoint(); 
     241     
     242    return point; 
    234243} 
    235244 
  • src/lasreader.cpp

    r1561 r1568  
    5959LASReader::LASReader(std::istream& ifs) : 
    6060    m_pimpl(detail::ReaderFactory::Create(ifs)), 
     61    m_point(0), 
     62    m_empty_point(new LASPoint()), 
    6163    bCustomHeader(false) 
    6264{ 
     
    6668LASReader::LASReader(std::istream& ifs, LASHeader& header) : 
    6769    m_pimpl(detail::ReaderFactory::Create(ifs)), 
     70    m_point(0), 
     71    m_empty_point(new LASPoint()), 
    6872    bCustomHeader(false) 
     73 
    6974{ 
    7075    m_header = header; 
     
    7782    // empty, but required so we can implement PIMPL using 
    7883    // std::auto_ptr with incomplete type (Reader). 
     84    delete m_empty_point; 
    7985} 
    8086 
     
    8692LASPoint const& LASReader::GetPoint() const 
    8793{ 
    88     return m_point; 
     94    return *m_point; 
    8995} 
    9096 
    9197bool LASReader::ReadNextPoint() 
    9298{ 
    93     bool ret = m_pimpl->ReadNextPoint(m_point, m_header); 
    94     return ret; 
     99    try { 
     100        m_point = const_cast<LASPoint*>(&(m_pimpl->ReadNextPoint(m_header))); 
     101        return true; 
     102    } catch (std::out_of_range& e) { 
     103        m_point = 0; 
     104        return false; 
     105    } 
     106 
    95107} 
    96108 
    97109bool LASReader::ReadPointAt(std::size_t n) 
    98110{ 
    99     bool ret = m_pimpl->ReadPointAt(n, m_point, m_header); 
    100     return ret; 
     111    try { 
     112        m_point = const_cast<LASPoint*>(&(m_pimpl->ReadPointAt(n, m_header))); 
     113        return true; 
     114    } catch (std::out_of_range& e) { 
     115        m_point = 0; 
     116        return false; 
     117    } 
     118 
    101119} 
    102120 
     
    108126    } 
    109127 
    110     bool ret = m_pimpl->ReadPointAt(n, m_point, m_header); 
    111     if (!ret) 
     128    m_point = const_cast<LASPoint*>(&(m_pimpl->ReadPointAt(n, m_header))); 
     129    if (m_point == 0)  
    112130    { 
    113131        throw std::out_of_range("no point record at given position"); 
    114132    } 
    115133 
    116     return m_point; 
     134    return *m_point; 
    117135} 
    118136 
     
    124142    LASHeader custom_header(m_header); 
    125143 
    126     bool ret = m_pimpl->ReadHeader(m_header); 
    127     if (!ret) 
    128         throw std::runtime_error("public header block reading failure"); 
     144    m_header = m_pimpl->ReadHeader(); 
     145 
     146        // throw std::runtime_error("public header block reading failure"); 
    129147 
    130148    m_pimpl->Reset(m_header); 
     
    134152        m_header = custom_header; 
    135153    } 
     154     
     155    // This is yucky, but we need to ensure that we have a reference  
     156    // to a real point existing as soon as we are constructed.   
     157    // This is for someone who tries to GetPoint without first reading  
     158    // a point, and it will ensure they get something valid.  We just  
     159    // keep it around until the reader closes down and then deletes.   
     160    //  
     161    m_point = m_empty_point; 
    136162} 
    137163 
Note: See TracChangeset for help on using the changeset viewer.