OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [libstdc++-v3/] [include/] [bits/] [stl_iterator_base_types.h] - Blame information for rev 17

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 17 jlechner
// Types used in iterator implementation -*- C++ -*-
2
 
3
// Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
4
//
5
// This file is part of the GNU ISO C++ Library.  This library is free
6
// software; you can redistribute it and/or modify it under the
7
// terms of the GNU General Public License as published by the
8
// Free Software Foundation; either version 2, or (at your option)
9
// any later version.
10
 
11
// This library is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
// GNU General Public License for more details.
15
 
16
// You should have received a copy of the GNU General Public License along
17
// with this library; see the file COPYING.  If not, write to the Free
18
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19
// USA.
20
 
21
// As a special exception, you may use this file as part of a free software
22
// library without restriction.  Specifically, if other files instantiate
23
// templates or use macros or inline functions from this file, or you compile
24
// this file and link it with other files to produce an executable, this
25
// file does not by itself cause the resulting executable to be covered by
26
// the GNU General Public License.  This exception does not however
27
// invalidate any other reasons why the executable file might be covered by
28
// the GNU General Public License.
29
 
30
/*
31
 *
32
 * Copyright (c) 1994
33
 * Hewlett-Packard Company
34
 *
35
 * Permission to use, copy, modify, distribute and sell this software
36
 * and its documentation for any purpose is hereby granted without fee,
37
 * provided that the above copyright notice appear in all copies and
38
 * that both that copyright notice and this permission notice appear
39
 * in supporting documentation.  Hewlett-Packard Company makes no
40
 * representations about the suitability of this software for any
41
 * purpose.  It is provided "as is" without express or implied warranty.
42
 *
43
 *
44
 * Copyright (c) 1996-1998
45
 * Silicon Graphics Computer Systems, Inc.
46
 *
47
 * Permission to use, copy, modify, distribute and sell this software
48
 * and its documentation for any purpose is hereby granted without fee,
49
 * provided that the above copyright notice appear in all copies and
50
 * that both that copyright notice and this permission notice appear
51
 * in supporting documentation.  Silicon Graphics makes no
52
 * representations about the suitability of this software for any
53
 * purpose.  It is provided "as is" without express or implied warranty.
54
 */
55
 
56
/** @file stl_iterator_base_types.h
57
 *  This is an internal header file, included by other library headers.
58
 *  You should not attempt to use it directly.
59
 *
60
 *  This file contains all of the general iterator-related utility types,
61
 *  such as iterator_traits and struct iterator.
62
 */
63
 
64
#ifndef _ITERATOR_BASE_TYPES_H
65
#define _ITERATOR_BASE_TYPES_H 1
66
 
67
#pragma GCC system_header
68
 
69
namespace std
70
{
71
  //@{
72
  /**
73
   *  @defgroup iterator_tags Iterator Tags
74
   *  These are empty types, used to distinguish different iterators.  The
75
   *  distinction is not made by what they contain, but simply by what they
76
   *  are.  Different underlying algorithms can then be used based on the
77
   *  different operations supporetd by different iterator types.
78
  */
79
  ///  Marking input iterators.
80
  struct input_iterator_tag {};
81
  ///  Marking output iterators.
82
  struct output_iterator_tag {};
83
  /// Forward iterators support a superset of input iterator operations.
84
  struct forward_iterator_tag : public input_iterator_tag {};
85
  /// Bidirectional iterators support a superset of forward iterator
86
  /// operations.
87
  struct bidirectional_iterator_tag : public forward_iterator_tag {};
88
  /// Random-access iterators support a superset of bidirectional iterator
89
  /// operations.
90
  struct random_access_iterator_tag : public bidirectional_iterator_tag {};
91
  //@}
92
 
93
 
94
  /**
95
   *  @brief  Common %iterator class.
96
   *
97
   *  This class does nothing but define nested typedefs.  %Iterator classes
98
   *  can inherit from this class to save some work.  The typedefs are then
99
   *  used in specializations and overloading.
100
   *
101
   *  In particular, there are no default implementations of requirements
102
   *  such as @c operator++ and the like.  (How could there be?)
103
  */
104
  template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,
105
           typename _Pointer = _Tp*, typename _Reference = _Tp&>
106
    struct iterator
107
    {
108
      /// One of the @link iterator_tags tag types@endlink.
109
      typedef _Category  iterator_category;
110
      /// The type "pointed to" by the iterator.
111
      typedef _Tp        value_type;
112
      /// Distance between iterators is represented as this type.
113
      typedef _Distance  difference_type;
114
      /// This type represents a pointer-to-value_type.
115
      typedef _Pointer   pointer;
116
      /// This type represents a reference-to-value_type.
117
      typedef _Reference reference;
118
    };
119
 
120
  /**
121
   *  This class does nothing but define nested typedefs.  The general
122
   *  version simply "forwards" the nested typedefs from the Iterator
123
   *  argument.  Specialized versions for pointers and pointers-to-const
124
   *  provide tighter, more correct semantics.
125
  */
126
  template<typename _Iterator>
127
    struct iterator_traits
128
    {
129
      typedef typename _Iterator::iterator_category iterator_category;
130
      typedef typename _Iterator::value_type        value_type;
131
      typedef typename _Iterator::difference_type   difference_type;
132
      typedef typename _Iterator::pointer           pointer;
133
      typedef typename _Iterator::reference         reference;
134
    };
135
 
136
  template<typename _Tp>
137
    struct iterator_traits<_Tp*>
138
    {
139
      typedef random_access_iterator_tag iterator_category;
140
      typedef _Tp                         value_type;
141
      typedef ptrdiff_t                   difference_type;
142
      typedef _Tp*                        pointer;
143
      typedef _Tp&                        reference;
144
    };
145
 
146
  template<typename _Tp>
147
    struct iterator_traits<const _Tp*>
148
    {
149
      typedef random_access_iterator_tag iterator_category;
150
      typedef _Tp                         value_type;
151
      typedef ptrdiff_t                   difference_type;
152
      typedef const _Tp*                  pointer;
153
      typedef const _Tp&                  reference;
154
    };
155
 
156
  /**
157
   *  @if maint
158
   *  This function is not a part of the C++ standard but is syntactic
159
   *  sugar for internal library use only.
160
   *  @endif
161
  */
162
  template<typename _Iter>
163
    inline typename iterator_traits<_Iter>::iterator_category
164
    __iterator_category(const _Iter&)
165
    { return typename iterator_traits<_Iter>::iterator_category(); }
166
 
167
} // namespace std
168
 
169
#endif /* _ITERATOR_BASE_TYPES_H */
170
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.