aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/ext
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely.gcc@gmail.com>2011-06-22 19:57:12 +0000
committerJonathan Wakely <jwakely.gcc@gmail.com>2011-06-22 19:57:12 +0000
commitba0641f0b847c1f7064bd17128ab4df32ea0c6c8 (patch)
tree50ee7e36552a06e401135d68736fe944163a9683 /libstdc++-v3/include/ext
parent247edb57610ff8efa83f1bd21a4142ac61d986ff (diff)
2011-06-22 Jonathan Wakely <jwakely.gcc@gmail.com>
* include/Makefile.am: Add alloc_traits.h headers. * include/Makefile.in: Regenerate. * include/std/memory: Include uses_allocator.h explicitly. * include/bits/allocator.h (allocator_traits): Move to ... * include/bits/alloc_traits.h: New header. * include/ext/alloc_traits.h (__alloc_traits): Extension to provide a common allocator interface for C++98 and C++0x. * include/bits/stl_construct.h: Use __alloc_traits. * include/bits/stl_uninitialized.h: Likewise. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@175305 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/ext')
-rw-r--r--libstdc++-v3/include/ext/alloc_traits.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/libstdc++-v3/include/ext/alloc_traits.h b/libstdc++-v3/include/ext/alloc_traits.h
new file mode 100644
index 00000000000..0d50fe173fc
--- /dev/null
+++ b/libstdc++-v3/include/ext/alloc_traits.h
@@ -0,0 +1,121 @@
+// Allocator traits -*- C++ -*-
+
+// Copyright (C) 2011 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 3, 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file ext/alloc_traits.h
+ * This file is a GNU extension to the Standard C++ Library.
+ */
+
+#ifndef _EXT_ALLOC_TRAITS_H
+#define _EXT_ALLOC_TRAITS_H 1
+
+#pragma GCC system_header
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+# include <bits/alloc_traits.h>
+#else
+# include <bits/allocator.h> // for __alloc_swap
+#endif
+
+namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+ /**
+ * @brief Uniform interface to C++98 and C++0x allocators.
+ * @ingroup allocators
+ */
+template<typename _Alloc>
+ struct __alloc_traits
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ : std::allocator_traits<_Alloc>
+#endif
+ {
+ typedef _Alloc allocator_type;
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ typedef std::allocator_traits<_Alloc> _Base_type;
+ typedef typename _Base_type::value_type value_type;
+ typedef typename _Base_type::pointer pointer;
+ typedef typename _Base_type::const_pointer const_pointer;
+ typedef typename _Base_type::size_type size_type;
+ // C++0x allocators do not define reference or const_reference
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ using _Base_type::allocate;
+ using _Base_type::deallocate;
+ using _Base_type::construct;
+ using _Base_type::destroy;
+
+ static _Alloc _S_select_on_copy(const _Alloc& __a)
+ { return _Base_type::select_on_container_copy_construction(__a); }
+
+ static void _S_on_swap(_Alloc& __a, _Alloc& __b)
+ { std::__alloc_on_swap(__a, __b); }
+
+ static constexpr bool _S_propagate_on_copy_assign()
+ { return _Base_type::propagate_on_container_copy_assignment::value; }
+
+ static constexpr bool _S_propagate_on_move_assign()
+ { return _Base_type::propagate_on_container_move_assignment::value; }
+
+ static constexpr bool _S_propagate_on_swap()
+ { return _Base_type::propagate_on_container_swap::value; }
+
+#else
+
+ typedef typename _Alloc::pointer pointer;
+ typedef typename _Alloc::const_pointer const_pointer;
+ typedef typename _Alloc::value_type value_type;
+ typedef typename _Alloc::reference reference;
+ typedef typename _Alloc::const_reference const_reference;
+ typedef typename _Alloc::size_type size_type;
+
+ static pointer
+ allocate(_Alloc& __a, size_type __n)
+ { return __a.allocate(__n); }
+
+ static void deallocate(_Alloc& __a, pointer __p, size_type __n)
+ { __a.deallocate(__p, __n); }
+
+ template<typename _Tp>
+ static void construct(_Alloc& __a, pointer __p, const _Tp& __arg)
+ { __a.construct(__p, __arg); }
+
+ static void destroy(_Alloc& __a, pointer __p)
+ { __a.destroy(__p); }
+
+ static const _Alloc& _S_select_on_copy(const _Alloc& __a) { return __a; }
+
+ static void _S_on_swap(_Alloc& __a, _Alloc& __b)
+ {
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 431. Swapping containers with unequal allocators.
+ std::__alloc_swap<_Alloc>::_S_do_it(__a, __b);
+ }
+#endif
+ };
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
+
+#endif