DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
testHyperRectDomain.cpp
1 
33 #include <cstdio>
34 #include <cmath>
35 #include <iostream>
36 #include <fstream>
37 #include <algorithm>
38 
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"
44 
45 using namespace DGtal;
46 using namespace std;
47 
48 
53 bool testSimpleHyperRectDomain()
54 {
55 
56  typedef SpaceND<4> Space4Type;
57  typedef Space4Type::Point Point;
58 
59  DGtal::int32_t t [] = { 1, 2, 3 , 4};
60  Point a ( t );
61  DGtal::int32_t t2[] = { 5, 5, 3 , 4};
62  Point b ( t2 );
63 
64  trace.beginBlock ( "HyperRectDomain init" );
65  // Checking that HyperRectDomain is a model of CDomain.
66  typedef HyperRectDomain<Space4Type> HRDomain4;
67  BOOST_CONCEPT_ASSERT(( CDomain< HRDomain4 > ));
68  BOOST_CONCEPT_ASSERT(( CConstBidirectionalRange<HRDomain4> ));
69 
71  HyperRectDomain<Space4Type> myEmptyDomain;
72  trace.info() << "Empty Domain: " << myEmptyDomain << std::endl;
73 
75  HyperRectDomain<Space4Type> myHyperRectDomain ( a, b );
76  trace.info() << myHyperRectDomain << std::endl;
77 
78  trace.info() << "Domain Size= " << myHyperRectDomain.size() << std::endl;
79 
80 
81  trace.endBlock();
82 
83 
84  trace.beginBlock("Test Copy Constructor");
85  HyperRectDomain<Space4Type> myHyperRectDomainBis( myHyperRectDomain );
86  trace.info() << "Domain Size= " << myHyperRectDomainBis.size() << std::endl;
87  trace.endBlock();
88 
89  trace.beginBlock("Test Assignement");
90  HyperRectDomain<Space4Type> myHyperRectDomainTer;
91 
92  myHyperRectDomainTer = myHyperRectDomain;
93 
94  trace.info() << "Domain Size= " << myHyperRectDomainTer.size() << std::endl;
95  trace.endBlock();
96 
97  return myHyperRectDomain.isValid();
98 
99 }
100 
101 bool testIterator()
102 {
103  typedef SpaceND<2> TSpace;
104  typedef TSpace::Point Point;
105  Point a ( 1, 1);
106  Point b ( 5, 5);
107  Point c (2, 2);
108 
109  trace.beginBlock ( "HyperRectDomain Iterator" );
110  HyperRectDomain<TSpace> myHyperRectDomain ( a, b );
111 
112  trace.info() << myHyperRectDomain << std::endl;
113 
114  trace.emphase() << "Iterator 2d: ";
115  for ( HyperRectDomain<TSpace>::ConstIterator it = myHyperRectDomain.begin();
116  it != myHyperRectDomain.end(); ++it )
117  trace.warning() << ( *it ) << std::endl;
118 
119  trace.emphase() << "Reverse Iterator 2d: ";
120  for ( HyperRectDomain<TSpace>::ConstReverseIterator it = myHyperRectDomain.rbegin(),
121  itend = myHyperRectDomain.rend(); it != itend; ++it )
122  trace.warning() << ( *it ) << std::endl;
123 
124 #ifdef CPP11_INITIALIZER_LIST
125  trace.emphase() << "Iterator 2d (permutation initializer list): ";
127  it = myHyperRectDomain.subRange( {1, 0} ).begin();
128  it != myHyperRectDomain.subRange( {1, 0} ).end(); ++it )
129  trace.warning() << ( *it ) << std::endl;
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 )
134  trace.warning() << ( *it ) << std::endl;
135 
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 )
140  trace.warning() << ( *it ) << std::endl;
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 )
145  trace.warning() << ( *it ) << std::endl;
146 
147  trace.emphase() << "Iterator 2d (span initializer list): ";
149  it = myHyperRectDomain.subRange( {1} ).begin();
150  it != myHyperRectDomain.subRange( {1} ).end(); ++it )
151  trace.warning() << ( *it ) << std::endl;
152  trace.emphase() << "Reverse Iterator 2d (span initializer list): ";
154  it = myHyperRectDomain.subRange( {1} ).rbegin(),
155  itend=myHyperRectDomain.subRange( {1} ).rend(); it != itend; ++it )
156  trace.warning() << ( *it ) << std::endl;
157 
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 )
162  trace.warning() << ( *it ) << std::endl;
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 )
167  trace.warning() << ( *it ) << std::endl;
168 #endif
169 
170  trace.emphase() << "Iterator 4d: ";
171  typedef SpaceND<4> TSpace4D;
172  typedef TSpace4D::Point Point4D;
173 
174  DGtal::int32_t t[] = {1, 1, 1, 1};
175  Point4D a4D ( t );
176  DGtal::int32_t t2[] = {3, 3, 3, 3};
177  Point4D b4D ( t2 );
178 
179  HyperRectDomain<TSpace4D> myHyperRectDomain4D ( a4D, b4D );
180  trace.emphase() << myHyperRectDomain4D << std::endl;
182  it = myHyperRectDomain4D.begin();
183  it != myHyperRectDomain4D.end(); ++it )
184  trace.info() << ( *it ) << std::endl;
185 
186  trace.emphase() << "Reverse Iterator 4d: ";
188  it = myHyperRectDomain4D.rbegin(),
189  itend=myHyperRectDomain4D.rend(); it != itend; ++it )
190  trace.info() << ( *it ) << std::endl;
191 
192 
193 #ifdef CPP11_INITIALIZER_LIST
194  trace.emphase() << "Iterator 4d by using order different from lexicographic initializer list: ";
196  it = myHyperRectDomain4D.subRange( {3, 2, 1, 0}).begin();
197  it != myHyperRectDomain4D.subRange( {3, 2, 1, 0}).end(); ++it )
198  trace.info() << ( *it ) << std::endl;
199 
200  trace.emphase() << "Decreasing Iterator 4d by using order different from lexicographic initializer list: ";
202  it1 = myHyperRectDomain4D.subRange( {3, 2, 1, 0}).begin();
204  it2 = myHyperRectDomain4D.subRange( {3, 2, 1, 0}).end();
205  --it1;
206  --it2;
207  for ( ; it1 != it2; --it2 )
208  trace.info() << ( *it2 ) << std::endl;
209 
210  trace.emphase() << "Iterator on a subset of 4d by using order different from lexicographic initializer list: ";
212  it3 = myHyperRectDomain4D.subRange( {1, 3}).begin();
213  it3 != myHyperRectDomain4D.subRange( {1, 3}).end(); ++it3 )
214  trace.info() << ( *it3 ) << std::endl;
215 
216  trace.emphase() << "Decreasing iterator on a subset of 4d by using order different from lexicographic initializer list: ";
218  it4 = myHyperRectDomain4D.subRange({1, 3}).begin();
220  it5 = myHyperRectDomain4D.subRange({1, 3}).end();
221  --it4;
222  --it5;
223  for ( ; it4 != it5; --it5 )
224  trace.info() << ( *it5 ) << std::endl;
225 #endif
226 
227  return myHyperRectDomain.isValid();
228 }
229 
230 
231 bool testReverseIterator()
232 {
233  typedef SpaceND<4> TSpace4D;
234  typedef TSpace4D::Point Point4D;
235  DGtal::int32_t t[] = {1, 1, 1, 1};
236  Point4D a4D (t);
237  DGtal::int32_t t2[] = {3, 3, 3, 3};
238  Point4D b4D (t2);
239 
240  trace.beginBlock ( "Test reverse iterator" );
241 
242  HyperRectDomain<TSpace4D> myHyperRectDomain4D ( a4D, b4D );
243  trace.emphase() << myHyperRectDomain4D << std::endl;
244 
245  trace.emphase() << "Increasing order: ";
246 
248  it = myHyperRectDomain4D.begin();
249  for ( ; it != myHyperRectDomain4D.end(); ++it )
250  trace.info() << ( *it ) << std::endl;
251 
252  trace.emphase() << "Now decreasing order: ";
254  it2 = myHyperRectDomain4D.begin();
255  --it;
256  --it2;
257  for ( ; it != it2; --it )
258  trace.info() << ( *it ) << std::endl;
259 
260  trace.endBlock();
261 
262  return myHyperRectDomain4D.isValid();
263 }
264 
265 
266 
267 bool testSTLCompat()
268 {
269  typedef SpaceND<4> TSpace4D;
270  typedef TSpace4D::Point Point4D;
271  DGtal::int32_t t[] = {1, 1, 1, 1};
272  Point4D a4D (t);
273  DGtal::int32_t t2[] = {3, 3, 3, 3};
274  Point4D b4D (t2);
275 
276  trace.beginBlock ( "TestSTL Compatibility" );
277 
278  HyperRectDomain<TSpace4D> myHyperRectDomain4D ( a4D, b4D );
279  trace.emphase() << myHyperRectDomain4D << std::endl;
280 
281  std::copy ( myHyperRectDomain4D.begin(),
282  myHyperRectDomain4D.end(),
283  ostream_iterator<Point4D> ( trace.info(), " " ) );
284 
285  trace.info() << std::endl;
286  trace.endBlock();
287 
288  return myHyperRectDomain4D.isValid();
289 }
290 
291 
292 int main()
293 {
294  if ( testSimpleHyperRectDomain() && testIterator() && testReverseIterator() && testSTLCompat() )
295  return 0;
296  else
297  return 1;
298 }
299