| //===----------------------------------------------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is dual licensed under the MIT and the University of Illinois Open |
| // Source Licenses. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // UNSUPPORTED: c++98, c++03 |
| |
| // <experimental/memory_resource> |
| |
| // template <class T> class polymorphic_allocator |
| |
| // EXTENSION |
| // std::size_t polymorphic_allocator<T>::max_size() const noexcept |
| |
| #include <experimental/memory_resource> |
| #include <type_traits> |
| #include <cassert> |
| |
| #include "test_memory_resource.hpp" |
| |
| namespace ex = std::experimental::pmr; |
| |
| template <std::size_t S> |
| std::size_t getMaxSize() { |
| using T = typename std::aligned_storage<S>::type; |
| static_assert(sizeof(T) == S, "Required for test"); |
| return ex::polymorphic_allocator<T>{}.max_size(); |
| } |
| |
| template <std::size_t S, std::size_t A> |
| std::size_t getMaxSize() { |
| using T = typename std::aligned_storage<S, A>::type; |
| static_assert(sizeof(T) == S, "Required for test"); |
| return ex::polymorphic_allocator<T>{}.max_size(); |
| } |
| |
| int main() |
| { |
| { |
| using Alloc = ex::polymorphic_allocator<int>; |
| using Traits = std::allocator_traits<Alloc>; |
| const Alloc a; |
| static_assert(std::is_same<decltype(a.max_size()), Traits::size_type>::value, ""); |
| static_assert(noexcept(a.max_size()), ""); |
| } |
| { |
| constexpr std::size_t Max = std::numeric_limits<std::size_t>::max(); |
| assert(getMaxSize<1>() == Max); |
| assert(getMaxSize<2>() == Max / 2); |
| assert(getMaxSize<4>() == Max / 4); |
| assert(getMaxSize<8>() == Max / 8); |
| assert(getMaxSize<16>() == Max / 16); |
| assert(getMaxSize<32>() == Max / 32); |
| assert(getMaxSize<64>() == Max / 64); |
| assert(getMaxSize<1024>() == Max / 1024); |
| |
| assert((getMaxSize<6, 2>() == Max / 6)); |
| assert((getMaxSize<12, 4>() == Max / 12)); |
| } |
| } |