git-svn-id: https://clonekeenplus.svn.sourceforge.net/svnroot/clonekeenplus/cgenius/trunk@87 4df4b0f3-56ce-47cb-b001-ed939b7d65a6
129 lines
4.6 KiB
C++
129 lines
4.6 KiB
C++
/*
|
|
OpenLieroX
|
|
|
|
general iterator interface
|
|
|
|
created by Albert Zeyer on 27-05-2008
|
|
code under LGPL
|
|
*/
|
|
|
|
#ifndef __OLX_ITERATOR_H__
|
|
#define __OLX_ITERATOR_H__
|
|
|
|
#include <set>
|
|
#include <map>
|
|
#include <vector>
|
|
#include <list>
|
|
#include <string>
|
|
#include "Ref.h"
|
|
|
|
|
|
template < typename _Obj >
|
|
class Iterator {
|
|
public:
|
|
virtual ~Iterator() {}
|
|
virtual Iterator* copy() const = 0;
|
|
virtual bool isValid() = 0;
|
|
virtual void next() = 0;
|
|
virtual bool operator==(const Iterator& other) const = 0;
|
|
bool operator!=(const Iterator& other) const { return ! ((*this) == other); }
|
|
virtual _Obj get() = 0; // this has to return a valid obj if valid == true
|
|
//_Obj* operator->() { return &get(); }
|
|
|
|
typedef ::Ref< Iterator > Ref;
|
|
};
|
|
|
|
template<typename _STLT, typename _T>
|
|
class STLIteratorBase : public Iterator<_T> {
|
|
protected:
|
|
typename _STLT::iterator i;
|
|
_STLT& obj;
|
|
public:
|
|
STLIteratorBase(_STLT& o) : i(o.begin()), obj(o) {}
|
|
STLIteratorBase(const STLIteratorBase& it) : i(it.i), obj(it.obj) {}
|
|
virtual bool isValid() { return i != obj.end(); }
|
|
virtual void next() { ++i; }
|
|
virtual bool operator==(const Iterator<_T>& other) const { const STLIteratorBase* ot = dynamic_cast< const STLIteratorBase* > (&other); return ot && &ot->obj == &obj && ot->i == i; }
|
|
};
|
|
|
|
|
|
template<typename _STLT, typename _T>
|
|
class STLIterator : public STLIteratorBase<_STLT, _T> {
|
|
public:
|
|
STLIterator(_STLT& o) : STLIteratorBase<_STLT, _T>(o) {}
|
|
STLIterator(const STLIterator& it) : STLIteratorBase<_STLT, _T>(it) {}
|
|
virtual Iterator<_T>* copy() const { return new STLIterator(*this); }
|
|
virtual bool operator==(const Iterator<_T>& other) const { const STLIterator* ot = dynamic_cast< const STLIterator* > (&other); return ot != NULL && STLIteratorBase<_STLT, _T> :: operator == ( other ); }
|
|
virtual _T get() { return * STLIteratorBase<_STLT, _T> :: i; }
|
|
};
|
|
|
|
template<typename _STLT, typename _T>
|
|
class STL_MapIterator : public STLIteratorBase<_STLT, _T> {
|
|
public:
|
|
STL_MapIterator(_STLT& o) : STLIteratorBase<_STLT, _T> (o) {}
|
|
STL_MapIterator(const STL_MapIterator& it) : STLIteratorBase<_STLT, _T> (it) {}
|
|
virtual Iterator<_T>* copy() const { return new STL_MapIterator(*this); }
|
|
virtual bool operator==(const Iterator<_T>& other) const { const STL_MapIterator* ot = dynamic_cast< const STL_MapIterator* > (&other); return ot != NULL && STLIteratorBase<_STLT, _T> :: operator == ( other ); }
|
|
virtual _T get() { return STLIteratorBase<_STLT, _T> :: i -> second; }
|
|
};
|
|
|
|
template<typename _T>
|
|
struct CArray {
|
|
_T* array;
|
|
unsigned long len;
|
|
CArray(_T* a, unsigned long l) : array(a), len(l) {}
|
|
};
|
|
|
|
template<typename _T>
|
|
CArray<_T> Array(_T* a, unsigned long l) { return CArray<_T>(a,l); }
|
|
|
|
template<typename _T>
|
|
class CArrayIterator : public Iterator<_T*> {
|
|
private:
|
|
unsigned long i, len;
|
|
_T* array;
|
|
public:
|
|
CArrayIterator(const CArray<_T>& a) : i(0), len(a.len), array(a.array) {}
|
|
CArrayIterator(const CArrayIterator& it) : i(it.i), array(it.array) {}
|
|
virtual Iterator<_T*>* copy() const { return new CArrayIterator(*this); }
|
|
virtual bool isValid() { return i < len; }
|
|
virtual void next() { ++i; }
|
|
virtual bool operator==(const Iterator<_T*>& other) const { const CArrayIterator* ot = dynamic_cast< const CArrayIterator* > (&other); return ot && ot->array == array && ot->i == i; }
|
|
virtual _T* get() { return &array[i]; }
|
|
};
|
|
|
|
template< typename __T, typename __C >
|
|
typename Iterator<__T>::Ref GetIterator(__C& s) { return s.iterator(); }
|
|
|
|
template< typename _T >
|
|
typename Iterator<_T>::Ref GetIterator(std::set<_T>& s) { return new STLIterator<std::set<_T>,_T>(s); }
|
|
|
|
template< typename _T >
|
|
typename Iterator<_T&>::Ref GetIterator(std::list<_T>& s) { return new STLIterator<std::list<_T>,_T&>(s); }
|
|
|
|
template< typename _T >
|
|
typename Iterator<_T&>::Ref GetIterator(std::vector<_T>& s) { return new STLIterator<std::vector<_T>,_T&>(s); }
|
|
|
|
template< typename _T, typename _KT >
|
|
typename Iterator<_T&>::Ref GetIterator(std::map<_KT, _T>& s) { return new STL_MapIterator<std::map< _KT, _T >, _T& >(s); }
|
|
|
|
inline
|
|
Iterator<char&>::Ref GetIterator(std::string& s) { return new STLIterator<std::string,char&>(s); }
|
|
|
|
inline
|
|
Iterator<char>::Ref GetConstIterator(std::string& s) { return new STLIterator<std::string,char>(s); }
|
|
|
|
template< typename _T >
|
|
typename Iterator<_T const&>::Ref GetConstIterator(std::vector<_T>& s) { return new STLIterator<std::vector<_T>,_T const&>(s); }
|
|
|
|
//template< typename _I, typename _T >
|
|
//typename Iterator< std::pair<_I,_T> >::Ref GetIterator(std::map<_I,_T>& s) { return s.begin(); }
|
|
|
|
template< typename _T >
|
|
typename Iterator<_T*>::Ref GetIterator(const CArray<_T>& s) { return new CArrayIterator<_T>(s); }
|
|
|
|
|
|
#define foreach( t, el, s ) for( Iterator<t>::Ref el = GetIterator(s); el->isValid(); el->next() )
|
|
|
|
#endif
|