📄 iterator.hpp
字号:
derived_iterator_type tmp (static_cast<const derived_iterator_type &> (it));
return tmp -= n;
}
#endif
#ifdef BOOST_MSVC_STD_ITERATOR
// Renamed this class from reverse_iterator to get
// typedef reverse_iterator<...> reverse_iterator
// working. Thanks to Gabriel Dos Reis for explaining this.
template <class I, class T, class R>
class reverse_iterator_base:
public std::reverse_bidirectional_iterator<I, T, R> {
public:
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef I iterator_type;
typedef T value_type;
typedef R reference;
typedef typename I::container_type container_type;
// Construction and destruction
BOOST_UBLAS_INLINE
reverse_iterator_base ():
std::reverse_bidirectional_iterator<iterator_type, value_type, reference> () {}
BOOST_UBLAS_INLINE
reverse_iterator_base (const iterator_type &it):
std::reverse_bidirectional_iterator<iterator_type, value_type, reference> (it) {}
// Arithmetic
BOOST_UBLAS_INLINE
reverse_iterator_base &operator += (difference_type n) {
// Comeau recommends...
return *this = this->base () - n;
}
BOOST_UBLAS_INLINE
reverse_iterator_base &operator -= (difference_type n) {
// Comeau recommends...
return *this = this->base () + n;
}
BOOST_UBLAS_INLINE
const container_type &operator () () const {
// Comeau recommends...
return this->base () ();
}
BOOST_UBLAS_INLINE
size_type index () const {
// Comeau recommends...
iterator_type tmp (this->base ());
return (-- tmp).index ();
}
// Comparison
BOOST_UBLAS_INLINE
bool operator < (const reverse_iterator_base &it) const {
return ! (this->base () < it.base ());
}
BOOST_UBLAS_INLINE
bool operator <= (const reverse_iterator_base &it) const {
return ! (this->base () <= it.base ());
}
BOOST_UBLAS_INLINE
bool operator >= (const reverse_iterator_base &it) const {
return ! (this->base () >= it.base ());
}
BOOST_UBLAS_INLINE
bool operator > (const reverse_iterator_base &it) const {
return ! (this->base () > it.base ());
}
};
template<class I, class T, class R>
BOOST_UBLAS_INLINE
reverse_iterator_base<I, T, R> operator + (const reverse_iterator_base<I, T, R> &it, std::ptrdiff_t n) {
reverse_iterator_base<I, T, R> tmp (it);
return tmp += n;
}
template<class I, class T, class R>
BOOST_UBLAS_INLINE
reverse_iterator_base<I, T, R> operator + (std::ptrdiff_t n, const reverse_iterator_base<I, T, R> &it) {
reverse_iterator_base<I, T, R> tmp (it);
return tmp += n;
}
template<class I, class T, class R>
BOOST_UBLAS_INLINE
reverse_iterator_base<I, T, R> operator - (const reverse_iterator_base<I, T, R> &it, std::ptrdiff_t n) {
reverse_iterator_base<I, T, R> tmp (it);
return tmp -= n;
}
template<class I, class T, class R>
BOOST_UBLAS_INLINE
std::ptrdiff_t operator - (const reverse_iterator_base<I, T, R> &it1, const reverse_iterator_base<I, T, R> &it2) {
return it2.base () - it1.base ();
}
// Renamed this class from reverse_iterator1 to get
// typedef reverse_iterator1<...> reverse_iterator1
// working. Thanks to Gabriel Dos Reis for explaining this.
template <class I, class T, class R>
class reverse_iterator_base1:
public std::reverse_bidirectional_iterator<I, T, R> {
public:
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef I iterator_type;
typedef T value_type;
typedef R reference;
typedef typename I::container_type container_type;
typedef typename I::dual_iterator_type dual_iterator_type;
typedef typename I::dual_reverse_iterator_type dual_reverse_iterator_type;
// Construction and destruction
BOOST_UBLAS_INLINE
reverse_iterator_base1 ():
std::reverse_bidirectional_iterator<iterator_type, value_type, reference> () {}
BOOST_UBLAS_INLINE
reverse_iterator_base1 (const iterator_type &it):
std::reverse_bidirectional_iterator<iterator_type, value_type, reference> (it) {}
// Arithmetic
BOOST_UBLAS_INLINE
reverse_iterator_base1 &operator += (difference_type n) {
// Comeau recommends...
return *this = this->base () - n;
}
BOOST_UBLAS_INLINE
reverse_iterator_base1 &operator -= (difference_type n) {
// Comeau recommends...
return *this = this->base () + n;
}
BOOST_UBLAS_INLINE
const container_type &operator () () const {
// Comeau recommends...
return this->base () ();
}
BOOST_UBLAS_INLINE
size_type index1 () const {
// Comeau recommends...
iterator_type tmp (this->base ());
return (-- tmp).index1 ();
}
BOOST_UBLAS_INLINE
size_type index2 () const {
// Comeau recommends...
iterator_type tmp (this->base ());
return (-- tmp).index2 ();
}
BOOST_UBLAS_INLINE
dual_iterator_type begin () const {
// Comeau recommends...
iterator_type tmp (this->base ());
return (-- tmp).begin ();
}
BOOST_UBLAS_INLINE
dual_iterator_type end () const {
// Comeau recommends...
iterator_type tmp (this->base ());
return (-- tmp).end ();
}
BOOST_UBLAS_INLINE
dual_reverse_iterator_type rbegin () const {
return dual_reverse_iterator_type (end ());
}
BOOST_UBLAS_INLINE
dual_reverse_iterator_type rend () const {
return dual_reverse_iterator_type (begin ());
}
// Comparison
BOOST_UBLAS_INLINE
bool operator < (const reverse_iterator_base1 &it) const {
return ! (this->base () < it.base ());
}
BOOST_UBLAS_INLINE
bool operator <= (const reverse_iterator_base1 &it) const {
return ! (this->base () <= it.base ());
}
BOOST_UBLAS_INLINE
bool operator >= (const reverse_iterator_base1 &it) const {
return ! (this->base () >= it.base ());
}
BOOST_UBLAS_INLINE
bool operator > (const reverse_iterator_base1 &it) const {
return ! (this->base () > it.base ());
}
};
template<class I, class T, class R>
BOOST_UBLAS_INLINE
reverse_iterator_base1<I, T, R> operator + (const reverse_iterator_base1<I, T, R> &it, std::ptrdiff_t n) {
reverse_iterator_base1<I, T, R> tmp (it);
return tmp += n;
}
template<class I, class T, class R>
BOOST_UBLAS_INLINE
reverse_iterator_base1<I, T, R> operator + (std::ptrdiff_t n, const reverse_iterator_base1<I, T, R> &it) {
reverse_iterator_base1<I, T, R> tmp (it);
return tmp += n;
}
template<class I, class T, class R>
BOOST_UBLAS_INLINE
reverse_iterator_base1<I, T, R> operator - (const reverse_iterator_base1<I, T, R> &it, std::ptrdiff_t n) {
reverse_iterator_base1<I, T, R> tmp (it);
return tmp -= n;
}
template<class I, class T, class R>
BOOST_UBLAS_INLINE
std::ptrdiff_t operator - (const reverse_iterator_base1<I, T, R> &it1, const reverse_iterator_base1<I, T, R> &it2) {
return it2.base () - it1.base ();
}
// Renamed this class from reverse_iterator2 to get
// typedef reverse_iterator2<...> reverse_iterator2
// working. Thanks to Gabriel Dos Reis for explaining this.
template <class I, class T, class R>
class reverse_iterator_base2:
public std::reverse_bidirectional_iterator<I, T, R> {
public:
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef I iterator_type;
typedef T value_type;
typedef R reference;
typedef typename I::container_type container_type;
typedef typename I::dual_iterator_type dual_iterator_type;
typedef typename I::dual_reverse_iterator_type dual_reverse_iterator_type;
// Construction and destruction
BOOST_UBLAS_INLINE
reverse_iterator_base2 ():
std::reverse_bidirectional_iterator<iterator_type, value_type, reference> () {}
BOOST_UBLAS_INLINE
reverse_iterator_base2 (const iterator_type &it):
std::reverse_bidirectional_iterator<iterator_type, value_type, reference> (it) {}
// Arithmetic
BOOST_UBLAS_INLINE
reverse_iterator_base2 &operator += (difference_type n) {
// Comeau recommends...
return *this = this->base () - n;
}
BOOST_UBLAS_INLINE
reverse_iterator_base2 &operator -= (difference_type n) {
// Comeau recommends...
return *this = this->base () + n;
}
BOOST_UBLAS_INLINE
const container_type &operator () () const {
// Comeau recommends...
return this->base () ();
}
BOOST_UBLAS_INLINE
size_type index1 () const {
// Comeau recommends...
iterator_type tmp (this->base ());
return (-- tmp).index1 ();
}
BOOST_UBLAS_INLINE
size_type index2 () const {
// Comeau recommends...
iterator_type tmp (this->base ());
return (-- tmp).index2 ();
}
BOOST_UBLAS_INLINE
dual_iterator_type begin () const {
// Comeau recommends...
iterator_type tmp (this->base ());
return (-- tmp).begin ();
}
BOOST_UBLAS_INLINE
dual_iterator_type end () const {
// Comeau recommends...
iterator_type tmp (this->base ());
return (-- tmp).end ();
}
BOOST_UBLAS_INLINE
dual_reverse_iterator_type rbegin () const {
return dual_reverse_iterator_type (end ());
}
BOOST_UBLAS_INLINE
dual_reverse_iterator_type rend () const {
return dual_reverse_iterator_type (begin ());
}
// Comparison
BOOST_UBLAS_INLINE
bool operator < (const reverse_iterator_base2 &it) const {
return ! (this->base () < it.base ());
}
BOOST_UBLAS_INLINE
bool operator <= (const reverse_iterator_base2 &it) const {
return ! (this->base () <= it.base ());
}
BOOST_UBLAS_INLINE
bool operator >= (const reverse_iterator_base2 &it) const {
return ! (this->base () >= it.base ());
}
BOOST_UBLAS_INLINE
bool operator > (const reverse_iterator_base2 &it) const {
return ! (this->base () > it.base ());
}
};
template<class I, class T, class R>
BOOST_UBLAS_INLINE
reverse_iterator_base2<I, T, R> operator + (const reverse_iterator_base2<I, T, R> &it, std::ptrdiff_t n) {
reverse_iterator_base2<I, T, R> tmp (it);
return tmp += n;
}
template<class I, class T, class R>
BOOST_UBLAS_INLINE
reverse_iterator_base2<I, T, R> operator + (std::ptrdiff_t n, const reverse_iterator_base2<I, T, R> &it) {
reverse_iterator_base2<I, T, R> tmp (it);
return tmp += n;
}
template<class I, class T, class R>
BOOST_UBLAS_INLINE
reverse_iterator_base2<I, T, R> operator - (const reverse_iterator_base2<I, T, R> &it, std::ptrdiff_t n) {
reverse_iterator_base2<I, T, R> tmp (it);
return tmp -= n;
}
template<class I, class T, class R>
BOOST_UBLAS_INLINE
std::ptrdiff_t operator - (const reverse_iterator_base2<I, T, R> &it1, const reverse_iterator_base2<I, T, R> &it2) {
return it2.base () - it1.base ();
}
#else
// Renamed this class from reverse_iterator to get
// typedef reverse_iterator<...> reverse_iterator
// working. Thanks to Gabriel Dos Reis for explaining this.
template <class I>
class reverse_iterator_base:
public std::reverse_iterator<I> {
public:
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef I iterator_type;
typedef typename I::container_type container_type;
// Construction and destruction
BOOST_UBLAS_INLINE
reverse_iterator_base ():
std::reverse_iterator<iterator_type> () {}
BOOST_UBLAS_INLINE
reverse_iterator_base (const iterator_type &it):
std::reverse_iterator<iterator_type> (it) {}
#ifdef BOOST_UBLAS_REVERSE_ITERATOR_OVERLOADS
// Arithmetic
BOOST_UBLAS_INLINE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -