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

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-dev/] [fsf-gcc-snapshot-1-mar-12/] [or1k-gcc/] [libstdc++-v3/] [include/] [bits/] [allocator.h] - Blame information for rev 783

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 742 jeremybenn
// Allocators -*- C++ -*-
2
 
3
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4
// 2011 Free Software Foundation, Inc.
5
//
6
// This file is part of the GNU ISO C++ Library.  This library is free
7
// software; you can redistribute it and/or modify it under the
8
// terms of the GNU General Public License as published by the
9
// Free Software Foundation; either version 3, or (at your option)
10
// any later version.
11
 
12
// This library is distributed in the hope that it will be useful,
13
// but WITHOUT ANY WARRANTY; without even the implied warranty of
14
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
// GNU General Public License for more details.
16
 
17
// Under Section 7 of GPL version 3, you are granted additional
18
// permissions described in the GCC Runtime Library Exception, version
19
// 3.1, as published by the Free Software Foundation.
20
 
21
// You should have received a copy of the GNU General Public License and
22
// a copy of the GCC Runtime Library Exception along with this program;
23
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24
// <http://www.gnu.org/licenses/>.
25
 
26
/*
27
 * Copyright (c) 1996-1997
28
 * Silicon Graphics Computer Systems, Inc.
29
 *
30
 * Permission to use, copy, modify, distribute and sell this software
31
 * and its documentation for any purpose is hereby granted without fee,
32
 * provided that the above copyright notice appear in all copies and
33
 * that both that copyright notice and this permission notice appear
34
 * in supporting documentation.  Silicon Graphics makes no
35
 * representations about the suitability of this software for any
36
 * purpose.  It is provided "as is" without express or implied warranty.
37
 */
38
 
39
/** @file bits/allocator.h
40
 *  This is an internal header file, included by other library headers.
41
 *  Do not attempt to use it directly. @headername{memory}
42
 */
43
 
44
#ifndef _ALLOCATOR_H
45
#define _ALLOCATOR_H 1
46
 
47
// Define the base class to std::allocator.
48
#include <bits/c++allocator.h>
49
 
50
namespace std _GLIBCXX_VISIBILITY(default)
51
{
52
_GLIBCXX_BEGIN_NAMESPACE_VERSION
53
 
54
  /**
55
   * @defgroup allocators Allocators
56
   * @ingroup memory
57
   *
58
   * Classes encapsulating memory operations.
59
   *
60
   * @{
61
   */
62
 
63
  template<typename _Tp>
64
    class allocator;
65
 
66
  /// allocator<void> specialization.
67
  template<>
68
    class allocator<void>
69
    {
70
    public:
71
      typedef size_t      size_type;
72
      typedef ptrdiff_t   difference_type;
73
      typedef void*       pointer;
74
      typedef const void* const_pointer;
75
      typedef void        value_type;
76
 
77
      template<typename _Tp1>
78
        struct rebind
79
        { typedef allocator<_Tp1> other; };
80
    };
81
 
82
  /**
83
   * @brief  The @a standard allocator, as per [20.4].
84
   *
85
   *  See http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt04ch11.html
86
   *  for further details.
87
   */
88
  template<typename _Tp>
89
    class allocator: public __glibcxx_base_allocator<_Tp>
90
    {
91
   public:
92
      typedef size_t     size_type;
93
      typedef ptrdiff_t  difference_type;
94
      typedef _Tp*       pointer;
95
      typedef const _Tp* const_pointer;
96
      typedef _Tp&       reference;
97
      typedef const _Tp& const_reference;
98
      typedef _Tp        value_type;
99
 
100
      template<typename _Tp1>
101
        struct rebind
102
        { typedef allocator<_Tp1> other; };
103
 
104
      allocator() throw() { }
105
 
106
      allocator(const allocator& __a) throw()
107
      : __glibcxx_base_allocator<_Tp>(__a) { }
108
 
109
      template<typename _Tp1>
110
        allocator(const allocator<_Tp1>&) throw() { }
111
 
112
      ~allocator() throw() { }
113
 
114
      // Inherit everything else.
115
    };
116
 
117
  template<typename _T1, typename _T2>
118
    inline bool
119
    operator==(const allocator<_T1>&, const allocator<_T2>&)
120
    { return true; }
121
 
122
  template<typename _Tp>
123
    inline bool
124
    operator==(const allocator<_Tp>&, const allocator<_Tp>&)
125
    { return true; }
126
 
127
  template<typename _T1, typename _T2>
128
    inline bool
129
    operator!=(const allocator<_T1>&, const allocator<_T2>&)
130
    { return false; }
131
 
132
  template<typename _Tp>
133
    inline bool
134
    operator!=(const allocator<_Tp>&, const allocator<_Tp>&)
135
    { return false; }
136
 
137
  /**
138
   * @}
139
   */
140
 
141
  // Inhibit implicit instantiations for required instantiations,
142
  // which are defined via explicit instantiations elsewhere.
143
#if _GLIBCXX_EXTERN_TEMPLATE
144
  extern template class allocator<char>;
145
  extern template class allocator<wchar_t>;
146
#endif
147
 
148
  // Undefine.
149
#undef __glibcxx_base_allocator
150
 
151
  // To implement Option 3 of DR 431.
152
  template<typename _Alloc, bool = __is_empty(_Alloc)>
153
    struct __alloc_swap
154
    { static void _S_do_it(_Alloc&, _Alloc&) { } };
155
 
156
  template<typename _Alloc>
157
    struct __alloc_swap<_Alloc, false>
158
    {
159
      static void
160
      _S_do_it(_Alloc& __one, _Alloc& __two)
161
      {
162
        // Precondition: swappable allocators.
163
        if (__one != __two)
164
          swap(__one, __two);
165
      }
166
    };
167
 
168
  // Optimize for stateless allocators.
169
  template<typename _Alloc, bool = __is_empty(_Alloc)>
170
    struct __alloc_neq
171
    {
172
      static bool
173
      _S_do_it(const _Alloc&, const _Alloc&)
174
      { return false; }
175
    };
176
 
177
  template<typename _Alloc>
178
    struct __alloc_neq<_Alloc, false>
179
    {
180
      static bool
181
      _S_do_it(const _Alloc& __one, const _Alloc& __two)
182
      { return __one != __two; }
183
    };
184
 
185
#ifdef __GXX_EXPERIMENTAL_CXX0X__
186
  template<typename _Tp, bool
187
    = __or_<is_copy_constructible<typename _Tp::value_type>,
188
            is_nothrow_move_constructible<typename _Tp::value_type>>::value>
189
    struct __shrink_to_fit_aux
190
    { static bool _S_do_it(_Tp&) { return false; } };
191
 
192
  template<typename _Tp>
193
    struct __shrink_to_fit_aux<_Tp, true>
194
    {
195
      static bool
196
      _S_do_it(_Tp& __c)
197
      {
198
        __try
199
          {
200
            _Tp(__make_move_if_noexcept_iterator(__c.begin()),
201
                __make_move_if_noexcept_iterator(__c.end()),
202
                __c.get_allocator()).swap(__c);
203
            return true;
204
          }
205
        __catch(...)
206
          { return false; }
207
      }
208
    };
209
 
210
  // Declare uses_allocator so it can be specialized in <queue> etc.
211
  template<typename, typename>
212
    struct uses_allocator;
213
#endif
214
 
215
_GLIBCXX_END_NAMESPACE_VERSION
216
} // namespace std
217
 
218
#endif

powered by: WebSVN 2.1.0

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