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/cstdint.hpp>
9
#include <liblas/iterator.hpp>
10
#include <liblas/laspoint.hpp>
11
#include <liblas/lasreader.hpp>
12
#include <liblas/detail/utility.hpp>
13
#include <tut/tut.hpp>
18
#include "liblas_test.hpp"
20
using namespace liblas;
24
struct lasreader_iterator_data
30
lasreader_iterator_data() :
31
file10_(g_test_data_path + "//TO_core_last_clip.las"),
32
ifs_(file10_.c_str(), std::ios::in | std::ios::binary),
37
typedef test_group<lasreader_iterator_data> tg;
38
typedef tg::object to;
40
tg test_group_lasreader_iterator("liblas::lasreader_iterator");
42
// Test default constructor
47
lasreader_iterator it;
50
// Test user-defined constructor
55
lasreader_iterator it(reader_);
58
// Test copy constructor with default initialized iterator
63
lasreader_iterator it1;
64
lasreader_iterator it2(it1);
69
// Test copy constructor with initialized iterator
74
lasreader_iterator it1(reader_);
75
lasreader_iterator it2(it1);
80
// Test assignment operator with default initialized iterator
85
lasreader_iterator it1;
86
lasreader_iterator it2;
92
// Test assignment operator with initialized iterator
97
lasreader_iterator it1(reader_);
98
lasreader_iterator it2;
104
// Test dereference operator
109
lasreader_iterator it(reader_);
111
test_file10_point1(*it);
114
// Test pointer-to-member operator
119
lasreader_iterator it(reader_);
121
// test 1st point data record
122
ensure_distance(it->GetX(), double(630262.30), 0.0001);
123
ensure_distance(it->GetY(), double(4834500), 0.0001);
124
ensure_distance(it->GetZ(), double(51.53), 0.0001);
125
ensure_equals(it->GetIntensity(), 670);
126
ensure_equals(it->GetClassification(), liblas::uint8_t(1));
127
ensure_equals(it->GetScanAngleRank(), 0);
128
ensure_equals(it->GetUserData(), 3);
129
ensure_equals(it->GetScanFlags(), 9);
130
ensure_distance(it->GetTime(), double(413665.23360000004), 0.0001);
133
// Test pre-increment operator
138
lasreader_iterator it(reader_); // move to 1st point
139
++it; // move to 2nd record
141
test_file10_point2(*it);
144
// Test post-increment operator
149
lasreader_iterator it(reader_); // move to 1st point
150
it++; // move to 2nd record
152
test_file10_point2(*it);
155
// Test equal-to operator
160
lasreader_iterator it(reader_); // move to 1st point
161
lasreader_iterator end;
163
ensure_not(end == it);
166
// Test not-equal-to operator
171
lasreader_iterator it(reader_); // move to 1st point
172
lasreader_iterator end;
182
liblas::uint32_t const cnt = reader_.GetHeader().GetPointRecordsCount();
183
lasreader_iterator it(reader_); // move to 1st point
184
lasreader_iterator end;
186
liblas::uint32_t s = 0;
193
ensure_equals(cnt, s);
196
// Test std::distance operation
201
liblas::uint32_t const cnt = reader_.GetHeader().GetPointRecordsCount();
202
lasreader_iterator it(reader_); // move to 1st point
203
lasreader_iterator end;
205
lasreader_iterator::difference_type const d = std::distance(it, end);
206
ensure_equals(d, cnt);
209
// Test std::distance operation
214
std::size_t a = std::distance(lasreader_iterator(reader_), lasreader_iterator());
216
// Reader state is set to "past-the-end-of-file"
217
// So, reset is needed
220
std::size_t b = std::distance(lasreader_iterator(reader_), lasreader_iterator());
225
// Test std::advance operation
230
lasreader_iterator it(reader_); // move to 1st point
232
std::advance(it, 1); // move to 2nd record
233
test_file10_point2(*it);
235
std::advance(it, 2); // move to 4th record
236
test_file10_point4(*it);
239
// Test std::copy algorithm
244
liblas::uint32_t const size = reader_.GetHeader().GetPointRecordsCount();
245
lasreader_iterator it(reader_);
246
lasreader_iterator end;
248
typedef std::list<LASPoint> list_t;
249
typedef std::back_insert_iterator<list_t> inserter_t;
252
// Test copying LAS records to std::list based cache
253
std::copy(it, end, inserter_t(cache));
254
ensure_equals(cache.size(), size);
257
list_t::const_iterator cit = cache.begin(); // 1st element
258
std::advance(cit, 1); // move to 2nd element in cache
259
test_file10_point2(*cit);
260
std::advance(cit, 2); // move to 4th element in cache
261
test_file10_point4(*cit);
264
// Test std::count algorithm
269
// Construct copy of 2nd point record from tested file
271
pt.SetCoordinates(630282.45, 4834500, 51.63);
272
pt.SetIntensity(350);
273
pt.SetClassification(1);
274
pt.SetScanAngleRank(0);
277
pt.SetTime(413665.52880000003);
278
ensure(pt.IsValid());
279
test_file10_point2(pt);
281
lasreader_iterator it(reader_);
282
lasreader_iterator end;
284
// Count records equal to given point object
285
lasreader_iterator::difference_type const expected = 1;
286
lasreader_iterator::difference_type n = std::count(it, end, pt);
287
ensure_equals(n, expected);
290
// Test std::equal algorithm
295
std::ifstream ifs(file10_.c_str(), std::ios::in | std::ios::binary);
296
LASReader reader(ifs);
298
// Copy LAS records to std::list based cache
299
typedef std::list<LASPoint> list_t;
300
typedef std::back_insert_iterator<list_t> inserter_t;
303
lasreader_iterator it(reader);
304
lasreader_iterator end;
307
std::copy(it, end, inserter_t(cache));
308
ensure_equals(cache.size(), reader.GetHeader().GetPointRecordsCount());
311
// Reset reader to the beginning of LAS file
314
// Compare LAS file with cache
316
lasreader_iterator it(reader);
317
lasreader_iterator end;
320
bool eq = std::equal(it, end, cache.begin());
325
// Test std::find algorithm
330
// Construct copy of 2nd point record from tested file
332
pt.SetCoordinates(630282.45, 4834500, 51.63);
333
pt.SetIntensity(350);
334
pt.SetClassification(1);
335
pt.SetScanAngleRank(0);
338
pt.SetTime(413665.52880000003);
339
ensure(pt.IsValid());
340
test_file10_point2(pt);
342
lasreader_iterator it(reader_);
343
lasreader_iterator end;
345
// find 2nd point data record
346
lasreader_iterator fit;
347
fit = std::find(it, end, pt);
349
test_file10_point2(*fit);
352
// Test std::find_if algorithm
357
lasreader_iterator it(reader_);
358
lasreader_iterator end;
360
// find 2nd point data record comparing XY coordinates
361
lasreader_iterator fit;
362
fit = std::find_if(it, end, is_xy(630282.45, 4834500, 0.0001));
364
test_file10_point2(*fit);
367
// Test std::for_each algorithm
372
lasreader_iterator it(reader_);
373
lasreader_iterator end;
375
typedef liblas::detail::Point<double> point_t;
376
typedef liblas::detail::Extents<double> bbox_t;
378
LASHeader const& h = reader_.GetHeader();
379
bbox_t lasbbox(point_t(h.GetMinX(), h.GetMinY(), h.GetMinZ()),
380
point_t(h.GetMaxX(), h.GetMaxY(), h.GetMaxZ()));
382
// Accumulate points extents to common bounding box
384
std::for_each(it, end, bbox_calculator(bbox));
386
ensure(lasbbox == bbox);