/* Copyright (c) 2005-2021 Intel Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #ifndef __TBB_detail__allocator_traits_H #define __TBB_detail__allocator_traits_H #include "_config.h" #include "_template_helpers.h" #include #include namespace tbb { namespace detail { inline namespace d0 { #if !__TBB_CPP17_ALLOCATOR_IS_ALWAYS_EQUAL_PRESENT // Struct is_always_equal_detector provides the member type "type" which is // Allocator::is_always_equal if it is present, std::false_type otherwise template struct is_always_equal_detector { using type = std::false_type; }; template struct is_always_equal_detector> { using type = typename Allocator::is_always_equal; }; #endif // !__TBB_CPP17_ALLOCATOR_IS_ALWAYS_EQUAL_PRESENT template class allocator_traits : public std::allocator_traits { using base_type = std::allocator_traits; public: #if !__TBB_CPP17_ALLOCATOR_IS_ALWAYS_EQUAL_PRESENT using is_always_equal = typename is_always_equal_detector::type; #endif template using rebind_traits = typename tbb::detail::allocator_traits>; }; // struct allocator_traits template void copy_assign_allocators_impl( Allocator& lhs, const Allocator& rhs, /*pocca = */std::true_type ) { lhs = rhs; } template void copy_assign_allocators_impl( Allocator&, const Allocator&, /*pocca = */ std::false_type ) {} // Copy assigns allocators only if propagate_on_container_copy_assignment is true template void copy_assign_allocators( Allocator& lhs, const Allocator& rhs ) { using pocca_type = typename allocator_traits::propagate_on_container_copy_assignment; copy_assign_allocators_impl(lhs, rhs, pocca_type()); } template void move_assign_allocators_impl( Allocator& lhs, Allocator& rhs, /*pocma = */ std::true_type ) { lhs = std::move(rhs); } template void move_assign_allocators_impl( Allocator&, Allocator&, /*pocma = */ std::false_type ) {} // Move assigns allocators only if propagate_on_container_move_assignment is true template void move_assign_allocators( Allocator& lhs, Allocator& rhs ) { using pocma_type = typename allocator_traits::propagate_on_container_move_assignment; move_assign_allocators_impl(lhs, rhs, pocma_type()); } template void swap_allocators_impl( Allocator& lhs, Allocator& rhs, /*pocs = */ std::true_type ) { using std::swap; swap(lhs, rhs); } template void swap_allocators_impl( Allocator&, Allocator&, /*pocs = */ std::false_type ) {} // Swaps allocators only if propagate_on_container_swap is true template void swap_allocators( Allocator& lhs, Allocator& rhs ) { using pocs_type = typename allocator_traits::propagate_on_container_swap; swap_allocators_impl(lhs, rhs, pocs_type()); } } // inline namespace d0 } // namespace detail } // namespace tbb #endif // __TBB_detail__allocator_traits_H