⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stl_iterator.h

📁 STL完整源码,实现STL文件的读写和三维体的重建及其分析
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * * 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,1997 * 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. *//* NOTE: This is an internal header file, included by other STL headers. *   You should not attempt to use it directly. */#ifndef __SGI_STL_INTERNAL_ITERATOR_H#define __SGI_STL_INTERNAL_ITERATOR_H__STL_BEGIN_NAMESPACEstruct input_iterator_tag {};struct output_iterator_tag {};struct forward_iterator_tag : public input_iterator_tag {};struct bidirectional_iterator_tag : public forward_iterator_tag {};struct random_access_iterator_tag : public bidirectional_iterator_tag {};template <class T, class Distance> struct input_iterator {  typedef input_iterator_tag iterator_category;  typedef T                  value_type;  typedef Distance           difference_type;  typedef T*                 pointer;  typedef T&                 reference;};struct output_iterator {  typedef output_iterator_tag iterator_category;  typedef void                value_type;  typedef void                difference_type;  typedef void                pointer;  typedef void                reference;};template <class T, class Distance> struct forward_iterator {  typedef forward_iterator_tag iterator_category;  typedef T                    value_type;  typedef Distance             difference_type;  typedef T*                   pointer;  typedef T&                   reference;};template <class T, class Distance> struct bidirectional_iterator {  typedef bidirectional_iterator_tag iterator_category;  typedef T                          value_type;  typedef Distance                   difference_type;  typedef T*                         pointer;  typedef T&                         reference;};template <class T, class Distance> struct random_access_iterator {  typedef random_access_iterator_tag iterator_category;  typedef T                          value_type;  typedef Distance                   difference_type;  typedef T*                         pointer;  typedef T&                         reference;};#ifdef __STL_USE_NAMESPACEStemplate <class Category, class T, class Distance = ptrdiff_t,          class Pointer = T*, class Reference = T&>struct iterator {  typedef Category  iterator_category;  typedef T         value_type;  typedef Distance  difference_type;  typedef Pointer   pointer;  typedef Reference reference;};#endif /* __STL_USE_NAMESPACES */#ifdef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class Iterator>struct iterator_traits {  typedef typename Iterator::iterator_category iterator_category;  typedef typename Iterator::value_type        value_type;  typedef typename Iterator::difference_type   difference_type;  typedef typename Iterator::pointer           pointer;  typedef typename Iterator::reference         reference;};template <class T>struct iterator_traits<T*> {  typedef random_access_iterator_tag iterator_category;  typedef T                          value_type;  typedef ptrdiff_t                  difference_type;  typedef T*                         pointer;  typedef T&                         reference;};template <class T>struct iterator_traits<const T*> {  typedef random_access_iterator_tag iterator_category;  typedef T                          value_type;  typedef ptrdiff_t                  difference_type;  typedef const T*                   pointer;  typedef const T&                   reference;};template <class Iterator>inline typename iterator_traits<Iterator>::iterator_categoryiterator_category(const Iterator&) {  typedef typename iterator_traits<Iterator>::iterator_category category;  return category();}template <class Iterator>inline typename iterator_traits<Iterator>::difference_type*distance_type(const Iterator&) {  return static_cast<typename iterator_traits<Iterator>::difference_type*>(0);}template <class Iterator>inline typename iterator_traits<Iterator>::value_type*value_type(const Iterator&) {  return static_cast<typename iterator_traits<Iterator>::value_type*>(0);}#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class T, class Distance> inline input_iterator_tag iterator_category(const input_iterator<T, Distance>&) {  return input_iterator_tag();}inline output_iterator_tag iterator_category(const output_iterator&) {  return output_iterator_tag();}template <class T, class Distance> inline forward_iterator_tagiterator_category(const forward_iterator<T, Distance>&) {  return forward_iterator_tag();}template <class T, class Distance> inline bidirectional_iterator_tagiterator_category(const bidirectional_iterator<T, Distance>&) {  return bidirectional_iterator_tag();}template <class T, class Distance> inline random_access_iterator_tagiterator_category(const random_access_iterator<T, Distance>&) {  return random_access_iterator_tag();}template <class T>inline random_access_iterator_tag iterator_category(const T*) {  return random_access_iterator_tag();}template <class T, class Distance> inline T* value_type(const input_iterator<T, Distance>&) {  return (T*)(0); }template <class T, class Distance> inline T* value_type(const forward_iterator<T, Distance>&) {  return (T*)(0);}template <class T, class Distance> inline T* value_type(const bidirectional_iterator<T, Distance>&) {  return (T*)(0);}template <class T, class Distance> inline T* value_type(const 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 input_iterator<T, Distance>&) {  return (Distance*)(0);}template <class T, class Distance> inline Distance* distance_type(const forward_iterator<T, Distance>&) {  return (Distance*)(0);}template <class T, class Distance> inline Distance* distance_type(const bidirectional_iterator<T, Distance>&) {  return (Distance*)(0);}template <class T, class Distance> inline Distance* distance_type(const random_access_iterator<T, Distance>&) {  return (Distance*)(0);}template <class T>inline ptrdiff_t* distance_type(const T*) { return (ptrdiff_t*)(0); }#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class InputIterator, class Distance>inline void __distance(InputIterator first, InputIterator last, Distance& n,                        input_iterator_tag) {  while (first != last) { ++first; ++n; }}template <class RandomAccessIterator, class Distance>inline void __distance(RandomAccessIterator first, RandomAccessIterator last,                        Distance& n, random_access_iterator_tag) {  n += last - first;}template <class InputIterator, class Distance>inline void distance(InputIterator first, InputIterator last, Distance& n) {  __distance(first, last, n, iterator_category(first));}#ifdef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class InputIterator>inline iterator_traits<InputIterator>::difference_type__distance(InputIterator first, InputIterator last, input_iterator_tag) {  iterator_traits<InputIterator>::difference_type n = 0;  while (first != last) {    ++first; ++n;  }  return n;}template <class RandomAccessIterator>inline iterator_traits<RandomAccessIterator>::difference_type__distance(RandomAccessIterator first, RandomAccessIterator last,           random_access_iterator_tag) {  return last - first;}template <class InputIterator>inline iterator_traits<InputIterator>::difference_typedistance(InputIterator first, InputIterator last) {  typedef typename iterator_traits<InputIterator>::iterator_category category;  return __distance(first, last, category());}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class InputIterator, class Distance>inline void __advance(InputIterator& i, Distance n, input_iterator_tag) {  while (n--) ++i;}#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)#pragma set woff 1183#endiftemplate <class BidirectionalIterator, class Distance>inline void __advance(BidirectionalIterator& i, Distance n,                       bidirectional_iterator_tag) {  if (n >= 0)    while (n--) ++i;  else    while (n++) --i;}#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)#pragma reset woff 1183#endiftemplate <class RandomAccessIterator, class Distance>inline void __advance(RandomAccessIterator& i, Distance n,                       random_access_iterator_tag) {  i += n;}template <class InputIterator, class Distance>inline void advance(InputIterator& i, Distance n) {  __advance(i, n, iterator_category(i));}template <class Container>class back_insert_iterator {protected:  Container* container;public:  typedef output_iterator_tag iterator_category;  typedef void                value_type;  typedef void                difference_type;  typedef void                pointer;  typedef void                reference;  explicit back_insert_iterator(Container& x) : container(&x) {}  back_insert_iterator<Container>&  operator=(const typename Container::value_type& value) {     container->push_back(value);    return *this;  }  back_insert_iterator<Container>& operator*() { return *this; }  back_insert_iterator<Container>& operator++() { return *this; }  back_insert_iterator<Container>& operator++(int) { return *this; }};#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class Container>inline output_iterator_tagiterator_category(const back_insert_iterator<Container>&){  return output_iterator_tag();}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class Container>inline back_insert_iterator<Container> back_inserter(Container& x) {  return back_insert_iterator<Container>(x);}template <class Container>class front_insert_iterator {protected:  Container* container;public:  typedef output_iterator_tag iterator_category;  typedef void                value_type;  typedef void                difference_type;  typedef void                pointer;  typedef void                reference;  explicit front_insert_iterator(Container& x) : container(&x) {}  front_insert_iterator<Container>&  operator=(const typename Container::value_type& value) {     container->push_front(value);    return *this;  }  front_insert_iterator<Container>& operator*() { return *this; }  front_insert_iterator<Container>& operator++() { return *this; }  front_insert_iterator<Container>& operator++(int) { return *this; }};#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class Container>inline output_iterator_tagiterator_category(const front_insert_iterator<Container>&){  return output_iterator_tag();}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class Container>inline front_insert_iterator<Container> front_inserter(Container& x) {  return front_insert_iterator<Container>(x);}template <class Container>class insert_iterator {protected:  Container* container;  typename Container::iterator iter;public:  typedef output_iterator_tag iterator_category;  typedef void                value_type;  typedef void                difference_type;  typedef void                pointer;  typedef void                reference;  insert_iterator(Container& x, typename Container::iterator i)     : container(&x), iter(i) {}  insert_iterator<Container>&  operator=(const typename Container::value_type& value) {     iter = container->insert(iter, value);    ++iter;    return *this;  }  insert_iterator<Container>& operator*() { return *this; }  insert_iterator<Container>& operator++() { return *this; }  insert_iterator<Container>& operator++(int) { return *this; }};#ifndef __STL_CLASS_PARTIAL_SPECIALIZATIONtemplate <class Container>inline output_iterator_tagiterator_category(const insert_iterator<Container>&){  return output_iterator_tag();}#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class Container, class Iterator>inline insert_iterator<Container> inserter(Container& x, Iterator i) {  typedef typename Container::iterator iter;  return insert_iterator<Container>(x, iter(i));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -