27 #include "DGtalCatch.h"
29 #include <DGtal/kernel/SpaceND.h>
30 #include <DGtal/kernel/domains/HyperRectDomain.h>
31 #include <DGtal/kernel/domains/Linearizer.h>
32 #include <DGtal/images/ImageContainerBySTLVector.h>
37 TEST_CASE(
"Testing SimpleRandomAccess(Const)RangeFromPoint from ImageContainerBySTLVector",
"" )
39 using namespace DGtal;
50 const Domain domain( Point(1,2), Point(6,5) );
51 const Point aPoint(3,4);
55 Image refImage(domain);
58 const double hour = 4.29;
62 image.setValue(*it, cnt*hour);
66 SECTION(
"Testing constant forward iterators" )
68 const Range range = image.range();
69 REQUIRE( static_cast<Domain::Size>(range.
end() - range.
begin()) == domain.
size() );
70 REQUIRE( std::equal(range.
begin(), range.
end(), refImage.begin()) );
72 ConstRange crange = image.constRange();
73 REQUIRE( static_cast<Domain::Size>(crange.
end() - crange.
begin()) == domain.
size() );
74 REQUIRE( std::equal(crange.
begin(), crange.
end(), refImage.begin()) );
77 SECTION(
"Testing constant forward iterators from a point" )
79 const Range range = image.range();
80 REQUIRE( static_cast<Domain::Size>(range.
end() - range.
begin(aPoint)) == domain.
size() - Linearizer::getIndex(aPoint, domain) );
81 REQUIRE( std::equal( range.
begin(aPoint), range.
end(), refImage.begin() + Linearizer::getIndex(aPoint, domain) ) );
83 ConstRange crange = image.constRange();
84 REQUIRE( static_cast<Domain::Size>(crange.
end() - crange.
begin(aPoint)) == domain.
size() - Linearizer::getIndex(aPoint, domain) );
85 REQUIRE( std::equal( crange.
begin(aPoint), crange.
end(), refImage.begin() + Linearizer::getIndex(aPoint, domain) ) );
88 SECTION(
"Testing mutable forward iterators" )
90 Range range = image.range();
91 REQUIRE( static_cast<Domain::Size>(range.
end() - range.
begin()) == domain.
size() );
102 refImage.
setValue( *it, refImage(*it)+cnt );
106 REQUIRE( std::equal(range.
begin(), range.
end(), refImage.begin()) );
109 SECTION(
"Testing mutable forward iterators from a point" )
111 Range range = image.range();
112 REQUIRE( static_cast<Domain::Size>(range.
end() - range.
begin(aPoint)) == domain.
size() - Linearizer::getIndex(aPoint, domain) );
123 refImage.
setValue( *it, refImage(*it)+cnt );
127 REQUIRE( std::equal(range.
begin(), range.
end(), refImage.begin()) );
130 SECTION(
"Testing constant reverse iterators" )
132 const Range range = image.range();
133 REQUIRE( static_cast<Domain::Size>(range.
rend() - range.
rbegin()) == domain.
size() );
134 REQUIRE( std::equal(range.
rbegin(), range.
rend(), refImage.rbegin()) );
136 ConstRange crange = image.constRange();
137 REQUIRE( static_cast<Domain::Size>(crange.
rend() - crange.
rbegin()) == domain.
size() );
138 REQUIRE( std::equal(crange.
rbegin(), crange.
rend(), refImage.rbegin()) );
141 SECTION(
"Testing constant reverse iterators from a point" )
143 const Range range = image.range();
144 REQUIRE( static_cast<Domain::Size>(range.
rend() - range.
rbegin(aPoint)) == Linearizer::getIndex(aPoint, domain) + 1 );
145 REQUIRE( std::equal( range.
rbegin(aPoint), range.
rend(), refImage.rbegin() + (domain.
size() - Linearizer::getIndex(aPoint, domain) - 1) ) );
147 ConstRange crange = image.constRange();
148 REQUIRE( static_cast<Domain::Size>(crange.rend() - crange.rbegin(aPoint)) == Linearizer::getIndex(aPoint, domain) + 1 );
149 REQUIRE( std::equal( crange.rbegin(aPoint), crange.rend(), refImage.rbegin() + (domain.
size() - Linearizer::getIndex(aPoint, domain) - 1) ) );
152 SECTION(
"Testing mutable reverse iterators" )
154 Range range = image.range();
155 REQUIRE( static_cast<Domain::Size>(range.
rend() - range.
rbegin()) == domain.
size() );
166 refImage.
setValue( *it, refImage(*it)+cnt );
170 REQUIRE( std::equal(range.
rbegin(), range.
rend(), refImage.rbegin()) );
173 SECTION(
"Testing mutable reverse iterators from a point" )
175 Range range = image.range();
176 REQUIRE( static_cast<Domain::Size>(range.
rend() - range.
rbegin(aPoint)) == Linearizer::getIndex(aPoint, domain) + 1 );
188 refImage.
setValue( *it, refImage(*it)+cnt );
192 REQUIRE( std::equal(range.
rbegin(), range.
rend(), refImage.rbegin()) );
195 SECTION(
"Testing forward output iterators" )
197 Range range = image.range();
202 refImage.
setValue( *it, refImage(*it)+cnt );
206 std::copy( refImage.begin(), refImage.end(), range.
outputIterator() );
208 REQUIRE( std::equal(range.
begin(), range.
end(), refImage.begin()) );
211 SECTION(
"Testing forward output iterators from a point" )
213 Range range = image.range();
218 refImage.
setValue( *it, refImage(*it)+cnt );
222 std::copy( refImage.begin() + Linearizer::getIndex(aPoint, domain), refImage.end(), range.
outputIterator(aPoint) );
224 REQUIRE( std::equal(range.
begin(), range.
end(), refImage.begin()) );
227 SECTION(
"Testing reverse output iterators" )
229 Range range = image.range();
234 refImage.
setValue( *it, refImage(*it)+cnt );
238 std::copy( refImage.rbegin(), refImage.rend(), range.
routputIterator() );
240 REQUIRE( std::equal(range.
rbegin(), range.
rend(), refImage.rbegin()) );
243 SECTION(
"Testing reverse output iterators from a point" )
245 Range range = image.range();
250 refImage.
setValue( *it, refImage(*it)+cnt );
254 std::copy( refImage.rbegin() + (domain.
size() - Linearizer::getIndex(aPoint, domain) - 1), refImage.rend(), range.
routputIterator(aPoint) );
256 REQUIRE( std::equal(range.
rbegin(), range.
rend(), refImage.rbegin()) );
259 SECTION(
"Testing constant forward circulators" )
269 const Range range = image.range();
277 REQUIRE( sum == Approx(refSum) );
278 REQUIRE( std::equal( refImage.begin(), refImage.end(), range.
c() ) );
288 REQUIRE( sum == Approx(refSum) );
291 ConstRange crange = image.constRange();
299 REQUIRE( sum == Approx(refSum) );
300 REQUIRE( std::equal( refImage.begin(), refImage.end(), crange.
c() ) );
310 REQUIRE( sum == Approx(refSum) );
313 SECTION(
"Testing constant reverse circulators" )
323 const Range range = image.range();
331 REQUIRE( sum == Approx(refSum) );
332 REQUIRE( std::equal( refImage.rbegin(), refImage.rend(), range.
rc() ) );
342 REQUIRE( sum == Approx(refSum) );
345 ConstRange crange = image.constRange();
353 REQUIRE( sum == Approx(refSum) );
354 REQUIRE( std::equal( refImage.rbegin(), refImage.rend(), crange.
rc() ) );
364 REQUIRE( sum == Approx(refSum) );
367 SECTION(
"Testing mutable circulators in forward way" )
369 Range range = image.range();
380 refImage.
setValue( *it, refImage(*it) + 2*cnt + domain.
size());
384 REQUIRE( std::equal( range.
begin(), range.
end(), refImage.begin() ) );
387 SECTION(
"Testing mutable circulators in backward way" )
389 Range range = image.range();
400 refImage.
setValue( *it, refImage(*it) + 2*cnt + domain.
size());
404 REQUIRE( std::equal( range.
begin(), range.
end(), refImage.begin() ) );
407 SECTION(
"Testing mutable reverse circulators in forward way" )
409 Range range = image.range();
420 refImage.
setValue( *it, refImage(*it) + 2*cnt + domain.
size());
424 REQUIRE( std::equal( range.
begin(), range.
end(), refImage.begin() ) );
427 SECTION(
"Testing mutable reverse circulators in backward way" )
429 Range range = image.range();
440 refImage.
setValue( *it, refImage(*it) + 2*cnt + domain.
size());
444 REQUIRE( std::equal( range.
begin(), range.
end(), refImage.begin() ) );
const ConstIterator & begin() const
ReverseOutputIterator routputIterator()
Aim: implements association bewteen points lying in a digital domain and values.
const ConstIterator & end() const
ConstReverseIterator rbegin() const
OutputIterator outputIterator()
Aim: SpaceND is a utility class that defines the fundamental structure of a Digital Space in ND...
ConstCirculator c() const
std::reverse_iterator< Circulator > ReverseCirculator
ConstReverseIterator rbegin() const
ConstReverseIterator rend() const
void setValue(const Point &aPoint, const Value &aValue)
Aim: model of CBidirectionalRangeFromPoint that adapts any range of elements bounded by two iterators...
bool isInside(const Point &p) const
std::reverse_iterator< Iterator > ReverseIterator
ConstReverseIterator rend() const
Aim: model of CConstBidirectionalRangeFromPoint that adapts any range of elements bounded by two iter...
ConstIterator begin() const
ConstIterator end() const
Aim: Linearization and de-linearization interface for domains.
Aim: Provides an adapter for classical iterators that can iterate through the underlying data structu...
DGtal is the top-level namespace which contains all DGtal functions and types.
ConstReverseCirculator rc() const
std::vector< Value >::const_iterator ConstIterator
std::reverse_iterator< ConstCirculator > ConstReverseCirculator