Changeset 1568:3e2973e11579
- Timestamp:
- 02/11/10 19:37:25 (6 months ago)
- Branch:
- default
- Files:
-
- 4 edited
-
include/liblas/detail/reader/reader.hpp (modified) (4 diffs)
-
include/liblas/lasreader.hpp (modified) (4 diffs)
-
src/detail/reader/reader.cpp (modified) (10 diffs)
-
src/lasreader.cpp (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
include/liblas/detail/reader/reader.hpp
r1561 r1568 45 45 #include <liblas/detail/fwd.hpp> 46 46 #include <liblas/detail/reader/point.hpp> 47 #include <liblas/detail/reader/header.hpp> 48 #include <liblas/lasreader.hpp> 47 49 48 50 // std … … 58 60 namespace liblas { namespace detail { 59 61 60 class ReaderImpl 62 class ReaderImpl : public ReaderI 61 63 { 62 64 public: … … 65 67 ~ReaderImpl(); 66 68 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); 70 72 71 73 std::istream& GetStream() const; … … 97 99 98 100 detail::reader::Point* m_point_reader; 101 detail::reader::Header* m_header_reader; 99 102 100 103 }; -
include/liblas/lasreader.hpp
r1567 r1568 60 60 namespace liblas { 61 61 62 class ReaderI; 63 62 64 /// Defines public interface to LAS reader implementation. 63 65 class LASReader … … 70 72 LASReader(std::istream& ifs); 71 73 74 LASReader(ReaderI* reader); 75 72 76 /// User-defined consructor initializes reader with input stream and 73 77 /// a header to override the values in the file … … 141 145 const std::auto_ptr<detail::ReaderImpl> m_pimpl; 142 146 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; 145 150 146 151 // Set if the user provides a header to override the header as … … 155 160 public: 156 161 157 virtual ~ReaderI() {} 158 159 virtual LASHeader& ReadHeader(const LASHeader& header) const = 0; 162 virtual LASHeader const& ReadHeader() = 0; 160 163 virtual LASPoint const& ReadNextPoint(const LASHeader& header) = 0; 161 164 virtual LASPoint const& ReadPointAt(std::size_t n, const LASHeader& header) = 0; 162 165 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() {}; 166 171 }; 172 167 173 } // namespace liblas 168 174 -
src/detail/reader/reader.cpp
r1561 r1568 41 41 42 42 #include <liblas/detail/reader/reader.hpp> 43 #include <liblas/detail/reader/header.hpp>44 #include <liblas/detail/reader/vlr.hpp>45 43 46 44 #include <liblas/detail/utility.hpp> … … 63 61 ReaderImpl::ReaderImpl(std::istream& ifs) : 64 62 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 66 66 { 67 67 } … … 86 86 87 87 delete m_point_reader; 88 delete m_header_reader; 88 89 } 89 90 … … 106 107 if (m_point_reader == 0) { 107 108 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); 109 110 } else { 110 m_point_reader = new detail::reader::Point(m_ifs, header);111 m_point_reader = new reader::Point(m_ifs, header); 111 112 } 112 113 } … … 122 123 delete m_point_reader; 123 124 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); 125 126 } 126 127 } … … 180 181 181 182 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(); 183 LASHeader const& ReaderImpl::ReadHeader() 184 { 185 m_header_reader->read(); 186 const LASHeader& header = m_header_reader->GetHeader(); 190 187 191 188 Reset(header); … … 195 192 m_in_srs = header.GetSRS(); 196 193 197 return true;198 } 199 200 bool ReaderImpl::ReadNextPoint(LASPoint& point,const LASHeader& header)194 return header; 195 } 196 197 LASPoint const& ReaderImpl::ReadNextPoint(const LASHeader& header) 201 198 { 202 199 if (0 == m_current) … … 204 201 m_ifs.clear(); 205 202 m_ifs.seekg(header.GetDataOffset(), std::ios::beg); 203 206 204 } 207 205 … … 209 207 { 210 208 m_point_reader->read(); 211 point = m_point_reader->GetPoint();209 const LASPoint& point = m_point_reader->GetPoint(); 212 210 ++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 222 LASPoint 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 } 223 233 224 234 std::streamsize pos = (static_cast<std::streamsize>(n) * header.GetDataRecordLength()) + header.GetDataOffset(); … … 228 238 229 239 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; 234 243 } 235 244 -
src/lasreader.cpp
r1561 r1568 59 59 LASReader::LASReader(std::istream& ifs) : 60 60 m_pimpl(detail::ReaderFactory::Create(ifs)), 61 m_point(0), 62 m_empty_point(new LASPoint()), 61 63 bCustomHeader(false) 62 64 { … … 66 68 LASReader::LASReader(std::istream& ifs, LASHeader& header) : 67 69 m_pimpl(detail::ReaderFactory::Create(ifs)), 70 m_point(0), 71 m_empty_point(new LASPoint()), 68 72 bCustomHeader(false) 73 69 74 { 70 75 m_header = header; … … 77 82 // empty, but required so we can implement PIMPL using 78 83 // std::auto_ptr with incomplete type (Reader). 84 delete m_empty_point; 79 85 } 80 86 … … 86 92 LASPoint const& LASReader::GetPoint() const 87 93 { 88 return m_point;94 return *m_point; 89 95 } 90 96 91 97 bool LASReader::ReadNextPoint() 92 98 { 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 95 107 } 96 108 97 109 bool LASReader::ReadPointAt(std::size_t n) 98 110 { 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 101 119 } 102 120 … … 108 126 } 109 127 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) 112 130 { 113 131 throw std::out_of_range("no point record at given position"); 114 132 } 115 133 116 return m_point;134 return *m_point; 117 135 } 118 136 … … 124 142 LASHeader custom_header(m_header); 125 143 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"); 129 147 130 148 m_pimpl->Reset(m_header); … … 134 152 m_header = custom_header; 135 153 } 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; 136 162 } 137 163
Note: See TracChangeset
for help on using the changeset viewer.
