stl_iterator_base_types.h

来自「symbian上STL模板库的实现」· C头文件 代码 · 共 171 行

H
171
字号
// Types used in iterator implementation -*- C++ -*-// Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.//// This file is part of the GNU ISO C++ Library.  This library is free// software; you can redistribute it and/or modify it under the// terms of the GNU General Public License as published by the// Free Software Foundation; either version 2, or (at your option)// any later version.// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License along// with this library; see the file COPYING.  If not, write to the Free// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,// USA.// As a special exception, you may use this file as part of a free software// library without restriction.  Specifically, if other files instantiate// templates or use macros or inline functions from this file, or you compile// this file and link it with other files to produce an executable, this// file does not by itself cause the resulting executable to be covered by// the GNU General Public License.  This exception does not however// invalidate any other reasons why the executable file might be covered by// the GNU General Public License./* * * 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-1998 * 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. *//** @file stl_iterator_base_types.h *  This is an internal header file, included by other library headers. *  You should not attempt to use it directly. * *  This file contains all of the general iterator-related utility types, *  such as iterator_traits and struct iterator. */#ifndef _ITERATOR_BASE_TYPES_H#define _ITERATOR_BASE_TYPES_H 1//#pragma GCC system_headernamespace std{    //@{    /**     *  @defgroup iterator_tags Iterator Tags     *  These are empty types, used to distinguish different iterators.  The     *  distinction is not made by what they contain, but simply by what they     *  are.  Different underlying algorithms can then be used based on the     *  different operations supporetd by different iterator types.     */    ///  Marking input iterators.    struct input_iterator_tag {};    ///  Marking output iterators.    struct output_iterator_tag {};    /// Forward iterators support a superset of input iterator operations.    struct forward_iterator_tag : public input_iterator_tag {};    /// Bidirectional iterators support a superset of forward iterator    /// operations.    struct bidirectional_iterator_tag : public forward_iterator_tag {};    /// Random-access iterators support a superset of bidirectional iterator    /// operations.    struct random_access_iterator_tag : public bidirectional_iterator_tag {};    //@}    /**     *  @brief  Common %iterator class.     *     *  This class does nothing but define nested typedefs.  %Iterator classes     *  can inherit from this class to save some work.  The typedefs are then     *  used in specializations and overloading.     *     *  In particular, there are no default implementations of requirements     *  such as @c operator++ and the like.  (How could there be?)     */    template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,        typename _Pointer = _Tp*, typename _Reference = _Tp&>            struct iterator            {                /// One of the @link iterator_tags tag types@endlink.                typedef _Category  iterator_category;                /// The type "pointed to" by the iterator.                typedef _Tp        value_type;                /// Distance between iterators is represented as this type.                typedef _Distance  difference_type;                /// This type represents a pointer-to-value_type.                typedef _Pointer   pointer;                /// This type represents a reference-to-value_type.                typedef _Reference reference;            };    /**     *  This class does nothing but define nested typedefs.  The general     *  version simply "forwards" the nested typedefs from the Iterator     *  argument.  Specialized versions for pointers and pointers-to-const     *  provide tighter, more correct semantics.     */    template<typename _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<typename _Tp>        struct iterator_traits<_Tp*>        {            typedef random_access_iterator_tag iterator_category;            typedef _Tp                         value_type;            typedef ptrdiff_t                   difference_type;            typedef _Tp*                        pointer;            typedef _Tp&                        reference;        };    template<typename _Tp>        struct iterator_traits<const _Tp*>        {            typedef random_access_iterator_tag iterator_category;            typedef _Tp                         value_type;            typedef ptrdiff_t                   difference_type;            typedef const _Tp*                  pointer;            typedef const _Tp&                  reference;        };    /**     *  @if maint     *  This function is not a part of the C++ standard but is syntactic     *  sugar for internal library use only.     *  @endif     */    template<typename _Iter>        inline typename iterator_traits<_Iter>::iterator_category        __iterator_category(const _Iter&)        { return typename iterator_traits<_Iter>::iterator_category(); }} // namespace std#endif /* _ITERATOR_BASE_TYPES_H */

⌨️ 快捷键说明

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