3
// (C) Copyright Mateusz Loskot 2008, mateusz@loskot.net
4
// Distributed under the BSD License
5
// (See accompanying file LICENSE.txt or copy at
6
// http://www.opensource.org/licenses/bsd-license.php)
8
#include <liblas/liblas.hpp>
9
#include <liblas/detail/private_utility.hpp>
10
#include <tut/tut.hpp>
15
#include "liblas_test.hpp"
17
using namespace liblas;
21
struct lasreader_iterator_data
27
lasreader_iterator_data() :
28
file10_(g_test_data_path + "//TO_core_last_clip.las"),
29
ifs_(file10_.c_str(), std::ios::in | std::ios::binary),
34
typedef test_group<lasreader_iterator_data> tg;
35
typedef tg::object to;
37
tg test_group_lasreader_iterator("liblas::lasreader_iterator");
39
// Test default constructor
44
lasreader_iterator it;
47
// Test user-defined constructor
52
lasreader_iterator it(reader_);
55
// Test copy constructor with default initialized iterator
60
lasreader_iterator it1;
61
lasreader_iterator it2(it1);
66
// Test copy constructor with initialized iterator
71
lasreader_iterator it1(reader_);
72
lasreader_iterator it2(it1);
77
// Test assignment operator with default initialized iterator
82
lasreader_iterator it1;
83
lasreader_iterator it2;
89
// Test assignment operator with initialized iterator
94
lasreader_iterator it1(reader_);
95
lasreader_iterator it2;
101
// Test dereference operator
106
lasreader_iterator it(reader_);
108
test_file10_point1(*it);
111
// Test pointer-to-member operator
116
lasreader_iterator it(reader_);
118
// test 1st point data record
119
ensure_distance(it->GetX(), double(630262.30), 0.0001);
120
ensure_distance(it->GetY(), double(4834500), 0.0001);
121
ensure_distance(it->GetZ(), double(51.53), 0.0001);
122
ensure_equals(it->GetIntensity(), 670);
123
ensure_equals(it->GetScanAngleRank(), 0);
124
ensure_equals(it->GetUserData(), 3);
125
ensure_equals(it->GetScanFlags(), 9);
126
ensure_distance(it->GetTime(), double(413665.23360000004), 0.0001);
128
liblas::Classification c(1);
129
ensure_equals(it->GetClassification(), c);
132
// Test pre-increment operator
137
lasreader_iterator it(reader_); // move to 1st point
138
++it; // move to 2nd record
140
test_file10_point2(*it);
143
// Test post-increment operator
148
lasreader_iterator it(reader_); // move to 1st point
149
it++; // move to 2nd record
151
test_file10_point2(*it);
154
// Test equal-to operator
159
lasreader_iterator it(reader_); // move to 1st point
160
lasreader_iterator end;
162
ensure_not(end == it);
165
// Test not-equal-to operator
170
lasreader_iterator it(reader_); // move to 1st point
171
lasreader_iterator end;
181
boost::uint32_t const cnt = reader_.GetHeader().GetPointRecordsCount();
182
lasreader_iterator it(reader_); // move to 1st point
183
lasreader_iterator end;
185
boost::uint32_t s = 0;
192
ensure_equals(cnt, s);
195
// Test std::distance operation
200
boost::uint32_t const cnt = reader_.GetHeader().GetPointRecordsCount();
201
lasreader_iterator it(reader_); // move to 1st point
202
lasreader_iterator end;
204
typedef lasreader_iterator::difference_type difference_type;
205
difference_type const d = std::distance(it, end);
206
ensure_equals(d, static_cast<difference_type>(cnt));
209
// Test std::distance operation
214
typedef lasreader_iterator::difference_type difference_type;
216
difference_type a = std::distance(lasreader_iterator(reader_), lasreader_iterator());
218
// Reader state is set to "past-the-end-of-file"
219
// So, reset is needed
222
difference_type b = std::distance(lasreader_iterator(reader_), lasreader_iterator());
227
// Test std::advance operation
232
lasreader_iterator it(reader_); // move to 1st point
234
std::advance(it, 1); // move to 2nd record
235
test_file10_point2(*it);
237
std::advance(it, 2); // move to 4th record
238
test_file10_point4(*it);
241
// Test std::copy algorithm
246
boost::uint32_t const size = reader_.GetHeader().GetPointRecordsCount();
247
lasreader_iterator it(reader_);
248
lasreader_iterator end;
250
typedef std::list<Point> list_t;
251
typedef std::back_insert_iterator<list_t> inserter_t;
254
// Test copying LAS records to std::list based cache
255
std::copy(it, end, inserter_t(cache));
256
ensure_equals(cache.size(), size);
259
list_t::const_iterator cit = cache.begin(); // 1st element
260
std::advance(cit, 1); // move to 2nd element in cache
261
test_file10_point2(*cit);
262
std::advance(cit, 2); // move to 4th element in cache
263
test_file10_point4(*cit);
266
// Test std::count algorithm
271
// Construct copy of 2nd point record from tested file
274
h.SetScale(0.01, 0.01, 0.01);
276
pt.SetCoordinates(630282.45, 4834500, 51.63);
277
pt.SetIntensity(350);
278
pt.SetClassification(1);
279
pt.SetScanAngleRank(0);
282
pt.SetTime(413665.52880000003);
283
ensure(pt.IsValid());
284
test_file10_point2(pt);
286
lasreader_iterator it(reader_);
287
lasreader_iterator end;
289
// Count records equal to given point object
290
typedef lasreader_iterator::difference_type difference_type;
291
difference_type const expected = 1;
292
difference_type n = std::count(it, end, pt);
293
ensure_equals(n, expected);
296
// Test std::equal algorithm
301
std::ifstream ifs(file10_.c_str(), std::ios::in | std::ios::binary);
304
// Copy LAS records to std::list based cache
305
typedef std::list<Point> list_t;
306
typedef std::back_insert_iterator<list_t> inserter_t;
309
lasreader_iterator it(reader);
310
lasreader_iterator end;
313
std::copy(it, end, inserter_t(cache));
314
ensure_equals(cache.size(), reader.GetHeader().GetPointRecordsCount());
317
// Reset reader to the beginning of LAS file
320
// Compare LAS file with cache
322
lasreader_iterator it(reader);
323
lasreader_iterator end;
326
bool eq = std::equal(it, end, cache.begin());
331
// Test std::find algorithm
336
// Construct copy of 2nd point record from tested file
339
h.SetScale(0.01, 0.01, 0.01);
341
pt.SetCoordinates(630282.45, 4834500, 51.63);
342
pt.SetIntensity(350);
343
pt.SetClassification(1);
344
pt.SetScanAngleRank(0);
347
pt.SetTime(413665.52880000003);
348
ensure(pt.IsValid());
349
test_file10_point2(pt);
351
lasreader_iterator it(reader_);
352
lasreader_iterator end;
354
// find 2nd point data record
355
lasreader_iterator fit;
356
fit = std::find(it, end, pt);
358
test_file10_point2(*fit);
361
// Test std::find_if algorithm
366
lasreader_iterator it(reader_);
367
lasreader_iterator end;
369
// find 2nd point data record comparing XY coordinates
370
lasreader_iterator fit;
371
fit = std::find_if(it, end, is_xy(630282.45, 4834500, 0.0001));
373
test_file10_point2(*fit);
376
// Test std::for_each algorithm
381
lasreader_iterator it(reader_);
382
lasreader_iterator end;
384
typedef liblas::detail::Point<double> point_t;
385
typedef liblas::Bounds<double> bbox_t;
387
Header const& h = reader_.GetHeader();
388
bbox_t lasbbox = h.GetExtent();
390
// Accumulate points extents to common bounding box
392
std::for_each(it, end, bbox_calculator(accumulated));
394
ensure(lasbbox == accumulated);