#pragma once #include #define _ITER_COMPARE(op) friend bool operator op(const VSetIterator &lhs, const VSetIterator &rhs) \ { return lhs.pVal op rhs.pVal; }; namespace BWAPI { /// The iterator class template allows the iteration /// of elements of a Vectorset with ease while /// maintaining the compatibility with any familiar /// STL container iteration. /// /// @see Vectorset template class VSetIterator : public std::iterator { public: typedef std::iterator host_type; typedef typename host_type::pointer pointer; typedef typename host_type::difference_type difference_type; typedef typename host_type::reference reference; // constructors VSetIterator(pointer ptr = nullptr) : pVal(ptr) {}; VSetIterator(const VSetIterator &other) : pVal(&other) {}; // Copy assignment VSetIterator &operator =(const VSetIterator &other) { this->pVal = other.pVal; return *this; }; // comparison operators _ITER_COMPARE(==); _ITER_COMPARE(!=); _ITER_COMPARE(<); _ITER_COMPARE(>); _ITER_COMPARE(<=); _ITER_COMPARE(>=); // modification operators VSetIterator &operator ++() { ++pVal; return *this; }; VSetIterator operator ++(int) { VSetIterator copy(*this); ++pVal; return copy; }; VSetIterator &operator --() { --pVal; return *this; }; VSetIterator operator --(int) { VSetIterator copy(*this); --pVal; return copy; }; VSetIterator operator +(const difference_type &n) const { return VSetIterator(this->pVal + n); }; VSetIterator operator -(const difference_type &n) const { return VSetIterator(this->pVal - n); }; friend difference_type operator -(const VSetIterator &lhs, const VSetIterator &rhs) { return lhs.pVal - rhs.pVal; }; VSetIterator &operator +=(const difference_type &n) { this->pVal += n; return *this; }; VSetIterator &operator -=(const difference_type &n) { this->pVal -= n; return *this; }; // Dereference operators reference operator *() const { return *pVal; }; // @TODO: should be "pointer" and "return pVal", need specialization reference operator ->() const { return *pVal; }; reference operator [](const difference_type &n) const { return this->pVal[n]; }; // @TODO: remove T *operator &() const { return pVal; }; protected: pointer pVal; }; }