]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/include/ext/alloc_traits.h
Makefile.am: Add alloc_traits.h headers.
[thirdparty/gcc.git] / libstdc++-v3 / include / ext / alloc_traits.h
CommitLineData
e8eb60bd
JW
1// Allocator traits -*- C++ -*-
2
3// Copyright (C) 2011 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 3, 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// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file ext/alloc_traits.h
26 * This file is a GNU extension to the Standard C++ Library.
27 */
28
29#ifndef _EXT_ALLOC_TRAITS_H
30#define _EXT_ALLOC_TRAITS_H 1
31
32#pragma GCC system_header
33
34#ifdef __GXX_EXPERIMENTAL_CXX0X__
35# include <bits/alloc_traits.h>
36#else
37# include <bits/allocator.h> // for __alloc_swap
38#endif
39
40namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
41{
42_GLIBCXX_BEGIN_NAMESPACE_VERSION
43
44 /**
45 * @brief Uniform interface to C++98 and C++0x allocators.
46 * @ingroup allocators
47 */
48template<typename _Alloc>
49 struct __alloc_traits
50#ifdef __GXX_EXPERIMENTAL_CXX0X__
51 : std::allocator_traits<_Alloc>
52#endif
53 {
54 typedef _Alloc allocator_type;
55#ifdef __GXX_EXPERIMENTAL_CXX0X__
56 typedef std::allocator_traits<_Alloc> _Base_type;
57 typedef typename _Base_type::value_type value_type;
58 typedef typename _Base_type::pointer pointer;
59 typedef typename _Base_type::const_pointer const_pointer;
60 typedef typename _Base_type::size_type size_type;
61 // C++0x allocators do not define reference or const_reference
62 typedef value_type& reference;
63 typedef const value_type& const_reference;
64 using _Base_type::allocate;
65 using _Base_type::deallocate;
66 using _Base_type::construct;
67 using _Base_type::destroy;
68
69 static _Alloc _S_select_on_copy(const _Alloc& __a)
70 { return _Base_type::select_on_container_copy_construction(__a); }
71
72 static void _S_on_swap(_Alloc& __a, _Alloc& __b)
73 { std::__alloc_on_swap(__a, __b); }
74
75 static constexpr bool _S_propagate_on_copy_assign()
76 { return _Base_type::propagate_on_container_copy_assignment::value; }
77
78 static constexpr bool _S_propagate_on_move_assign()
79 { return _Base_type::propagate_on_container_move_assignment::value; }
80
81 static constexpr bool _S_propagate_on_swap()
82 { return _Base_type::propagate_on_container_swap::value; }
83
84#else
85
86 typedef typename _Alloc::pointer pointer;
87 typedef typename _Alloc::const_pointer const_pointer;
88 typedef typename _Alloc::value_type value_type;
89 typedef typename _Alloc::reference reference;
90 typedef typename _Alloc::const_reference const_reference;
91 typedef typename _Alloc::size_type size_type;
92
93 static pointer
94 allocate(_Alloc& __a, size_type __n)
95 { return __a.allocate(__n); }
96
97 static void deallocate(_Alloc& __a, pointer __p, size_type __n)
98 { __a.deallocate(__p, __n); }
99
100 template<typename _Tp>
101 static void construct(_Alloc& __a, pointer __p, const _Tp& __arg)
102 { __a.construct(__p, __arg); }
103
104 static void destroy(_Alloc& __a, pointer __p)
105 { __a.destroy(__p); }
106
107 static const _Alloc& _S_select_on_copy(const _Alloc& __a) { return __a; }
108
109 static void _S_on_swap(_Alloc& __a, _Alloc& __b)
110 {
111 // _GLIBCXX_RESOLVE_LIB_DEFECTS
112 // 431. Swapping containers with unequal allocators.
113 std::__alloc_swap<_Alloc>::_S_do_it(__a, __b);
114 }
115#endif
116 };
117
118_GLIBCXX_END_NAMESPACE_VERSION
119} // namespace
120
121#endif