📄 iterator.hpp
字号:
//
// Copyright (c) 2000-2002
// Joerg Walter, Mathias Koch
//
// Permission to use, copy, modify, distribute and sell this software
// and its documentation for any purpose is hereby granted without fee,
// provided that the above copyright notice appear in all copies and
// that both that copyright notice and this permission notice appear
// in supporting documentation. The authors make no representations
// about the suitability of this software for any purpose.
// It is provided "as is" without express or implied warranty.
//
// The authors gratefully acknowledge the support of
// GeNeSys mbH & Co. KG in producing this work.
//
#ifndef BOOST_UBLAS_ITERATOR_H
#define BOOST_UBLAS_ITERATOR_H
#include <iterator>
#include <boost/numeric/ublas/config.hpp>
// Using GCC the following is missing:
//
// namespace std {
//
// template <class C, class T, class D = std::ptrdiff_t, class P = T *, class R = T &>
// struct iterator {
// typedef C iterator_category;
// typedef T value_type;
// typedef D difference_type;
// typedef P pointer;
// typedef R reference;
// };
//
// }
//
// We therefore include the following header
#include <boost/iterator.hpp>
// and use namespace boost instead of std.
namespace boost { namespace numeric { namespace ublas {
#ifdef BOOST_UBLAS_NEED_CONVERSION
template<class C>
class container_reference;
#endif
template<class C>
class container_const_reference {
public:
typedef C container_type;
#ifdef BOOST_UBLAS_NEED_CONVERSION
typedef container_reference<container_type> container_reference;
#endif
BOOST_UBLAS_INLINE
container_const_reference ():
c_ (0) {}
BOOST_UBLAS_INLINE
container_const_reference (const container_type &c):
c_ (&c) {}
#ifdef BOOST_UBLAS_NEED_CONVERSION
BOOST_UBLAS_INLINE
container_const_reference (const container_reference &c):
c_ (c.c ()) {}
#endif
BOOST_UBLAS_INLINE
const container_type &operator () () const {
return *c_;
}
BOOST_UBLAS_INLINE
container_const_reference &assign (const container_type *c) {
c_ = c;
return *this;
}
private:
const container_type *c_;
container_const_reference &operator = (const container_const_reference &) {
return *this;
}
};
template<class C>
class container_reference {
public:
typedef C container_type;
BOOST_UBLAS_INLINE
container_reference ():
c_ (0) {}
BOOST_UBLAS_INLINE
container_reference (container_type &c):
c_ (&c) {}
BOOST_UBLAS_INLINE
container_type &operator () () const {
return *c_;
}
BOOST_UBLAS_INLINE
container_reference &assign (container_type *c) {
c_ = c;
return *this;
}
private:
container_type *c_;
container_reference operator = (const container_reference &) {
return *this;
}
};
template<class IC, class I, class T>
struct forward_iterator_base:
public boost::iterator<IC, T> {
typedef I derived_iterator_type;
typedef T derived_value_type;
// Arithmetic
BOOST_UBLAS_INLINE
derived_iterator_type operator ++ (int) {
derived_iterator_type &d (*static_cast<const derived_iterator_type *> (this));
derived_iterator_type tmp (d);
++ d;
return tmp;
}
#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS
BOOST_UBLAS_INLINE
friend derived_iterator_type operator ++ (derived_iterator_type &d, int) {
derived_iterator_type tmp (d);
++ d;
return tmp;
}
#endif
// Comparison
BOOST_UBLAS_INLINE
bool operator != (const derived_iterator_type &it) const {
const derived_iterator_type *d = static_cast<const derived_iterator_type *> (this);
return ! (*d == it);
}
};
#ifdef BOOST_UBLAS_NO_MEMBER_FRIENDS
template<class IC, class I, class T>
BOOST_UBLAS_INLINE
typename forward_iterator_base<IC, I, T>::derived_iterator_type operator ++ (forward_iterator_base<IC, I, T> &it, int) {
typedef BOOST_UBLAS_TYPENAME forward_iterator_base<IC, I, T>::derived_iterator_type derived_iterator_type;
derived_iterator_type &d (static_cast<derived_iterator_type &> (it));
derived_iterator_type tmp (d);
++ d;
return tmp;
}
#endif
template<class IC, class I, class T>
struct bidirectional_iterator_base:
public boost::iterator<IC, T> {
typedef I derived_iterator_type;
typedef T derived_value_type;
// Arithmetic
BOOST_UBLAS_INLINE
derived_iterator_type operator ++ (int) {
derived_iterator_type &d (*static_cast<const derived_iterator_type *> (this));
derived_iterator_type tmp (d);
++ d;
return tmp;
}
#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS
BOOST_UBLAS_INLINE
friend derived_iterator_type operator ++ (derived_iterator_type &d, int) {
derived_iterator_type tmp (d);
++ d;
return tmp;
}
#endif
BOOST_UBLAS_INLINE
derived_iterator_type operator -- (int) {
derived_iterator_type &d (*static_cast<const derived_iterator_type *> (this));
derived_iterator_type tmp (d);
-- d;
return tmp;
}
#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS
BOOST_UBLAS_INLINE
friend derived_iterator_type operator -- (derived_iterator_type &d, int) {
derived_iterator_type tmp (d);
-- d;
return tmp;
}
#endif
// Comparison
BOOST_UBLAS_INLINE
bool operator != (const derived_iterator_type &it) const {
const derived_iterator_type *d = static_cast<const derived_iterator_type *> (this);
return ! (*d == it);
}
};
#ifdef BOOST_UBLAS_NO_MEMBER_FRIENDS
template<class IC, class I, class T>
BOOST_UBLAS_INLINE
typename bidirectional_iterator_base<IC, I, T>::derived_iterator_type operator ++ (bidirectional_iterator_base<IC, I, T> &it, int) {
typedef BOOST_UBLAS_TYPENAME bidirectional_iterator_base<IC, I, T>::derived_iterator_type derived_iterator_type;
derived_iterator_type &d (static_cast<derived_iterator_type &> (it));
derived_iterator_type tmp (d);
++ d;
return tmp;
}
template<class IC, class I, class T>
BOOST_UBLAS_INLINE
typename bidirectional_iterator_base<IC, I, T>::derived_iterator_type operator -- (bidirectional_iterator_base<IC, I, T> &it, int) {
typedef BOOST_UBLAS_TYPENAME bidirectional_iterator_base<IC, I, T>::derived_iterator_type derived_iterator_type;
derived_iterator_type &d (static_cast<derived_iterator_type &> (it));
derived_iterator_type tmp (d);
-- d;
return tmp;
}
#endif
template<class IC, class I, class T, class D = std::ptrdiff_t>
struct random_access_iterator_base:
public boost::iterator<IC, T> {
typedef I derived_iterator_type;
typedef T derived_value_type;
typedef D derived_difference_type;
#ifdef BOOST_MSVC_STD_ITERATOR
typedef D difference_type;
#endif
// Arithmetic
BOOST_UBLAS_INLINE
derived_iterator_type operator ++ (int) {
derived_iterator_type &d (*static_cast<derived_iterator_type *> (this));
derived_iterator_type tmp (d);
++ d;
return tmp;
}
#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS
BOOST_UBLAS_INLINE
friend derived_iterator_type operator ++ (derived_iterator_type &d, int) {
derived_iterator_type tmp (d);
++ d;
return tmp;
}
#endif
BOOST_UBLAS_INLINE
derived_iterator_type operator -- (int) {
derived_iterator_type &d (*static_cast<derived_iterator_type *> (this));
derived_iterator_type tmp (d);
-- d;
return tmp;
}
#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS
BOOST_UBLAS_INLINE
friend derived_iterator_type operator -- (derived_iterator_type &d, int) {
derived_iterator_type tmp (d);
-- d;
return tmp;
}
#endif
BOOST_UBLAS_INLINE
derived_iterator_type operator + (derived_difference_type n) const {
derived_iterator_type tmp (*static_cast<const derived_iterator_type *> (this));
return tmp += n;
}
#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS
BOOST_UBLAS_INLINE
friend derived_iterator_type operator + (const derived_iterator_type &d, derived_difference_type n) {
derived_iterator_type tmp (d);
return tmp += n;
}
BOOST_UBLAS_INLINE
friend derived_iterator_type operator + (derived_difference_type n, const derived_iterator_type &d) {
derived_iterator_type tmp (d);
return tmp += n;
}
#endif
BOOST_UBLAS_INLINE
derived_iterator_type operator - (derived_difference_type n) const {
derived_iterator_type tmp (*static_cast<const derived_iterator_type *> (this));
return tmp -= n;
}
#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS
BOOST_UBLAS_INLINE
friend derived_iterator_type operator - (const derived_iterator_type &d, derived_difference_type n) {
derived_iterator_type tmp (d);
return tmp -= n;
}
#endif
// Comparison
BOOST_UBLAS_INLINE
bool operator != (const derived_iterator_type &it) const {
const derived_iterator_type *d = static_cast<const derived_iterator_type *> (this);
return ! (*d == it);
}
BOOST_UBLAS_INLINE
bool operator <= (const derived_iterator_type &it) const {
const derived_iterator_type *d = static_cast<const derived_iterator_type *> (this);
return ! (it < *d);
}
BOOST_UBLAS_INLINE
bool operator >= (const derived_iterator_type &it) const {
const derived_iterator_type *d = static_cast<const derived_iterator_type *> (this);
return ! (*d < it);
}
BOOST_UBLAS_INLINE
bool operator > (const derived_iterator_type &it) const {
const derived_iterator_type *d = static_cast<const derived_iterator_type *> (this);
return it < *d;
}
};
#ifdef BOOST_UBLAS_NO_MEMBER_FRIENDS
template<class IC, class I, class T>
BOOST_UBLAS_INLINE
typename random_access_iterator_base<IC, I, T>::derived_iterator_type operator ++ (random_access_iterator_base<IC, I, T> &it, int) {
typedef BOOST_UBLAS_TYPENAME random_access_iterator_base<IC, I, T>::derived_iterator_type derived_iterator_type;
derived_iterator_type &d (static_cast<derived_iterator_type &> (it));
derived_iterator_type tmp (d);
++ d;
return tmp;
}
template<class IC, class I, class T>
BOOST_UBLAS_INLINE
typename random_access_iterator_base<IC, I, T>::derived_iterator_type operator -- (random_access_iterator_base<IC, I, T> &it, int) {
typedef BOOST_UBLAS_TYPENAME random_access_iterator_base<IC, I, T>::derived_iterator_type derived_iterator_type;
derived_iterator_type &d (static_cast<derived_iterator_type &> (it));
derived_iterator_type tmp (d);
-- d;
return tmp;
}
template<class IC, class I, class T>
BOOST_UBLAS_INLINE
typename random_access_iterator_base<IC, I, T>::derived_iterator_type operator + (const random_access_iterator_base<IC, I, T> &it, std::ptrdiff_t n) {
typedef BOOST_UBLAS_TYPENAME random_access_iterator_base<IC, I, T>::derived_iterator_type derived_iterator_type;
derived_iterator_type tmp (static_cast<const derived_iterator_type &> (it));
return tmp += n;
}
template<class IC, class I, class T>
BOOST_UBLAS_INLINE
typename random_access_iterator_base<IC, I, T>::derived_iterator_type operator + (std::ptrdiff_t n, const random_access_iterator_base<IC, I, T> &it) {
typedef BOOST_UBLAS_TYPENAME random_access_iterator_base<IC, I, T>::derived_iterator_type derived_iterator_type;
derived_iterator_type tmp (static_cast<const derived_iterator_type &> (it));
return tmp += n;
}
template<class IC, class I, class T>
BOOST_UBLAS_INLINE
typename random_access_iterator_base<IC, I, T>::derived_iterator_type operator - (const random_access_iterator_base<IC, I, T> &it, std::ptrdiff_t n) {
typedef BOOST_UBLAS_TYPENAME random_access_iterator_base<IC, I, T>::derived_iterator_type derived_iterator_type;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -