vcl_iterator.h
来自「DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.」· C头文件 代码 · 共 569 行 · 第 1/2 页
H
569 行
//
// Copyright (c) 1994
// Hewlett-Packard Company
//
// 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. Hewlett-Packard Company makes no
// representations about the suitability of this software for any
// purpose. It is provided "as is" without express or implied warranty.
//
//
// Copyright (c) 1996
// Silicon Graphics Computer Systems, Inc.
//
// 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. Silicon Graphics makes no
// representations about the suitability of this software for any
// purpose. It is provided "as is" without express or implied warranty.
//
// Copyright (c) 1997
// Moscow Center for SPARC Technology
//
// 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. Moscow Center for SPARC Technology makes no
// representations about the suitability of this software for any
// purpose. It is provided "as is" without express or implied warranty.
//
#ifndef vcl_emulation_iterator_h
#define vcl_emulation_iterator_h
#include <vcl_cstddef.h>
#include <vcl_iostream.h>
#include "vcl_functional.h"
#if defined ( __STL_USE_ABBREVS )
// ugliness is intentional - to reduce conflicts
# define vcl_input_iterator_tag InItT
# define vcl_output_iterator_tag OuItT
# define vcl_bidirectional_iterator_tag BdItT
# define vcl_random_access_iterator_tag RaItT
# define vcl_forward_iterator FwIt
# define vcl_input_iterator InIt
# define vcl_output_iterator OuIt
# define vcl_bidirectional_iterator BdIt
# define vcl_random_access_iterator RaIt
# define vcl_reverse_bidirectional_iterator rBdIt
# define vcl_reverse_iterator rIt
# define vcl_back_insert_iterator bIIt
# define vcl_front_insert_iterator fIIt
# define vcl_raw_storage_iterator rSIt
# define vcl_istream_iterator iSIt
# define vcl_ostream_iterator oSIt
#endif
struct vcl_input_iterator_tag {};
struct vcl_output_iterator_tag { vcl_output_iterator_tag() {} };
struct vcl_forward_iterator_tag {};
struct vcl_bidirectional_iterator_tag { vcl_bidirectional_iterator_tag() {} };
struct vcl_random_access_iterator_tag {};
template <class T, class Distance> struct vcl_input_iterator {};
struct vcl_output_iterator {};
template <class T, class Distance> struct vcl_forward_iterator {};
template <class T, class Distance> struct vcl_bidirectional_iterator {};
template <class T, class Distance> struct vcl_random_access_iterator {};
template <class T, class Distance>
inline vcl_input_iterator_tag
iterator_category(const vcl_input_iterator<T, Distance>&) {
return vcl_input_iterator_tag();
}
inline vcl_output_iterator_tag
iterator_category(const vcl_output_iterator&) {
return vcl_output_iterator_tag();
}
template <class T, class Distance>
inline vcl_forward_iterator_tag
iterator_category(const vcl_forward_iterator<T, Distance>&) {
return vcl_forward_iterator_tag();
}
template <class T, class Distance>
inline vcl_bidirectional_iterator_tag
iterator_category(const vcl_bidirectional_iterator<T, Distance>&) {
return vcl_bidirectional_iterator_tag();
}
template <class T, class Distance>
inline vcl_random_access_iterator_tag
iterator_category(const vcl_random_access_iterator<T, Distance>&) {
return vcl_random_access_iterator_tag();
}
template <class T>
inline vcl_random_access_iterator_tag
iterator_category(const T*) {
return vcl_random_access_iterator_tag();
}
template <class T, class Distance>
inline T*
value_type(const vcl_input_iterator<T, Distance>&) {
return (T*)(0);
}
template <class T, class Distance>
inline T*
value_type(const vcl_forward_iterator<T, Distance>&) {
return (T*)(0);
}
template <class T, class Distance>
inline T*
value_type(const vcl_bidirectional_iterator<T, Distance>&) {
return (T*)(0);
}
template <class T, class Distance>
inline T*
value_type(const vcl_random_access_iterator<T, Distance>&) {
return (T*)(0);
}
template <class T>
inline T*
value_type(const T*) { return (T*)(0); }
template <class T, class Distance>
inline Distance*
distance_type(const vcl_input_iterator<T, Distance>&) {
return (Distance*)(0);
}
template <class T, class Distance>
inline Distance*
distance_type(const vcl_forward_iterator<T, Distance>&) {
return (Distance*)(0);
}
template <class T, class Distance>
inline Distance*
distance_type(const vcl_bidirectional_iterator<T, Distance>&) {
return (Distance*)(0);
}
template <class T, class Distance>
inline Distance*
distance_type(const vcl_random_access_iterator<T, Distance>&) {
return (Distance*)(0);
}
template <class T>
inline vcl_ptrdiff_t*
distance_type(const T*) { return (vcl_ptrdiff_t*)(0); }
template <class Container>
class vcl_back_insert_iterator {
protected:
typedef typename Container::value_type value_type;
Container* container;
public:
vcl_back_insert_iterator(Container& x) : container(&x) {}
vcl_back_insert_iterator<Container>&
operator=(const value_type& value) {
container->push_back(value);
return *this;
}
vcl_back_insert_iterator<Container>& operator*() { return *this; }
vcl_back_insert_iterator<Container>& operator++() { return *this; }
vcl_back_insert_iterator<Container>& operator++(int) { return *this; }
};
template <class Container>
inline vcl_output_iterator_tag
iterator_category(const vcl_back_insert_iterator<Container>&)
{
return vcl_output_iterator_tag();
}
template <class Container>
inline vcl_back_insert_iterator<Container>
vcl_back_inserter(Container& x) {
return vcl_back_insert_iterator<Container>(x);
}
template <class Container>
class vcl_front_insert_iterator {
protected:
Container* container;
public:
vcl_front_insert_iterator(Container& x) : container(&x) {}
vcl_front_insert_iterator<Container>&
operator=(const typename Container::value_type& value) {
container->push_front(value);
return *this;
}
vcl_front_insert_iterator<Container>& operator*() { return *this; }
vcl_front_insert_iterator<Container>& operator++() { return *this; }
vcl_front_insert_iterator<Container>& operator++(int) { return *this; }
};
template <class Container>
inline vcl_output_iterator_tag
iterator_category(const vcl_front_insert_iterator<Container>&)
{
return vcl_output_iterator_tag();
}
template <class Container>
inline vcl_front_insert_iterator<Container>
front_inserter(Container& x) {
return vcl_front_insert_iterator<Container>(x);
}
template <class Container>
class vcl_insert_iterator {
protected:
Container* container;
typename Container::iterator iter;
public:
vcl_insert_iterator(Container& x, typename Container::iterator i)
: container(&x), iter(i) {}
vcl_insert_iterator<Container>&
operator=(const typename Container::value_type& value) {
iter = container->insert(iter, value);
++iter;
return *this;
}
vcl_insert_iterator<Container>& operator*() { return *this; }
vcl_insert_iterator<Container>& operator++() { return *this; }
vcl_insert_iterator<Container>& operator++(int) { return *this; }
};
template <class Container>
inline vcl_output_iterator_tag
iterator_category(const vcl_insert_iterator<Container>&)
{
return vcl_output_iterator_tag();
}
template <class Container, class Iterator>
inline vcl_insert_iterator<Container> vcl_inserter(Container& x, Iterator i) {
typedef typename Container::iterator iter;
return vcl_insert_iterator<Container>(x, iter(i));
}
// Forward declarations
template <class BidirectionalIterator, class T, class Reference, class Distance> class vcl_reverse_bidirectional_iterator;
template <class BidirectionalIterator, class T, class Reference, class Distance> inline bool operator==
(
const vcl_reverse_bidirectional_iterator<BidirectionalIterator, T, Reference, Distance>& x,
const vcl_reverse_bidirectional_iterator<BidirectionalIterator, T, Reference, Distance>& y);
template <class BidirectionalIterator, class T,
VCL_DFL_TMPL_PARAM_STLDECL(Reference, T& ),
VCL_DFL_TYPE_PARAM_STLDECL(Distance, vcl_ptrdiff_t)>
class vcl_reverse_bidirectional_iterator {
typedef vcl_reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,
Distance> self;
friend bool operator== VCL_NULL_TMPL_ARGS (const self& x, const self& y);
protected:
BidirectionalIterator current;
public:
vcl_reverse_bidirectional_iterator() {}
vcl_reverse_bidirectional_iterator(const BidirectionalIterator&x): current(x) {}
BidirectionalIterator base() { return current; }
Reference operator*() const {
BidirectionalIterator tmp = current;
return *--tmp;
}
self& operator++() {
--current;
return *this;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?