PATH:
usr
/
include
/
c++
/
11
/
bits
// Utility functions for uses-allocator construction -*- C++ -*- // Copyright (C) 2019-2021 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 include/bits/uses_allocator_args.h * This is an internal header file, included by other library headers. * Do not attempt to use it directly. @headername{memory} */ #ifndef _USES_ALLOCATOR_ARGS #define _USES_ALLOCATOR_ARGS 1 #pragma GCC system_header #if __cplusplus > 201703L && __cpp_concepts #include <new> // for placement operator new #include <tuple> // for tuple, make_tuple, make_from_tuple #include <bits/stl_construct.h> // construct_at #include <bits/stl_pair.h> // pair namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> inline constexpr bool __is_pair = false; template<typename _Tp, typename _Up> inline constexpr bool __is_pair<pair<_Tp, _Up>> = true; template<typename _Tp, typename _Up> inline constexpr bool __is_pair<const pair<_Tp, _Up>> = true; template<typename _Tp> concept _Std_pair = __is_pair<_Tp>; /** @addtogroup allocators * @{ */ // Not specified by C++20, used internally #define __cpp_lib_make_obj_using_allocator 201811L template<typename _Tp, typename _Alloc, typename... _Args> constexpr auto uses_allocator_construction_args(const _Alloc& __a, _Args&&... __args) noexcept requires (! _Std_pair<_Tp>) { if constexpr (uses_allocator_v<remove_cv_t<_Tp>, _Alloc>) { if constexpr (is_constructible_v<_Tp, allocator_arg_t, const _Alloc&, _Args...>) { return tuple<allocator_arg_t, const _Alloc&, _Args&&...>( allocator_arg, __a, std::forward<_Args>(__args)...); } else { static_assert(is_constructible_v<_Tp, _Args..., const _Alloc&>, "construction with an allocator must be possible" " if uses_allocator is true"); return tuple<_Args&&..., const _Alloc&>( std::forward<_Args>(__args)..., __a); } } else { static_assert(is_constructible_v<_Tp, _Args...>); return tuple<_Args&&...>(std::forward<_Args>(__args)...); } } template<_Std_pair _Tp, typename _Alloc, typename _Tuple1, typename _Tuple2> constexpr auto uses_allocator_construction_args(const _Alloc& __a, piecewise_construct_t, _Tuple1&& __x, _Tuple2&& __y) noexcept; template<_Std_pair _Tp, typename _Alloc> constexpr auto uses_allocator_construction_args(const _Alloc&) noexcept; template<_Std_pair _Tp, typename _Alloc, typename _Up, typename _Vp> constexpr auto uses_allocator_construction_args(const _Alloc&, _Up&&, _Vp&&) noexcept; template<_Std_pair _Tp, typename _Alloc, typename _Up, typename _Vp> constexpr auto uses_allocator_construction_args(const _Alloc&, const pair<_Up, _Vp>&) noexcept; template<_Std_pair _Tp, typename _Alloc, typename _Up, typename _Vp> constexpr auto uses_allocator_construction_args(const _Alloc&, pair<_Up, _Vp>&&) noexcept; template<_Std_pair _Tp, typename _Alloc, typename _Tuple1, typename _Tuple2> constexpr auto uses_allocator_construction_args(const _Alloc& __a, piecewise_construct_t, _Tuple1&& __x, _Tuple2&& __y) noexcept { using _Tp1 = typename _Tp::first_type; using _Tp2 = typename _Tp::second_type; return std::make_tuple(piecewise_construct, std::apply([&__a](auto&&... __args1) { return std::uses_allocator_construction_args<_Tp1>( __a, std::forward<decltype(__args1)>(__args1)...); }, std::forward<_Tuple1>(__x)), std::apply([&__a](auto&&... __args2) { return std::uses_allocator_construction_args<_Tp2>( __a, std::forward<decltype(__args2)>(__args2)...); }, std::forward<_Tuple2>(__y))); } template<_Std_pair _Tp, typename _Alloc> constexpr auto uses_allocator_construction_args(const _Alloc& __a) noexcept { using _Tp1 = typename _Tp::first_type; using _Tp2 = typename _Tp::second_type; return std::make_tuple(piecewise_construct, std::uses_allocator_construction_args<_Tp1>(__a), std::uses_allocator_construction_args<_Tp2>(__a)); } template<_Std_pair _Tp, typename _Alloc, typename _Up, typename _Vp> constexpr auto uses_allocator_construction_args(const _Alloc& __a, _Up&& __u, _Vp&& __v) noexcept { using _Tp1 = typename _Tp::first_type; using _Tp2 = typename _Tp::second_type; return std::make_tuple(piecewise_construct, std::uses_allocator_construction_args<_Tp1>(__a, std::forward<_Up>(__u)), std::uses_allocator_construction_args<_Tp2>(__a, std::forward<_Vp>(__v))); } template<_Std_pair _Tp, typename _Alloc, typename _Up, typename _Vp> constexpr auto uses_allocator_construction_args(const _Alloc& __a, const pair<_Up, _Vp>& __pr) noexcept { using _Tp1 = typename _Tp::first_type; using _Tp2 = typename _Tp::second_type; return std::make_tuple(piecewise_construct, std::uses_allocator_construction_args<_Tp1>(__a, __pr.first), std::uses_allocator_construction_args<_Tp2>(__a, __pr.second)); } template<_Std_pair _Tp, typename _Alloc, typename _Up, typename _Vp> constexpr auto uses_allocator_construction_args(const _Alloc& __a, pair<_Up, _Vp>&& __pr) noexcept { using _Tp1 = typename _Tp::first_type; using _Tp2 = typename _Tp::second_type; // _GLIBCXX_RESOLVE_LIB_DEFECTS // 3527. uses_allocator_construction_args handles rvalue pairs // of rvalue references incorrectly return std::make_tuple(piecewise_construct, std::uses_allocator_construction_args<_Tp1>(__a, std::get<0>(std::move(__pr))), std::uses_allocator_construction_args<_Tp2>(__a, std::get<1>(std::move(__pr)))); } template<typename _Tp, typename _Alloc, typename... _Args> constexpr _Tp make_obj_using_allocator(const _Alloc& __a, _Args&&... __args) { return std::make_from_tuple<_Tp>( std::uses_allocator_construction_args<_Tp>(__a, std::forward<_Args>(__args)...)); } template<typename _Tp, typename _Alloc, typename... _Args> constexpr _Tp* uninitialized_construct_using_allocator(_Tp* __p, const _Alloc& __a, _Args&&... __args) { return std::apply([&](auto&&... __xs) { return std::construct_at(__p, std::forward<decltype(__xs)>(__xs)...); }, std::uses_allocator_construction_args<_Tp>(__a, std::forward<_Args>(__args)...)); } /// @} _GLIBCXX_END_NAMESPACE_VERSION } // namespace std #endif // C++20 #endif // _USES_ALLOCATOR_ARGS
[+]
..
[-] atomic_futex.h
[edit]
[-] random.h
[edit]
[-] functexcept.h
[edit]
[-] exception.h
[edit]
[-] regex.tcc
[edit]
[-] char_traits.h
[edit]
[-] uses_allocator.h
[edit]
[-] specfun.h
[edit]
[-] regex_automaton.tcc
[edit]
[-] stl_stack.h
[edit]
[-] node_handle.h
[edit]
[-] regex_error.h
[edit]
[-] stl_list.h
[edit]
[-] vector.tcc
[edit]
[-] stl_algobase.h
[edit]
[-] regex_automaton.h
[edit]
[-] cxxabi_init_exception.h
[edit]
[-] basic_ios.tcc
[edit]
[-] deque.tcc
[edit]
[-] fs_fwd.h
[edit]
[-] concept_check.h
[edit]
[-] stl_algo.h
[edit]
[-] functional_hash.h
[edit]
[-] random.tcc
[edit]
[-] fs_path.h
[edit]
[-] max_size_type.h
[edit]
[-] nested_exception.h
[edit]
[-] atomic_base.h
[edit]
[-] charconv.h
[edit]
[-] ostream.tcc
[edit]
[-] predefined_ops.h
[edit]
[-] boost_concept_check.h
[edit]
[-] atomic_lockfree_defines.h
[edit]
[-] stl_construct.h
[edit]
[-] list.tcc
[edit]
[-] locale_classes.tcc
[edit]
[-] uniform_int_dist.h
[edit]
[-] semaphore_base.h
[edit]
[-] mask_array.h
[edit]
[-] ranges_algobase.h
[edit]
[-] stl_heap.h
[edit]
[-] alloc_traits.h
[edit]
[-] string_view.tcc
[edit]
[-] sstream.tcc
[edit]
[-] regex_executor.tcc
[edit]
[-] cpp_type_traits.h
[edit]
[-] stl_map.h
[edit]
[-] hashtable_policy.h
[edit]
[-] regex_scanner.tcc
[edit]
[-] ranges_base.h
[edit]
[-] forward_list.h
[edit]
[-] allocator.h
[edit]
[-] codecvt.h
[edit]
[-] istream.tcc
[edit]
[-] memoryfwd.h
[edit]
[-] stl_vector.h
[edit]
[-] valarray_array.tcc
[edit]
[-] valarray_array.h
[edit]
[-] locale_facets.tcc
[edit]
[-] stl_tree.h
[edit]
[-] atomic_timed_wait.h
[edit]
[-] streambuf_iterator.h
[edit]
[-] unique_lock.h
[edit]
[-] exception_defines.h
[edit]
[-] stl_raw_storage_iter.h
[edit]
[-] locale_facets_nonio.tcc
[edit]
[-] regex.h
[edit]
[-] stl_tempbuf.h
[edit]
[-] unordered_map.h
[edit]
[-] std_mutex.h
[edit]
[-] regex_scanner.h
[edit]
[-] locale_facets_nonio.h
[edit]
[-] basic_string.h
[edit]
[-] locale_classes.h
[edit]
[-] regex_executor.h
[edit]
[-] stl_multiset.h
[edit]
[-] postypes.h
[edit]
[-] stl_multimap.h
[edit]
[-] std_thread.h
[edit]
[-] atomic_wait.h
[edit]
[-] fs_dir.h
[edit]
[-] exception_ptr.h
[edit]
[-] move.h
[edit]
[-] erase_if.h
[edit]
[-] valarray_after.h
[edit]
[-] hash_bytes.h
[edit]
[-] ranges_cmp.h
[edit]
[-] ios_base.h
[edit]
[-] invoke.h
[edit]
[-] stream_iterator.h
[edit]
[-] std_function.h
[edit]
[-] stl_iterator.h
[edit]
[-] slice_array.h
[edit]
[-] stringfwd.h
[edit]
[-] stl_function.h
[edit]
[-] forward_list.tcc
[edit]
[-] stl_iterator_base_funcs.h
[edit]
[-] refwrap.h
[edit]
[-] unordered_set.h
[edit]
[-] stl_uninitialized.h
[edit]
[-] streambuf.tcc
[edit]
[-] algorithmfwd.h
[edit]
[-] range_access.h
[edit]
[-] enable_special_members.h
[edit]
[-] unique_ptr.h
[edit]
[-] localefwd.h
[edit]
[-] quoted_string.h
[edit]
[-] uses_allocator_args.h
[edit]
[-] stl_queue.h
[edit]
[-] gslice_array.h
[edit]
[-] ptr_traits.h
[edit]
[-] ranges_algo.h
[edit]
[-] cxxabi_forced.h
[edit]
[-] std_abs.h
[edit]
[-] align.h
[edit]
[-] regex_compiler.h
[edit]
[-] stl_relops.h
[edit]
[-] indirect_array.h
[edit]
[-] regex_constants.h
[edit]
[-] stl_bvector.h
[edit]
[-] fs_ops.h
[edit]
[-] parse_numbers.h
[edit]
[-] shared_ptr_base.h
[edit]
[-] c++0x_warning.h
[edit]
[-] basic_string.tcc
[edit]
[-] stl_deque.h
[edit]
[-] ranges_uninitialized.h
[edit]
[-] hashtable.h
[edit]
[-] iterator_concepts.h
[edit]
[-] stl_iterator_base_types.h
[edit]
[-] locale_conv.h
[edit]
[-] stl_pair.h
[edit]
[-] shared_ptr_atomic.h
[edit]
[-] ranges_util.h
[edit]
[-] valarray_before.h
[edit]
[-] stl_set.h
[edit]
[-] stl_numeric.h
[edit]
[-] locale_facets.h
[edit]
[-] gslice.h
[edit]
[-] shared_ptr.h
[edit]
[-] ostream_insert.h
[edit]
[-] fstream.tcc
[edit]
[-] this_thread_sleep.h
[edit]
[-] basic_ios.h
[edit]
[-] allocated_ptr.h
[edit]
[-] regex_compiler.tcc
[edit]