39 #include "DGtal/base/Common.h"
40 #include "DGtal/kernel/SpaceND.h"
41 #include "DGtal/kernel/PointVector.h"
42 #include "DGtal/kernel/domains/HyperRectDomain.h"
43 #include "DGtal/base/CConstBidirectionalRange.h"
45 using namespace DGtal;
53 bool testSimpleHyperRectDomain()
57 typedef Space4Type::Point Point;
59 Space4Type::Integer t [] = { 1, 2, 3 , 4};
61 Space4Type::Integer t2[] = { 5, 5, 3 , 4};
73 trace.
info() <<
"Empty Domain: " << myEmptyDomain << std::endl;
77 trace.
info() << myHyperRectDomain << std::endl;
79 trace.
info() <<
"Domain Size= " << myHyperRectDomain.size() << std::endl;
87 trace.
info() <<
"Domain Size= " << myHyperRectDomainBis.size() << std::endl;
93 myHyperRectDomainTer = myHyperRectDomain;
95 trace.
info() <<
"Domain Size= " << myHyperRectDomainTer.
size() << std::endl;
98 return myHyperRectDomain.isValid();
105 typedef TSpace::Point Point;
113 trace.
info() << myHyperRectDomain << std::endl;
117 it != myHyperRectDomain.end(); ++it )
122 itend = myHyperRectDomain.rend(); it != itend; ++it )
125 trace.
emphase() <<
"Iterator 2d (permutation initializer list): ";
127 it = myHyperRectDomain.subRange( {1, 0} ).begin();
128 it != myHyperRectDomain.subRange( {1, 0} ).end(); ++it )
130 trace.
emphase() <<
"Reverse Iterator 2d (permutation initializer list): ";
132 it = myHyperRectDomain.subRange( {1, 0} ).rbegin(),
133 itend=myHyperRectDomain.subRange( {1, 0} ).rend(); it!=itend; ++it )
136 trace.
emphase() <<
"Iterator 2d (permutation+starting initializer list): ";
138 it = myHyperRectDomain.subRange( {1, 0} ).begin(c);
139 it != myHyperRectDomain.subRange( {1, 0} ).end(); ++it )
141 trace.
emphase() <<
"Reverse Iterator 2d (permutation+starting initializer list): ";
143 it = myHyperRectDomain.subRange( {1, 0} ).rbegin(c),
144 itend=myHyperRectDomain.subRange( {1, 0} ).rend(); it !=itend ; ++it )
147 trace.
emphase() <<
"Iterator 2d (span initializer list): ";
149 it = myHyperRectDomain.subRange( {1} ).begin();
150 it != myHyperRectDomain.subRange( {1} ).end(); ++it )
152 trace.
emphase() <<
"Reverse Iterator 2d (span initializer list): ";
154 it = myHyperRectDomain.subRange( {1} ).rbegin(),
155 itend=myHyperRectDomain.subRange( {1} ).rend(); it != itend; ++it )
158 trace.
emphase() <<
"Iterator 2d (span+starting initializer list): ";
160 it = myHyperRectDomain.subRange( {1} , c ).begin(c);
161 it != myHyperRectDomain.subRange( {1} , c ).end(); ++it )
163 trace.
emphase() <<
"Reverse Iterator 2d (span+starting initializer list): ";
165 it = myHyperRectDomain.subRange( {1} , c ).rbegin(c),
166 itend=myHyperRectDomain.subRange( {1} , c ).rend(); it !=itend; ++it )
171 typedef TSpace4D::Point Point4D;
173 TSpace4D::Integer t[] = {1, 1, 1, 1};
175 TSpace4D::Integer t2[] = {3, 3, 3, 3};
181 it = myHyperRectDomain4D.begin();
182 it != myHyperRectDomain4D.end(); ++it )
187 it = myHyperRectDomain4D.rbegin(),
188 itend=myHyperRectDomain4D.rend(); it != itend; ++it )
192 trace.
emphase() <<
"Iterator 4d by using order different from lexicographic initializer list: ";
194 it = myHyperRectDomain4D.subRange( {3, 2, 1, 0}).begin();
195 it != myHyperRectDomain4D.subRange( {3, 2, 1, 0}).end(); ++it )
198 trace.
emphase() <<
"Decreasing Iterator 4d by using order different from lexicographic initializer list: ";
200 it1 = myHyperRectDomain4D.subRange( {3, 2, 1, 0}).begin();
202 it2 = myHyperRectDomain4D.subRange( {3, 2, 1, 0}).end();
205 for ( ; it1 != it2; --it2 )
208 trace.
emphase() <<
"Iterator on a subset of 4d by using order different from lexicographic initializer list: ";
210 it3 = myHyperRectDomain4D.subRange( {1, 3}).begin();
211 it3 != myHyperRectDomain4D.subRange( {1, 3}).end(); ++it3 )
214 trace.
emphase() <<
"Decreasing iterator on a subset of 4d by using order different from lexicographic initializer list: ";
216 it4 = myHyperRectDomain4D.subRange({1, 3}).begin();
218 it5 = myHyperRectDomain4D.subRange({1, 3}).end();
221 for ( ; it4 != it5; --it5 )
224 return myHyperRectDomain.isValid();
228 bool testReverseIterator()
231 typedef TSpace4D::Point Point4D;
232 TSpace4D::Integer t[] = {1, 1, 1, 1};
234 TSpace4D::Integer t2[] = {3, 3, 3, 3};
245 it = myHyperRectDomain4D.begin();
246 for ( ; it != myHyperRectDomain4D.end(); ++it )
251 it2 = myHyperRectDomain4D.begin();
254 for ( ; it != it2; --it )
259 return myHyperRectDomain4D.isValid();
267 typedef TSpace4D::Point Point4D;
268 TSpace4D::Integer t[] = {1, 1, 1, 1};
270 TSpace4D::Integer t2[] = {3, 3, 3, 3};
278 std::copy ( myHyperRectDomain4D.begin(),
279 myHyperRectDomain4D.end(),
280 ostream_iterator<Point4D> (
trace.
info(),
" " ) );
285 return myHyperRectDomain4D.isValid();
288 bool testEmptyDomain()
291 typedef TSpace::Point TPoint;
295 unsigned int nbok = 0;
299 const TDomain nonempty_domain( TPoint::diagonal(0), TPoint::diagonal(0) );
300 ++nb; nbok += nonempty_domain.isEmpty() ? 0 : 1;
301 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Creating non-empty domain & checking isEmpty." << std::endl;
303 const TDomain default_domain;
304 ++nb; nbok += default_domain.isEmpty() ? 1 : 0;
305 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Creating default empty domain & checking isEmpty." << std::endl;
307 const TDomain domain( TPoint::diagonal(1), TPoint::diagonal(0) );
308 ++nb; nbok += domain.
isEmpty() ? 1 : 0;
309 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Creating default custom domain & checking isEmpty." << std::endl;
311 ++nb; nbok += domain.
size() == 0 ? 1 : 0;
312 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Empty domain has size = " << domain.
size() << std::endl;
314 ++nb; nbok += domain.
begin() == domain.
end() ? 1 : 0;
315 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that begin() == end()" << std::endl;
317 ++nb; nbok += domain.
rbegin() == domain.
rend() ? 1 : 0;
318 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that rbegin() == rend()" << std::endl;
321 ++nb; nbok += range.begin() == range.end() ? 1 : 0;
322 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that begin() == end() for sub-range {0,1,2}" << std::endl;
324 ++nb; nbok += range.rbegin() == range.rend() ? 1 : 0;
325 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that rbegin() == rend() for sub-range {0,1,2}" << std::endl;
328 ++nb; nbok += range.begin() == range.end() ? 1 : 0;
329 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that begin() == end() for sub-range {2,1,0}" << std::endl;
331 ++nb; nbok += range.rbegin() == range.rend() ? 1 : 0;
332 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that rbegin() == rend() for sub-range {2,1,0}" << std::endl;
335 ++nb; nbok += range.begin() == range.end() ? 1 : 0;
336 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that begin() == end() for sub-range {0,2}" << std::endl;
338 ++nb; nbok += range.rbegin() == range.rend() ? 1 : 0;
339 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that rbegin() == rend() for sub-range {0,2}" << std::endl;
342 ++nb; nbok += range.begin() == range.end() ? 1 : 0;
343 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that begin() == end() for sub-range {2,0}" << std::endl;
345 ++nb; nbok += range.rbegin() == range.rend() ? 1 : 0;
346 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that rbegin() == rend() for sub-range {2,0}" << std::endl;
349 ++nb; nbok += range.begin() == range.end() ? 1 : 0;
350 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that begin() == end() for sub-range {1}" << std::endl;
352 ++nb; nbok += range.rbegin() == range.rend() ? 1 : 0;
353 trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Checking that rbegin() == rend() for sub-rang {1}" << std::endl;
362 if ( testSimpleHyperRectDomain() && testIterator() && testReverseIterator() && testSTLCompat() && testEmptyDomain() )
void beginBlock(const std::string &keyword="")
Aim: Defines the concept describing a bidirectional const range.
const ConstIterator & begin() const
const ConstIterator & end() const
ConstReverseIterator rbegin() const
Aim: SpaceND is a utility class that defines the fundamental structure of a Digital Space in ND...
Aim: Parallelepidec region of a digital space, model of a 'CDomain'.
ConstReverseIterator rend() const
Aim: This concept represents a digital domain, i.e. a non mutable subset of points of the given digit...
ConstSubRange subRange(const std::vector< Dimension > &permutation) const
DGtal is the top-level namespace which contains all DGtal functions and types.
const Point & lowerBound() const