33 #include "DGtal/base/Common.h"
34 #include "DGtal/base/Circulator.h"
38 using namespace DGtal;
49 template<
typename Iterator>
50 bool testOffset(
const Iterator& itb,
const Iterator& ite,
const vector<int>& groundTruth)
53 BOOST_CONCEPT_ASSERT(( boost::BidirectionalIterator<Iterator> ));
58 copy(itb,ite,ostream_iterator<int>(cout,
" "));
71 copy(v.begin(),v.end(),ostream_iterator<int>(cout,
" "));
75 copy(groundTruth.begin(),groundTruth.end(),ostream_iterator<int>(cout,
" "));
78 return equal( v.begin(),v.end(),groundTruth.begin() );
85 template<
typename Type1,
typename Type2>
87 testComparison(
const Type1& a,
const Type2& b) {
95 template<
typename Iterator>
96 bool testIsNotEmpty(
const Iterator& itb,
const Iterator& ite,
const bool& aFlagIsNotEmpty)
98 return (
isNotEmpty(itb,ite) == aFlagIsNotEmpty );
101 template<
typename IC>
103 bool getGeneralTag(
const IC& ){
104 cout << typeid( typename IteratorCirculatorTraits<IC>::Category() ).name() << endl;
108 template<
typename IC>
110 bool getSpecificTag(
const IC& ){
111 cout <<
typeid(
typename IC::iterator_category() ).name() << endl;
116 template<
typename IC >
119 cout <<
"IteratorType" << endl;
123 template<
typename IC >
126 cout <<
"CirculatorType" << endl;
130 template<
typename IC>
132 bool getType(
const IC& ic){
139 int main(
int argc,
char** argv )
143 for (
int i = 0; i < argc; ++i )
171 bool res = testOffset<vector<int>::iterator>(v.begin(),v.end(), v2)
172 && testOffset<vector<int>::reverse_iterator>(v.rbegin(),v.rend(), v3)
173 && testOffset<vector<int>::const_iterator>(v.begin(),v.end(), v2)
174 && testOffset<vector<int>::const_reverse_iterator>(v.rbegin(),v.rend(), v3);
179 trace.
info() <<
"(const / not const)" << endl;
184 && testComparison<
Circulator<vector<int>::iterator>,
Circulator<vector<int>::const_iterator> >(c1,c3);
186 trace.
info() <<
"(reverse_iterator<Circulator> / Circulator<reverse_iterator>)" << endl;
187 std::reverse_iterator<Circulator<vector<int>::iterator> > rc1( c1 );
189 res = res && testComparison<vector<int>::iterator,vector<int>::iterator>(rc1.base().base(), c4.base().base());
190 trace.
info() <<
"first element: (" << *--rc1 <<
" == " << *--c4 <<
")" << endl;
191 res = res && testComparison<int,int>(*rc1, *c4);
195 trace.
info() <<
"Tags for classic iterators" << endl;
196 getGeneralTag< vector<int>::iterator > ( v.begin() );
197 getSpecificTag< vector<int>::iterator > ( v.begin() );
198 getGeneralTag< Circulator<vector<int>::iterator> > ( c2 );
199 getSpecificTag< Circulator<vector<int>::iterator> > ( c2 );
200 getType< vector<int>::iterator > ( v.begin() );
201 getType< Circulator<vector<int>::iterator> > ( c2 );
205 trace.
info() <<
"Tags for pointers" << endl;
206 int t[5] = {1, 2, 3, 4, 5};
207 getGeneralTag< int* > ( t );
208 getType< int* > ( t );
211 trace.
info() << *tc++ << *tc++ << *tc++ << *tc++ << *tc++ << *tc++ << *tc++ << *tc++ << endl;
213 getSpecificTag< Circulator<int*> > ( tc );
214 getGeneralTag< Circulator<int*> > ( tc );
215 getType< Circulator<int*> > ( tc );
219 trace.
info() <<
"Function isNotEmpty" << endl;
220 res = res && testIsNotEmpty<vector<int>::iterator>(v.begin(),v.end(),
true)
221 && testIsNotEmpty<vector<int>::iterator>(v.end(),v.end(),
false);
225 res = res && testIsNotEmpty<Circulator<vector<int>::iterator> >(validC,validC,
true)
226 && testIsNotEmpty<
Circulator<vector<int>::iterator> >(validC,notValidC,
false)
227 && testIsNotEmpty<Circulator<vector<int>::iterator> >(validC,validC2,
true)
230 trace.
emphase() << ( res ?
"Passed." :
"Error." ) << endl;