#ifndef WCL_Iterator_HH #define WCL_Iterator_HH #include namespace WCL { //##################################################################################################################### template struct Get_Ptr { static T& get( I const i) { assert(*i); return **i; } static bool skip(I const i) { return *i==0; } }; template struct Get_First_Ptr { static T& get( I const i) { assert(i->first); return *i->first; } static bool skip(I const i) { return i->first==0; } }; template struct Get_Second_Ptr { static T& get( I const i) { assert(i->second); return *i->second; } static bool skip(I const i) { return i->second==0; } }; template struct Get_First { static T const& get( I const i) { return i->first; } static bool skip(I const i) { return false; } }; template struct Get_Second { static T const& get( I const i) { return i->second; } static bool skip(I const i) { return false; } }; //##################################################################################################################### template class Get_> //Get must have // static T& get( I const& i); class Iterator { // Typedefs ------------------------------------------------------------------ private:typedef Get_ Get; typedef Iterator Self; public: typedef std::forward_iterator_tag iterator_category; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef T* pointer; typedef T& reference; // Constructors -------------------------------------------------------------- public: explicit Iterator(I i) : myRef(i) {} Iterator() : myRef(I()) {} template class G2> Iterator(Iterator const& i) : myRef(i.ref()) {} // Node ---------------------------------------------------------------------- public:I myRef; public: I const& ref() const { return myRef; } // Operators ----------------------------------------------------------------- public: T& operator* () const { return Get::get(myRef); } T* operator->() const { return &Get::get(myRef); } Self& operator++() { ++myRef; return *this; } Self operator++(int) { Self tmp=*this; ++myRef; return tmp; } }; template class G1, class T2, class I2, template class G2> inline bool operator==(Iterator const&i1,Iterator const&i2){ return i1.ref()==i2.ref(); } template class G1, class T2, class I2, template class G2> inline bool operator!=(Iterator const&i1,Iterator const&i2){ return !(i1.ref()==i2.ref()); } #define ITERATOR_BASE_IMPL(Impl,E,Get) \ typedef WCL::Iterator const_iterator; \ typedef WCL::Iterator iterator; \ typedef WCL::Iterator const_reverse_iterator; \ typedef WCL::Iterator reverse_iterator; \ const_iterator begin() const { return const_iterator(Impl::begin()); } \ iterator begin() { return iterator(Impl::begin()); } \ const_iterator end() const { return const_iterator(Impl::end ()); } \ iterator end() { return iterator(Impl::end ()); } \ const_reverse_iterator rbegin() const { return const_reverse_iterator(Impl::rbegin()); } \ reverse_iterator rbegin() { return reverse_iterator(Impl::rbegin()); } \ const_reverse_iterator rend() const { return const_reverse_iterator(Impl::rend ()); } \ reverse_iterator rend() { return reverse_iterator(Impl::rend ()); } #define CONST_ITERATOR_BASE_IMPL(Impl,E,Get) \ typedef WCL::Iterator const_iterator; \ typedef WCL::Iterator const_reverse_iterator; \ const_iterator begin() const { return const_iterator(Impl::begin()); } \ const_iterator end() const { return const_iterator(Impl::end ()); } \ const_reverse_iterator rbegin() const { return const_reverse_iterator(Impl::rbegin()); } \ const_reverse_iterator rend() const { return const_reverse_iterator(Impl::rend ()); } #define ITERATOR_BASE(Impl) \ typedef Impl::const_iterator const_iterator; \ typedef Impl:: iterator iterator; \ typedef Impl::const_reverse_iterator const_reverse_iterator; \ typedef Impl:: reverse_iterator reverse_iterator; \ using Impl::begin; \ using Impl::end; \ using Impl::rbegin; \ using Impl::rend; #define CONST_ITERATOR_BASE(Impl) \ typedef Impl::const_iterator const_iterator; \ typedef Impl::const_reverse_iterator const_reverse_iterator; \ const_iterator begin() const { return Impl::begin(); } \ const_iterator end() const { return Impl::end (); } \ const_reverse_iterator rbegin() const { return Impl::rbegin(); } \ const_reverse_iterator rend() const { return Impl::rend (); } #define TEMPLATE_ITERATOR_BASE_IMPL(Impl,E,Get) \ typedef typename WCL::Iterator const_iterator; \ typedef typename WCL::Iterator iterator; \ typedef typename WCL::Iterator const_reverse_iterator; \ typedef typename WCL::Iterator reverse_iterator; \ const_iterator begin() const { return const_iterator(Impl::begin()); } \ iterator begin() { return iterator(Impl::begin()); } \ const_iterator end() const { return const_iterator(Impl::end ()); } \ iterator end() { return iterator(Impl::end ()); } \ const_reverse_iterator rbegin() const { return const_reverse_iterator(Impl::rbegin()); } \ reverse_iterator rbegin() { return reverse_iterator(Impl::rbegin()); } \ const_reverse_iterator rend() const { return const_reverse_iterator(Impl::rend ()); } \ reverse_iterator rend() { return reverse_iterator(Impl::rend ()); } #define TEMPLATE_CONST_ITERATOR_BASE_IMPL(Impl,E,Get) \ typedef typename WCL::Iterator const_iterator; \ typedef typename WCL::Iterator const_reverse_iterator; \ const_iterator begin() const { return const_iterator(Impl::begin()); } \ const_iterator end() const { return const_iterator(Impl::end ()); } \ const_reverse_iterator rbegin() const { return const_reverse_iterator(Impl::rbegin()); } \ const_reverse_iterator rend() const { return const_reverse_iterator(Impl::rend ()); } #define TEMPLATE_ITERATOR_BASE(Impl) \ typedef typename Impl::const_iterator const_iterator; \ typedef typename Impl:: iterator iterator; \ typedef typename Impl::const_reverse_iterator const_reverse_iterator; \ typedef typename Impl:: reverse_iterator reverse_iterator; \ using Impl::begin; \ using Impl::end; \ using Impl::rbegin; \ using Impl::rend; #define TEMPLATE_CONST_ITERATOR_BASE(Impl) \ typedef typename Impl::const_iterator const_iterator; \ typedef typename Impl::const_reverse_iterator const_reverse_iterator; \ const_iterator begin() const { return Impl::begin(); } \ const_iterator end() const { return Impl::end (); } \ const_reverse_iterator rbegin() const { return Impl::rbegin(); } \ const_reverse_iterator rend() const { return Impl::rend (); } //##################################################################################################################### template class Get_> //Get must have // static T& get( I const& i); // static bool skip(I const& i); class FilterIterator { // Typedefs ------------------------------------------------------------------ private:typedef Get_ Get; typedef FilterIterator Self; public: typedef std::forward_iterator_tag iterator_category; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef T* pointer; typedef T& reference; // Constructors -------------------------------------------------------------- public: explicit FilterIterator(I i,I i_end) : myRef(i), myEnd(i_end) { skip(); } template class G2> FilterIterator(FilterIterator const& i) : myRef(i.ref()), myEnd(i.ref_end()) {} // Node ---------------------------------------------------------------------- public: I myRef; public: I const myEnd; public: I const& ref() const { return myRef; } public: I const& ref_end() const { return myEnd; } // Operators ----------------------------------------------------------------- public: T& operator* () const { return Get::get(myRef); } T* operator->() const { return &Get::get(myRef); } Self& operator++() { ++myRef; skip(); return *this; } Self operator++(int) { Self tmp=*this; ++(*this); return tmp; } private:void skip() { while(Get::skip(myRef)&&myRef!=myEnd) ++myRef; } }; template class G1, class T2, class I2, template class G2> inline bool operator==(FilterIterator const&i1,FilterIterator const&i2){ return i1.ref()==i2.ref(); } template class G1, class T2, class I2, template class G2> inline bool operator!=(FilterIterator const&i1,FilterIterator const&i2){ return !(i1.ref()==i2.ref()); } #define FILTER_ITERATOR_BASE_IMPL(Impl,E,Get) \ typedef WCL::FilterIterator const_iterator; \ typedef WCL::FilterIterator iterator; \ typedef WCL::FilterIterator const_reverse_iterator; \ typedef WCL::FilterIterator reverse_iterator; \ const_iterator begin() const { return const_iterator(Impl::begin(),Impl::end()); } \ iterator begin() { return iterator(Impl::begin(),Impl::end()); } \ const_iterator end() const { return const_iterator(Impl::end (),Impl::end()); } \ iterator end() { return iterator(Impl::end (),Impl::end()); } \ const_reverse_iterator rbegin() const { return const_reverse_iterator(Impl::rbegin(),Impl::rend()); } \ reverse_iterator rbegin() { return reverse_iterator(Impl::rbegin(),Impl::rend()); } \ const_reverse_iterator rend() const { return const_reverse_iterator(Impl::rend (),Impl::rend()); } \ reverse_iterator rend() { return reverse_iterator(Impl::rend (),Impl::rend()); } #define CONST_FILTER_ITERATOR_BASE_IMPL(Impl,E,Get) \ typedef WCL::FilterIterator const_iterator; \ typedef WCL::FilterIterator const_reverse_iterator; \ const_iterator begin() const { return const_iterator(Impl::begin(),Impl::end()); } \ const_iterator end() const { return const_iterator(Impl::end (),Impl::end()); } \ const_reverse_iterator rbegin() const { return const_reverse_iterator(Impl::rbegin(),Impl::rend()); } \ const_reverse_iterator rend() const { return const_reverse_iterator(Impl::rend (),Impl::rend()); } //##################################################################################################################### template struct ObjectFilter { ObjectFilter() : myRefs(0) {} virtual ~ObjectFilter() { assert(myRefs==0); } virtual T& get( I const i) const =0; virtual bool valid(I const i) const =0; ObjectFilter* share() { ++myRefs; return this; } void free() { if(--myRefs==0) delete this; } private:ObjectFilter(ObjectFilter const&); // none void operator=(ObjectFilter const&);// none private:size_t myRefs; }; // Call skip after constructor template class ObjectFilterIterator { // Typedefs ------------------------------------------------------------------ private:typedef ObjectFilterIterator Self; public: typedef std::forward_iterator_tag iterator_category; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef T* pointer; typedef T& reference; typedef ObjectFilter Filter; // Constructors -------------------------------------------------------------- protected:explicit ObjectFilterIterator(Filter* f, I i,I i_end) : myFilter(f), myRef(i), myEnd(i_end) { skip(); } template ObjectFilterIterator(ObjectFilterIterator const& i) : myFilter(i.myFilter->share()), myRef(i.ref()), myEnd(i.ref_end()) {} public: virtual ~ObjectFilterIterator() { myFilter->free(); } // Node ---------------------------------------------------------------------- public: Filter* myFilter; public: I myRef; public: I const myEnd; public: I const& ref() const { return myRef; } public: I const& ref_end() const { return myEnd; } // Operators ----------------------------------------------------------------- public: T& operator* () const { return myFilter->get(myRef); } T* operator->() const { return &myFilter->get(myRef); } Self& operator++() { ++myRef; skip(); return *this; } Self operator++(int) { Self tmp=*this; ++(*this); return tmp; } bool isEnd() const { return myRef==myEnd; } public: void skip() { while(myRef!=myEnd&&!myFilter->valid(myRef)) ++myRef; } }; template inline bool operator==(ObjectFilterIterator const&i1,ObjectFilterIterator const&i2){ return i1.ref()==i2.ref(); } template inline bool operator!=(ObjectFilterIterator const&i1,ObjectFilterIterator const&i2){ return !(i1.ref()==i2.ref()); } } #endif