[libcxx] r268829 - Add <experimental/memory_resource>
Eric Fiselier via cfe-commits
cfe-commits at lists.llvm.org
Fri May 6 19:40:28 PDT 2016
Sorry about that. Fixed in r268839.
On Fri, May 6, 2016 at 8:32 PM, Vitaly Buka <vitalybuka at google.com> wrote:
>
> http://lab.llvm.org:8011/builders/libcxx-libcxxabi-x86_64-linux-debian-noexceptions/builds/198/ is
> broken because of this patch
>
> On Fri, May 6, 2016 at 6:10 PM Eric Fiselier via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: ericwf
>> Date: Fri May 6 20:04:55 2016
>> New Revision: 268829
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=268829&view=rev
>> Log:
>> Add <experimental/memory_resource>
>>
>> Reviewers: mclow.lists, EricWF
>>
>> Subscribers: cfe-commits
>>
>> Differential Revision: http://reviews.llvm.org/D20007
>>
>> Added:
>> libcxx/trunk/include/experimental/__memory
>> libcxx/trunk/include/experimental/memory_resource
>> libcxx/trunk/src/experimental/memory_resource.cpp
>> libcxx/trunk/test/libcxx/experimental/memory/
>>
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/
>>
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/
>>
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp
>>
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/db_deallocate.pass.cpp
>>
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/max_size.pass.cpp
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/
>>
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/
>>
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/db_deallocate.pass.cpp
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/
>>
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp
>>
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/
>>
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/version.pass.cpp
>> libcxx/trunk/test/std/experimental/memory/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/assign.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/copy.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/default.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/memory_resource_convert.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/other_alloc.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/equal.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/not_equal.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/allocate.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_pair.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_pair_const_lvalue_pair.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_pair_rvalue.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_pair_values.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_types.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/deallocate.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/destroy.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/resource.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/select_on_container_copy_construction.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.overview/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.overview/nothing_to_do.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/nothing_to_do.pass.cpp
>> libcxx/trunk/test/std/experimental/memory/memory.resource/
>> libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.ctor/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.ctor/alloc_copy.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.ctor/alloc_move.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.ctor/default.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/do_allocate_and_deallocate.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/do_is_equal.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.overview/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.overview/overview.pass.cpp
>> libcxx/trunk/test/std/experimental/memory/memory.resource.global/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.global/default_resource.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.global/new_delete_resource.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.global/null_memory_resource.pass.cpp
>> libcxx/trunk/test/std/experimental/memory/memory.resource.synop/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource.synop/nothing_to_do.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/construct.fail.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.eq/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.eq/equal.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.eq/not_equal.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.overview/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.overview/nothing_to_do.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.priv/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.priv/protected_members.fail.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.public/
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.public/allocate.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.public/deallocate.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.public/dtor.pass.cpp
>>
>> libcxx/trunk/test/std/experimental/memory/memory.resource/memory.resource.public/is_equal.pass.cpp
>> libcxx/trunk/test/std/experimental/memory/nothing_to_do.pass.cpp
>> libcxx/trunk/test/support/test_memory_resource.hpp
>> libcxx/trunk/test/support/type_id.h
>> libcxx/trunk/test/support/uses_alloc_types.hpp
>> Removed:
>> libcxx/trunk/src/experimental/placeholder.cpp
>> Modified:
>> libcxx/trunk/include/exception
>> libcxx/trunk/include/experimental/__config
>>
>> Modified: libcxx/trunk/include/exception
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/exception?rev=268829&r1=268828&r2=268829&view=diff
>>
>> ==============================================================================
>> --- libcxx/trunk/include/exception (original)
>> +++ libcxx/trunk/include/exception Fri May 6 20:04:55 2016
>> @@ -80,6 +80,10 @@ template <class E> void rethrow_if_neste
>> #include <__config>
>> #include <cstddef>
>> #include <type_traits>
>> +#if defined(_LIBCPP_HAS_NO_EXCEPTIONS)
>> +#include <cstdio>
>> +#include <cstdlib>
>> +#endif
>>
>> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
>> #pragma GCC system_header
>> @@ -251,4 +255,19 @@ rethrow_if_nested(const _Ep&, typename e
>>
>> } // std
>>
>> +_LIBCPP_BEGIN_NAMESPACE_STD
>> +
>> +template <class _Exception>
>> +_LIBCPP_INLINE_VISIBILITY
>> +inline void __libcpp_throw(_Exception const& __e) {
>> +#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
>> + throw __e;
>> +#else
>> + _VSTD::fprintf(stderr, "%s\n", __e.what());
>> + _VSTD::abort();
>> +#endif
>> +}
>> +
>> +_LIBCPP_END_NAMESPACE_STD
>> +
>> #endif // _LIBCPP_EXCEPTION
>>
>> Modified: libcxx/trunk/include/experimental/__config
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/__config?rev=268829&r1=268828&r2=268829&view=diff
>>
>> ==============================================================================
>> --- libcxx/trunk/include/experimental/__config (original)
>> +++ libcxx/trunk/include/experimental/__config Fri May 6 20:04:55 2016
>> @@ -25,6 +25,10 @@
>> #define _LIBCPP_END_NAMESPACE_LFTS } } }
>> #define _VSTD_LFTS _VSTD_EXPERIMENTAL::fundamentals_v1
>>
>> +#define _LIBCPP_BEGIN_NAMESPACE_LFTS_PMR _LIBCPP_BEGIN_NAMESPACE_LFTS
>> namespace pmr {
>> +#define _LIBCPP_END_NAMESPACE_LFTS_PMR _LIBCPP_END_NAMESPACE_LFTS }
>> +#define _VSTD_LFTS_PMR _VSTD_LFTS::pmr
>> +
>> #define _LIBCPP_BEGIN_NAMESPACE_CHRONO_LFTS _LIBCPP_BEGIN_NAMESPACE_STD
>> \
>> namespace chrono { namespace experimental { inline namespace
>> fundamentals_v1 {
>> #define _LIBCPP_END_NAMESPACE_CHRONO_LFTS _LIBCPP_END_NAMESPACE_STD } } }
>>
>> Added: libcxx/trunk/include/experimental/__memory
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/__memory?rev=268829&view=auto
>>
>> ==============================================================================
>> --- libcxx/trunk/include/experimental/__memory (added)
>> +++ libcxx/trunk/include/experimental/__memory Fri May 6 20:04:55 2016
>> @@ -0,0 +1,90 @@
>> +// -*- C++ -*-
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef _LIBCPP_EXPERIMENTAL___MEMORY
>> +#define _LIBCPP_EXPERIMENTAL___MEMORY
>> +
>> +#include <experimental/__config>
>> +#include <experimental/utility> // for erased_type
>> +#include <__functional_base>
>> +#include <type_traits>
>> +
>> +_LIBCPP_BEGIN_NAMESPACE_LFTS
>> +
>> +template <
>> + class _Tp, class _Alloc
>> + , bool = uses_allocator<_Tp, _Alloc>::value
>> + , bool = __has_allocator_type<_Tp>::value
>> + >
>> +struct __lfts_uses_allocator : public false_type {};
>> +
>> +template <class _Tp, class _Alloc>
>> +struct __lfts_uses_allocator<_Tp, _Alloc, false, false> : public
>> false_type {};
>> +
>> +template <class _Tp, class _Alloc, bool HasAlloc>
>> +struct __lfts_uses_allocator<_Tp, _Alloc, true, HasAlloc> : public
>> true_type {};
>> +
>> +template <class _Tp, class _Alloc>
>> +struct __lfts_uses_allocator<_Tp, _Alloc, false, true>
>> + : public integral_constant<bool
>> + , is_convertible<_Alloc, typename _Tp::allocator_type>::value
>> + || is_same<erased_type, typename _Tp::allocator_type>::value
>> + >
>> +{};
>> +
>> +template <bool _UsesAlloc, class _Tp, class _Alloc, class ..._Args>
>> +struct __lfts_uses_alloc_ctor_imp
>> +{
>> + static const int value = 0;
>> +};
>> +
>> +template <class _Tp, class _Alloc, class ..._Args>
>> +struct __lfts_uses_alloc_ctor_imp<true, _Tp, _Alloc, _Args...>
>> +{
>> + static const bool __ic_first
>> + = is_constructible<_Tp, allocator_arg_t, _Alloc,
>> _Args...>::value;
>> +
>> + static const bool __ic_second =
>> + conditional<
>> + __ic_first,
>> + false_type,
>> + is_constructible<_Tp, _Args..., _Alloc>
>> + >::type::value;
>> +
>> + static_assert(__ic_first || __ic_second,
>> + "Request for uses allocator construction is
>> ill-formed");
>> +
>> + static const int value = __ic_first ? 1 : 2;
>> +};
>> +
>> +template <class _Tp, class _Alloc, class ..._Args>
>> +struct __lfts_uses_alloc_ctor
>> + : integral_constant<int,
>> + __lfts_uses_alloc_ctor_imp<
>> + __lfts_uses_allocator<_Tp, _Alloc>::value
>> + , _Tp, _Alloc, _Args...
>> + >::value
>> + >
>> +{};
>> +
>> +template <class _Tp, class _Alloc, class ..._Args>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +void __lfts_user_alloc_construct(
>> + _Tp * __store, const _Alloc & __a, _Args &&... __args)
>> +{
>> + _VSTD::__user_alloc_construct_impl(
>> + typename __lfts_uses_alloc_ctor<_Tp, _Alloc, _Args...>::type()
>> + , __store, __a, _VSTD::forward<_Args>(__args)...
>> + );
>> +}
>> +
>> +_LIBCPP_END_NAMESPACE_LFTS
>> +
>> +#endif /* _LIBCPP_EXPERIMENTAL___MEMORY */
>>
>> Added: libcxx/trunk/include/experimental/memory_resource
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/memory_resource?rev=268829&view=auto
>>
>> ==============================================================================
>> --- libcxx/trunk/include/experimental/memory_resource (added)
>> +++ libcxx/trunk/include/experimental/memory_resource Fri May 6 20:04:55
>> 2016
>> @@ -0,0 +1,422 @@
>> +// -*- C++ -*-
>> +//===------------------------ memory_resource
>> -----------------------------===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE
>> +#define _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE
>> +
>> +/**
>> + experimental/memory_resource synopsis
>> +
>> +// C++1y
>> +
>> +namespace std {
>> +namespace experimental {
>> +inline namespace fundamentals_v1 {
>> +namespace pmr {
>> +
>> + class memory_resource;
>> +
>> + bool operator==(const memory_resource& a,
>> + const memory_resource& b) noexcept;
>> + bool operator!=(const memory_resource& a,
>> + const memory_resource& b) noexcept;
>> +
>> + template <class Tp> class polymorphic_allocator;
>> +
>> + template <class T1, class T2>
>> + bool operator==(const polymorphic_allocator<T1>& a,
>> + const polymorphic_allocator<T2>& b) noexcept;
>> + template <class T1, class T2>
>> + bool operator!=(const polymorphic_allocator<T1>& a,
>> + const polymorphic_allocator<T2>& b) noexcept;
>> +
>> + // The name resource_adaptor_imp is for exposition only.
>> + template <class Allocator> class resource_adaptor_imp;
>> +
>> + template <class Allocator>
>> + using resource_adaptor = resource_adaptor_imp<
>> + allocator_traits<Allocator>::rebind_alloc<char>>;
>> +
>> + // Global memory resources
>> + memory_resource* new_delete_resource() noexcept;
>> + memory_resource* null_memory_resource() noexcept;
>> +
>> + // The default memory resource
>> + memory_resource* set_default_resource(memory_resource* r) noexcept;
>> + memory_resource* get_default_resource() noexcept;
>> +
>> + // Standard memory resources
>> + struct pool_options;
>> + class synchronized_pool_resource;
>> + class unsynchronized_pool_resource;
>> + class monotonic_buffer_resource;
>> +
>> +} // namespace pmr
>> +} // namespace fundamentals_v1
>> +} // namespace experimental
>> +} // namespace std
>> +
>> + */
>> +
>> +#include <experimental/__config>
>> +#include <experimental/__memory>
>> +#include <limits>
>> +#include <memory>
>> +#include <new>
>> +#include <stdexcept>
>> +#include <tuple>
>> +#include <type_traits>
>> +#include <utility>
>> +#include <cstddef>
>> +#include <cstdlib>
>> +#include <__debug>
>> +
>> +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
>> +#pragma GCC system_header
>> +#endif
>> +
>> +_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
>> +
>> +// Round __s up to next multiple of __a.
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +size_t __aligned_allocation_size(size_t __s, size_t __a) _NOEXCEPT
>> +{
>> + _LIBCPP_ASSERT(__s + __a > __s, "aligned allocation size overflows");
>> + return (__s + __a - 1) & ~(__a - 1);
>> +}
>> +
>> +// 8.5, memory.resource
>> +class _LIBCPP_TYPE_VIS_ONLY memory_resource
>> +{
>> + static const size_t __max_align = alignof(max_align_t);
>> +
>> +// 8.5.2, memory.resource.public
>> +public:
>> + virtual ~memory_resource() = default;
>> +
>> + _LIBCPP_INLINE_VISIBILITY
>> + void* allocate(size_t __bytes, size_t __align = __max_align)
>> + { return do_allocate(__bytes, __align); }
>> +
>> + _LIBCPP_INLINE_VISIBILITY
>> + void deallocate(void * __p, size_t __bytes, size_t __align =
>> __max_align)
>> + { do_deallocate(__p, __bytes, __align); }
>> +
>> + _LIBCPP_INLINE_VISIBILITY
>> + bool is_equal(memory_resource const & __other) const _NOEXCEPT
>> + { return do_is_equal(__other); }
>> +
>> +// 8.5.3, memory.resource.priv
>> +protected:
>> + virtual void* do_allocate(size_t, size_t) = 0;
>> + virtual void do_deallocate(void*, size_t, size_t) = 0;
>> + virtual bool do_is_equal(memory_resource const &) const _NOEXCEPT =
>> 0;
>> +};
>> +
>> +// 8.5.4, memory.resource.eq
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +bool operator==(memory_resource const & __lhs,
>> + memory_resource const & __rhs) _NOEXCEPT
>> +{
>> + return &__lhs == &__rhs || __lhs.is_equal(__rhs);
>> +}
>> +
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +bool operator!=(memory_resource const & __lhs,
>> + memory_resource const & __rhs) _NOEXCEPT
>> +{
>> + return !(__lhs == __rhs);
>> +}
>> +
>> +_LIBCPP_FUNC_VIS
>> +memory_resource * new_delete_resource() _NOEXCEPT;
>> +
>> +_LIBCPP_FUNC_VIS
>> +memory_resource * null_memory_resource() _NOEXCEPT;
>> +
>> +_LIBCPP_FUNC_VIS
>> +memory_resource * get_default_resource() _NOEXCEPT;
>> +
>> +_LIBCPP_FUNC_VIS
>> +memory_resource * set_default_resource(memory_resource * __new_res)
>> _NOEXCEPT;
>> +
>> +// 8.6, memory.polymorphic.allocator.class
>> +
>> +// 8.6.1, memory.polymorphic.allocator.overview
>> +template <class _ValueType>
>> +class _LIBCPP_TYPE_VIS_ONLY polymorphic_allocator
>> +{
>> +public:
>> + typedef _ValueType value_type;
>> +
>> + // 8.6.2, memory.polymorphic.allocator.ctor
>> + _LIBCPP_INLINE_VISIBILITY
>> + polymorphic_allocator() _NOEXCEPT
>> + : __res_(_VSTD_LFTS_PMR::get_default_resource())
>> + {}
>> +
>> + _LIBCPP_INLINE_VISIBILITY
>> + polymorphic_allocator(memory_resource * __r) _NOEXCEPT
>> + : __res_(__r)
>> + {}
>> +
>> + polymorphic_allocator(polymorphic_allocator const &) = default;
>> +
>> + template <class _Tp>
>> + _LIBCPP_INLINE_VISIBILITY
>> + polymorphic_allocator(polymorphic_allocator<_Tp> const & __other)
>> _NOEXCEPT
>> + : __res_(__other.resource())
>> + {}
>> +
>> + polymorphic_allocator &
>> + operator=(polymorphic_allocator const &) = default;
>> +
>> + // 8.6.3, memory.polymorphic.allocator.mem
>> + _LIBCPP_INLINE_VISIBILITY
>> + _ValueType* allocate(size_t __n) {
>> + if (__n > max_size()) {
>> + __libcpp_throw(length_error(
>> +
>> "std::experimental::pmr::polymorphic_allocator<T>::allocate(size_t n)"
>> + " 'n' exceeds maximum supported size"));
>> + }
>> + return static_cast<_ValueType*>(
>> + __res_->allocate(__n * sizeof(_ValueType),
>> alignof(_ValueType))
>> + );
>> + }
>> +
>> + _LIBCPP_INLINE_VISIBILITY
>> + void deallocate(_ValueType * __p, size_t __n) _NOEXCEPT {
>> + _LIBCPP_ASSERT(__n <= max_size(),
>> + "deallocate called for size which exceeds
>> max_size()");
>> + __res_->deallocate(__p, __n * sizeof(_ValueType),
>> alignof(_ValueType));
>> + }
>> +
>> + template <class _Tp, class ..._Ts>
>> + _LIBCPP_INLINE_VISIBILITY
>> + void construct(_Tp* __p, _Ts &&... __args)
>> + {
>> + _VSTD_LFTS::__lfts_user_alloc_construct(
>> + __p, resource(), _VSTD::forward<_Ts>(__args)...
>> + );
>> + }
>> +
>> + template <class _T1, class _T2, class ..._Args1, class ..._Args2>
>> + _LIBCPP_INLINE_VISIBILITY
>> + void construct(pair<_T1, _T2>* __p, piecewise_construct_t,
>> + tuple<_Args1...> __x, tuple<_Args2...> __y)
>> + {
>> + ::new ((void*)__p) pair<_T1, _T2>(piecewise_construct
>> + , __transform_tuple(
>> + typename __lfts_uses_alloc_ctor<
>> + _T1, memory_resource*, _Args1...
>> + >::type()
>> + , _VSTD::move(__x)
>> + , typename __make_tuple_indices<sizeof...(_Args1)>::type{}
>> + )
>> + , __transform_tuple(
>> + typename __lfts_uses_alloc_ctor<
>> + _T2, memory_resource*, _Args2...
>> + >::type()
>> + , _VSTD::move(__y)
>> + , typename __make_tuple_indices<sizeof...(_Args2)>::type{}
>> + )
>> + );
>> + }
>> +
>> + template <class _T1, class _T2>
>> + _LIBCPP_INLINE_VISIBILITY
>> + void construct(pair<_T1, _T2>* __p) {
>> + construct(__p, piecewise_construct, tuple<>(), tuple<>());
>> + }
>> +
>> + template <class _T1, class _T2, class _Up, class _Vp>
>> + _LIBCPP_INLINE_VISIBILITY
>> + void construct(pair<_T1, _T2> * __p, _Up && __u, _Vp && __v) {
>> + construct(__p, piecewise_construct
>> + , _VSTD::forward_as_tuple(_VSTD::forward<_Up>(__u))
>> + , _VSTD::forward_as_tuple(_VSTD::forward<_Vp>(__v)));
>> + }
>> +
>> + template <class _T1, class _T2, class _U1, class _U2>
>> + _LIBCPP_INLINE_VISIBILITY
>> + void construct(pair<_T1, _T2> * __p, pair<_U1, _U2> const & __pr) {
>> + construct(__p, piecewise_construct
>> + , _VSTD::forward_as_tuple(__pr.first)
>> + , _VSTD::forward_as_tuple(__pr.second));
>> + }
>> +
>> + template <class _T1, class _T2, class _U1, class _U2>
>> + _LIBCPP_INLINE_VISIBILITY
>> + void construct(pair<_T1, _T2> * __p, pair<_U1, _U2> && __pr){
>> + construct(__p, piecewise_construct
>> + , _VSTD::forward_as_tuple(_VSTD::forward<_U1>(__pr.first))
>> + , _VSTD::forward_as_tuple(_VSTD::forward<_U2>(__pr.second)));
>> + }
>> +
>> + template <class _Tp>
>> + _LIBCPP_INLINE_VISIBILITY
>> + void destroy(_Tp * __p) _NOEXCEPT
>> + { __p->~_Tp(); }
>> +
>> + _LIBCPP_INLINE_VISIBILITY
>> + size_t max_size() const _NOEXCEPT
>> + { return numeric_limits<size_t>::max() / sizeof(value_type); }
>> +
>> + _LIBCPP_INLINE_VISIBILITY
>> + polymorphic_allocator
>> + select_on_container_copy_construction() const _NOEXCEPT
>> + { return polymorphic_allocator(); }
>> +
>> + _LIBCPP_INLINE_VISIBILITY
>> + memory_resource * resource() const _NOEXCEPT
>> + { return __res_; }
>> +
>> +private:
>> + template <class ..._Args, size_t ..._Idx>
>> + _LIBCPP_INLINE_VISIBILITY
>> + tuple<_Args&&...>
>> + __transform_tuple(integral_constant<int, 0>, tuple<_Args...>&& __t,
>> + __tuple_indices<_Idx...>) const
>> + {
>> + return
>> _VSTD::forward_as_tuple(_VSTD::get<_Idx>(_VSTD::move(__t))...);
>> + }
>> +
>> + template <class ..._Args, size_t ..._Idx>
>> + _LIBCPP_INLINE_VISIBILITY
>> + tuple<allocator_arg_t const&, memory_resource*, _Args&&...>
>> + __transform_tuple(integral_constant<int, 1>, tuple<_Args...> && __t,
>> + __tuple_indices<_Idx...>) const
>> + {
>> + using _Tup = tuple<allocator_arg_t const&, memory_resource*,
>> _Args&&...>;
>> + return _Tup(allocator_arg, resource(),
>> + _VSTD::get<_Idx>(_VSTD::move(__t))...);
>> + }
>> +
>> + template <class ..._Args, size_t ..._Idx>
>> + _LIBCPP_INLINE_VISIBILITY
>> + tuple<_Args&&..., memory_resource*>
>> + __transform_tuple(integral_constant<int, 2>, tuple<_Args...> && __t,
>> + __tuple_indices<_Idx...>) const
>> + {
>> + using _Tup = tuple<_Args&&..., memory_resource*>;
>> + return _Tup(_VSTD::get<_Idx>(_VSTD::move(__t))..., resource());
>> + }
>> +
>> + memory_resource * __res_;
>> +};
>> +
>> +// 8.6.4, memory.polymorphic.allocator.eq
>> +
>> +template <class _Tp, class _Up>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +bool operator==(polymorphic_allocator<_Tp> const & __lhs,
>> + polymorphic_allocator<_Up> const & __rhs) _NOEXCEPT
>> +{
>> + return *__lhs.resource() == *__rhs.resource();
>> +}
>> +
>> +template <class _Tp, class _Up>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +bool operator!=(polymorphic_allocator<_Tp> const & __lhs,
>> + polymorphic_allocator<_Up> const & __rhs) _NOEXCEPT
>> +{
>> + return !(__lhs == __rhs);
>> +}
>> +
>> +// 8.7, memory.resource.adaptor
>> +
>> +// 8.7.1, memory.resource.adaptor.overview
>> +template <class _CharAlloc>
>> +class _LIBCPP_TYPE_VIS_ONLY __resource_adaptor_imp
>> + : public memory_resource
>> +{
>> + using _CTraits = allocator_traits<_CharAlloc>;
>> + static_assert(is_same<typename _CTraits::value_type, char>::value
>> + && is_same<typename _CTraits::pointer, char*>::value
>> + && is_same<typename _CTraits::void_pointer,
>> void*>::value, "");
>> +
>> + static const size_t _MaxAlign = alignof(max_align_t);
>> +
>> + using _Alloc = typename _CTraits::template rebind_alloc<
>> + typename aligned_storage<_MaxAlign, _MaxAlign>::type
>> + >;
>> +
>> + using _ValueType = typename _Alloc::value_type;
>> +
>> + _Alloc __alloc_;
>> +
>> +public:
>> + typedef _CharAlloc allocator_type;
>> +
>> + __resource_adaptor_imp() = default;
>> + __resource_adaptor_imp(__resource_adaptor_imp const &) = default;
>> + __resource_adaptor_imp(__resource_adaptor_imp &&) = default;
>> +
>> + // 8.7.2, memory.resource.adaptor.ctor
>> +
>> + _LIBCPP_INLINE_VISIBILITY
>> + explicit __resource_adaptor_imp(allocator_type const & __a)
>> + : __alloc_(__a)
>> + {}
>> +
>> + _LIBCPP_INLINE_VISIBILITY
>> + explicit __resource_adaptor_imp(allocator_type && __a)
>> + : __alloc_(_VSTD::move(__a))
>> + {}
>> +
>> + __resource_adaptor_imp &
>> + operator=(__resource_adaptor_imp const &) = default;
>> +
>> + _LIBCPP_INLINE_VISIBILITY
>> + allocator_type get_allocator() const
>> + { return __alloc_; }
>> +
>> +// 8.7.3, memory.resource.adaptor.mem
>> +protected:
>> + virtual void * do_allocate(size_t __bytes, size_t)
>> + {
>> + if (__bytes > __max_size()) {
>> + __libcpp_throw(length_error(
>> +
>> "std::experimental::pmr::resource_adaptor<T>::do_allocate(size_t bytes,
>> size_t align)"
>> + " 'bytes' exceeds maximum supported size"));
>> + }
>> + size_t __s = __aligned_allocation_size(__bytes, _MaxAlign) /
>> _MaxAlign;
>> + return __alloc_.allocate(__s);
>> + }
>> +
>> + virtual void do_deallocate(void * __p, size_t __bytes, size_t)
>> + {
>> + _LIBCPP_ASSERT(__bytes <= __max_size(),
>> + "do_deallocate called for size which exceeds the maximum
>> allocation size");
>> + size_t __s = __aligned_allocation_size(__bytes, _MaxAlign) /
>> _MaxAlign;
>> + __alloc_.deallocate((_ValueType*)__p, __s);
>> + }
>> +
>> + virtual bool do_is_equal(memory_resource const & __other) const
>> _NOEXCEPT {
>> + __resource_adaptor_imp const * __p
>> + = dynamic_cast<__resource_adaptor_imp const *>(&__other);
>> + return __p ? __alloc_ == __p->__alloc_ : false;
>> + }
>> +
>> +private:
>> + _LIBCPP_INLINE_VISIBILITY
>> + size_t __max_size() const _NOEXCEPT {
>> + return numeric_limits<size_t>::max() - _MaxAlign;
>> + }
>> +};
>> +
>> +template <class _Alloc>
>> +using resource_adaptor = __resource_adaptor_imp<
>> + typename allocator_traits<_Alloc>::template rebind_alloc<char>
>> + >;
>> +
>> +_LIBCPP_END_NAMESPACE_LFTS_PMR
>> +
>> +#endif /* _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE */
>>
>> Added: libcxx/trunk/src/experimental/memory_resource.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/experimental/memory_resource.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> --- libcxx/trunk/src/experimental/memory_resource.cpp (added)
>> +++ libcxx/trunk/src/experimental/memory_resource.cpp Fri May 6 20:04:55
>> 2016
>> @@ -0,0 +1,129 @@
>> +//===------------------------ memory_resource.cpp
>> -------------------------===//
>> +//
>> +// 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.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "experimental/memory_resource"
>> +
>> +#ifndef _LIBCPP_HAS_NO_ATOMIC_HEADER
>> +#include "atomic"
>> +#else
>> +#include "mutex"
>> +#endif
>> +
>> +_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
>> +
>> +// memory_resource
>> +
>> +//memory_resource::~memory_resource() {}
>> +
>> +// new_delete_resource()
>> +
>> +class _LIBCPP_TYPE_VIS_ONLY __new_delete_memory_resource_imp
>> + : public memory_resource
>> +{
>> +public:
>> + ~__new_delete_memory_resource_imp() = default;
>> +
>> +protected:
>> + virtual void* do_allocate(size_t __size, size_t __align)
>> + { return __allocate(__size); }
>> +
>> + virtual void do_deallocate(void * __p, size_t, size_t)
>> + { __deallocate(__p); }
>> +
>> + virtual bool do_is_equal(memory_resource const & __other) const
>> _NOEXCEPT
>> + { return &__other == this; }
>> +};
>> +
>> +// null_memory_resource()
>> +
>> +class _LIBCPP_TYPE_VIS_ONLY __null_memory_resource_imp
>> + : public memory_resource
>> +{
>> +public:
>> + ~__null_memory_resource_imp() = default;
>> +
>> +protected:
>> + virtual void* do_allocate(size_t, size_t) {
>> +#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
>> + throw std::bad_alloc();
>> +#else
>> + abort();
>> +#endif
>> + }
>> + virtual void do_deallocate(void *, size_t, size_t) {}
>> + virtual bool do_is_equal(memory_resource const & __other) const
>> _NOEXCEPT
>> + { return &__other == this; }
>> +};
>> +
>> +union ResourceInitHelper {
>> + struct {
>> + __new_delete_memory_resource_imp new_delete_res;
>> + __null_memory_resource_imp null_res;
>> + } resources;
>> + char dummy;
>> + _LIBCPP_CONSTEXPR_AFTER_CXX11 ResourceInitHelper() : resources() {}
>> + ~ResourceInitHelper() {}
>> +};
>> +// When compiled in C++14 this initialization should be a constant
>> expression.
>> +// Only in C++11 is "init_priority" needed to ensure initialization
>> order.
>> +ResourceInitHelper res_init __attribute__((init_priority (101)));
>> +
>> +memory_resource * new_delete_resource() _NOEXCEPT {
>> + return &res_init.resources.new_delete_res;
>> +}
>> +
>> +memory_resource * null_memory_resource() _NOEXCEPT {
>> + return &res_init.resources.null_res;
>> +}
>> +
>> +// default_memory_resource()
>> +
>> +static memory_resource *
>> +__default_memory_resource(bool set = false, memory_resource * new_res =
>> nullptr) _NOEXCEPT
>> +{
>> +#ifndef _LIBCPP_HAS_NO_ATOMIC_HEADER
>> + static atomic<memory_resource*> __res =
>> + ATOMIC_VAR_INIT(&res_init.resources.new_delete_res);
>> + if (set) {
>> + new_res = new_res ? new_res : new_delete_resource();
>> + // TODO: Can a weaker ordering be used?
>> + return _VSTD::atomic_exchange_explicit(
>> + &__res, new_res, memory_order::memory_order_acq_rel);
>> + }
>> + else {
>> + return _VSTD::atomic_load_explicit(
>> + &__res, memory_order::memory_order_acquire);
>> + }
>> +#else
>> + static memory_resource * res = &res_init.resources.new_delete_res;
>> + static mutex res_lock;
>> + if (set) {
>> + new_res = new_res ? new_res : new_delete_resource();
>> + lock_guard<mutex> guard(res_lock);
>> + memory_resource * old_res = res;
>> + res = new_res;
>> + return old_res;
>> + } else {
>> + lock_guard<mutex> guard(res_lock);
>> + return res;
>> + }
>> +#endif
>> +}
>> +
>> +memory_resource * get_default_resource() _NOEXCEPT
>> +{
>> + return __default_memory_resource();
>> +}
>> +
>> +memory_resource * set_default_resource(memory_resource * __new_res)
>> _NOEXCEPT
>> +{
>> + return __default_memory_resource(true, __new_res);
>> +}
>> +
>> +_LIBCPP_END_NAMESPACE_LFTS_PMR
>> \ No newline at end of file
>>
>> Removed: libcxx/trunk/src/experimental/placeholder.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/experimental/placeholder.cpp?rev=268828&view=auto
>>
>> ==============================================================================
>> --- libcxx/trunk/src/experimental/placeholder.cpp (original)
>> +++ libcxx/trunk/src/experimental/placeholder.cpp (removed)
>> @@ -1,14 +0,0 @@
>> -//===--------------------------- TODO.cpp
>> ---------------------------------===//
>> -//
>> -// 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.
>> -//
>>
>> -//===----------------------------------------------------------------------===//
>> -
>> -#include "experimental/__config"
>> -
>> -_LIBCPP_BEGIN_NAMESPACE_LFTS
>> -
>> -_LIBCPP_END_NAMESPACE_LFTS
>>
>> Added:
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/construct_piecewise_pair.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,178 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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
>> +
>> +// template <class U1, class U2, class ...Args1, class ...Args2>
>> +// void polymorphic_allocator<T>::construct(pair<T1, T2>*,
>> piecewise_construct_t
>> +// tuple<Args1...> x,
>> tuple<Args2...>)
>> +
>> +// The stardard specifiers a tranformation to uses-allocator
>> construction as
>> +// follows:
>> +// - If uses_allocator_v<T1,memory_resource*> is false and
>> +// is_constructible_v<T,Args1...> is true, then xprime is x.
>> +// - Otherwise, if uses_allocator_v<T1,memory_resource*> is true and
>> +// is_constructible_v<T1,allocator_arg_t,memory_resource*,Args1...>
>> is true,
>> +// then xprime is
>> +// tuple_cat(make_tuple(allocator_arg, this->resource()),
>> std::move(x)).
>> +// - Otherwise, if uses_allocator_v<T1,memory_resource*> is true and
>> +// is_constructible_v<T1,Args1...,memory_resource*> is true, then
>> xprime is
>> +// tuple_cat(std::move(x), make_tuple(this->resource())).
>> +// - Otherwise the program is ill formed.
>> +//
>> +// The use of "xprime = tuple_cat(..., std::move(x), ...)" causes all of
>> the
>> +// objects in 'x' to be copied into 'xprime'. If 'x' contains any types
>> which
>> +// are stored by value this causes an unessary copy to occur. To prevent
>> this
>> +// libc++ changes this call into
>> +// "xprime = forward_as_tuple(..., std::get<Idx>(std::move(x))..., ...)".
>> +// 'xprime' contains references to the values in 'x' instead of copying
>> them.
>> +
>> +// This test checks the number of copies incurred to the elements in
>> +// 'tuple<Args1...>' and 'tuple<Args2...>'.
>> +
>> +#include <experimental/memory_resource>
>> +#include <type_traits>
>> +#include <utility>
>> +#include <tuple>
>> +#include <cassert>
>> +#include <cstdlib>
>> +#include "test_memory_resource.hpp"
>> +
>> +namespace ex = std::experimental::pmr;
>> +
>> +template <class T>
>> +struct TestHarness {
>> + TestResource R;
>> + ex::memory_resource * M = &R;
>> + ex::polymorphic_allocator<T> A = M;
>> + bool constructed = false;
>> + T * ptr;
>> +
>> + TestHarness() : ptr(A.allocate(1)) {}
>> +
>> + template <class ...Args>
>> + void construct(Args&&... args) {
>> + A.construct(ptr, std::forward<Args>(args)...);
>> + constructed = true;
>> + }
>> +
>> + ~TestHarness() {
>> + if (constructed) A.destroy(ptr);
>> + A.deallocate(ptr, 1);
>> + }
>> +};
>> +
>> +struct CountCopies {
>> + int count;
>> + CountCopies() : count(0) {}
>> + CountCopies(CountCopies const& o) : count(o.count + 1) {}
>> +};
>> +
>> +struct CountCopiesAllocV1 {
>> + typedef ex::memory_resource* allocator_type;
>> + allocator_type alloc;
>> + int count;
>> + CountCopiesAllocV1() : alloc(nullptr), count(0) {}
>> + CountCopiesAllocV1(std::allocator_arg_t, allocator_type const& a,
>> + CountCopiesAllocV1 const& o) : alloc(a),
>> count(o.count + 1)
>> + {}
>> +
>> + CountCopiesAllocV1(CountCopiesAllocV1 const& o) : count(o.count + 1) {}
>> +};
>> +
>> +
>> +struct CountCopiesAllocV2 {
>> + typedef ex::memory_resource* allocator_type;
>> + allocator_type alloc;
>> + int count;
>> + CountCopiesAllocV2() : alloc(nullptr), count(0) {}
>> + CountCopiesAllocV2(CountCopiesAllocV2 const& o, allocator_type const&
>> a)
>> + : alloc(a), count(o.count + 1)
>> + { }
>> +
>> + CountCopiesAllocV2(CountCopiesAllocV2 const& o) : count(o.count + 1) {}
>> +};
>> +
>> +
>> +int main()
>> +{
>> + using PMR = ex::memory_resource*;
>> + using PMA = ex::polymorphic_allocator<char>;
>> +
>> + {
>> + using T = CountCopies;
>> + using U = CountCopiesAllocV1;
>> + using P = std::pair<T, U>;
>> + using TH = TestHarness<P>;
>> +
>> + std::tuple<T> t1;
>> + std::tuple<U> t2;
>> +
>> + TestHarness<P> h;
>> + h.construct(std::piecewise_construct, t1, t2);
>> + P const& p = *h.ptr;
>> + assert(p.first.count == 2);
>> + assert(p.second.count == 2);
>> + assert(p.second.alloc == h.M);
>> + }
>> + {
>> + using T = CountCopiesAllocV1;
>> + using U = CountCopiesAllocV2;
>> + using P = std::pair<T, U>;
>> + using TH = TestHarness<P>;
>> +
>> + std::tuple<T> t1;
>> + std::tuple<U> t2;
>> +
>> + TestHarness<P> h;
>> + h.construct(std::piecewise_construct, std::move(t1),
>> std::move(t2));
>> + P const& p = *h.ptr;
>> + assert(p.first.count == 2);
>> + assert(p.first.alloc == h.M);
>> + assert(p.second.count == 2);
>> + assert(p.second.alloc == h.M);
>> + }
>> + {
>> + using T = CountCopiesAllocV2;
>> + using U = CountCopiesAllocV1;
>> + using P = std::pair<T, U>;
>> + using TH = TestHarness<P>;
>> +
>> + std::tuple<T> t1;
>> + std::tuple<U> t2;
>> +
>> + TestHarness<P> h;
>> + h.construct(std::piecewise_construct, std::move(t1),
>> std::move(t2));
>> + P const& p = *h.ptr;
>> + assert(p.first.count == 2);
>> + assert(p.first.alloc == h.M);
>> + assert(p.second.count == 2);
>> + assert(p.second.alloc == h.M);
>> + }
>> + {
>> + using T = CountCopiesAllocV2;
>> + using U = CountCopies;
>> + using P = std::pair<T, U>;
>> + using TH = TestHarness<P>;
>> +
>> + std::tuple<T> t1;
>> + std::tuple<U> t2;
>> +
>> + TestHarness<P> h;
>> + h.construct(std::piecewise_construct, t1, t2);
>> + P const& p = *h.ptr;
>> + assert(p.first.count == 2);
>> + assert(p.first.alloc == h.M);
>> + assert(p.second.count == 2);
>> + }
>> +}
>>
>> Added:
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/db_deallocate.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/db_deallocate.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/db_deallocate.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/db_deallocate.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,42 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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
>> +
>> +// T* polymorphic_allocator<T>::deallocate(T*, size_t size)
>> +
>> +int AssertCount = 0;
>> +
>> +#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : (void)::AssertCount++)
>> +#define _LIBCPP_DEBUG 0
>> +#include <experimental/memory_resource>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#include "test_memory_resource.hpp"
>> +
>> +namespace ex = std::experimental::pmr;
>> +
>> +int main()
>> +{
>> + using Alloc = ex::polymorphic_allocator<int>;
>> + using Traits = std::allocator_traits<Alloc>;
>> + NullResource R;
>> + Alloc a(&R);
>> + const std::size_t maxSize = Traits::max_size(a);
>> +
>> + a.deallocate(nullptr, maxSize);
>> + assert(AssertCount == 0);
>> + a.deallocate(nullptr, maxSize + 1);
>> + assert(AssertCount == 1);
>> +}
>>
>> Added:
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/max_size.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/max_size.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/max_size.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/libcxx/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.mem/max_size.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,64 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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));
>> + }
>> +}
>>
>> Added:
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/db_deallocate.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/db_deallocate.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/db_deallocate.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.adaptor/memory.resource.adaptor.mem/db_deallocate.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,45 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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
>> +
>> +// T* polymorphic_allocator<T>::deallocate(T*, size_t size)
>> +
>> +int AssertCount = 0;
>> +
>> +#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : (void)::AssertCount++)
>> +#define _LIBCPP_DEBUG 0
>> +#include <experimental/memory_resource>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#include "test_memory_resource.hpp"
>> +
>> +namespace ex = std::experimental::pmr;
>> +
>> +int main()
>> +{
>> + using Alloc = NullAllocator<char>;
>> + using R = ex::resource_adaptor<Alloc>;
>> + AllocController P;
>> + ex::resource_adaptor<Alloc> r(Alloc{P});
>> + ex::memory_resource & m1 = r;
>> +
>> + std::size_t maxSize = std::numeric_limits<std::size_t>::max()
>> + - alignof(std::max_align_t);
>> +
>> + m1.deallocate(nullptr, maxSize);
>> + assert(AssertCount == 0);
>> + m1.deallocate(nullptr, maxSize + 1);
>> + assert(AssertCount >= 1);
>> +}
>>
>> Added:
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/global_memory_resource_lifetime.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,60 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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>
>> +
>> +// memory_resource * new_delete_resource()
>> +
>> +// The lifetime of the value returned by 'new_delete_resource()' should
>> +// never end, even very late into program termination. This test
>> constructs
>> +// attempts to use 'new_delete_resource()' very late in program
>> termination
>> +// to detect lifetime issues.
>> +
>> +#include <experimental/memory_resource>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +namespace ex = std::experimental::pmr;
>> +
>> +struct POSType {
>> + ex::memory_resource* res = nullptr;
>> + void* ptr = nullptr;
>> + int n = 0;
>> + POSType() {}
>> + POSType(ex::memory_resource* r, void* p, int s) : res(r), ptr(p), n(s)
>> {}
>> + ~POSType() {
>> + if (ptr) {
>> + if (!res) res = ex::get_default_resource();
>> + res->deallocate(ptr, n);
>> + }
>> + }
>> +};
>> +
>> +void swap(POSType & L, POSType & R) {
>> + std::swap(L.res, R.res);
>> + std::swap(L.ptr, R.ptr);
>> + std::swap(L.n, R.n);
>> +}
>> +
>> +POSType constructed_before_resources;
>> +POSType constructed_before_resources2;
>> +
>> +// Constructs resources
>> +ex::memory_resource* resource = ex::get_default_resource();
>> +
>> +POSType constructed_after_resources(resource, resource->allocate(1024),
>> 1024);
>> +POSType constructed_after_resources2(nullptr, resource->allocate(1024),
>> 1024);
>> +
>> +int main()
>> +{
>> + swap(constructed_after_resources, constructed_before_resources);
>> + swap(constructed_before_resources2, constructed_after_resources2);
>> +}
>>
>> Added:
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.global/new_delete_resource_lifetime.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,52 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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>
>> +
>> +// memory_resource * new_delete_resource()
>> +
>> +// The lifetime of the value returned by 'new_delete_resource()' should
>> +// never end, even very late into program termination. This test
>> constructs
>> +// attempts to use 'new_delete_resource()' very late in program
>> termination
>> +// to detect lifetime issues.
>> +
>> +#include <experimental/memory_resource>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +namespace ex = std::experimental::pmr;
>> +
>> +struct POSType {
>> + ex::memory_resource* res = nullptr;
>> + void* ptr = nullptr;
>> + int n = 0;
>> + POSType() {res = ex::new_delete_resource(); ptr = res->allocate(42); n
>> = 42; }
>> + POSType(ex::memory_resource* r, void* p, int s) : res(r), ptr(p), n(s)
>> {}
>> + ~POSType() { if (ptr) res->deallocate(ptr, n); }
>> +};
>> +
>> +void swap(POSType & L, POSType & R) {
>> + std::swap(L.res, R.res);
>> + std::swap(L.ptr, R.ptr);
>> + std::swap(L.n, R.n);
>> +}
>> +
>> +POSType constructed_before_resources;
>> +
>> +// Constructs resources
>> +ex::memory_resource* resource = ex::new_delete_resource();
>> +
>> +POSType constructed_after_resources(resource, resource->allocate(1024),
>> 1024);
>> +
>> +int main()
>> +{
>> + swap(constructed_after_resources, constructed_before_resources);
>> +}
>>
>> Added:
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/version.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/version.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/version.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/libcxx/experimental/memory/memory.resource.synop/version.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,22 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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>
>> +
>> +#include <experimental/memory_resource>
>> +
>> +#ifndef _LIBCPP_VERSION
>> +#error _LIBCPP_VERSION not defined
>> +#endif
>> +
>> +int main()
>> +{
>> +}
>>
>> Added:
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/assign.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/assign.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/assign.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/assign.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,29 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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
>> +
>> +// polymorphic_allocator operator=(polymorphic_allocator const &) =
>> delete
>> +
>> +#include <experimental/memory_resource>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +namespace ex = std::experimental::pmr;
>> +
>> +int main()
>> +{
>> + typedef ex::polymorphic_allocator<void> T;
>> + static_assert(std::is_copy_assignable<T>::value, "");
>> + static_assert(std::is_move_assignable<T>::value, "");
>> +}
>>
>> Added:
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/copy.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/copy.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/copy.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/copy.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,48 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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
>> +
>> +// polymorphic_allocator<T>::polymorphic_allocator(polymorphic_allocator
>> const &);
>> +
>> +#include <experimental/memory_resource>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +namespace ex = std::experimental::pmr;
>> +
>> +int main()
>> +{
>> + typedef ex::polymorphic_allocator<void> A1;
>> + {
>> + static_assert(
>> + std::is_copy_constructible<A1>::value, ""
>> + );
>> + static_assert(
>> + std::is_move_constructible<A1>::value, ""
>> + );
>> + }
>> + // copy
>> + {
>> + A1 const a((ex::memory_resource*)42);
>> + A1 const a2(a);
>> + assert(a.resource() == a2.resource());
>> + }
>> + // move
>> + {
>> + A1 a((ex::memory_resource*)42);
>> + A1 a2(std::move(a));
>> + assert(a.resource() == a2.resource());
>> + assert(a2.resource() == (ex::memory_resource*)42);
>> + }
>> +}
>>
>> Added:
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/default.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/default.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/default.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/default.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,48 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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
>> +
>> +// polymorphic_allocator<T>::polymorphic_allocator() noexcept
>> +
>> +#include <experimental/memory_resource>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#include "test_memory_resource.hpp"
>> +
>> +namespace ex = std::experimental::pmr;
>> +
>> +int main()
>> +{
>> + {
>> + static_assert(
>> +
>> std::is_nothrow_default_constructible<ex::polymorphic_allocator<void>>::value
>> + , "Must me nothrow default constructible"
>> + );
>> + }
>> + {
>> + // test that the allocator gets its resource from
>> get_default_resource
>> + TestResource R1(42);
>> + ex::set_default_resource(&R1);
>> +
>> + typedef ex::polymorphic_allocator<void> A;
>> + A const a;
>> + assert(a.resource() == &R1);
>> +
>> + ex::set_default_resource(nullptr);
>> + A const a2;
>> + assert(a.resource() == &R1);
>> + assert(a2.resource() == ex::new_delete_resource());
>> + }
>> +}
>>
>> Added:
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/memory_resource_convert.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/memory_resource_convert.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/memory_resource_convert.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/memory_resource_convert.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,45 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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
>> +
>> +// polymorphic_allocator<T>::polymorphic_allocator(memory_resource *)
>> +
>> +#include <experimental/memory_resource>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#include "test_memory_resource.hpp"
>> +
>> +namespace ex = std::experimental::pmr;
>> +
>> +int main()
>> +{
>> + {
>> + typedef ex::polymorphic_allocator<void> A;
>> + static_assert(
>> + std::is_convertible<decltype(nullptr), A>::value
>> + , "Must be convertible"
>> + );
>> + static_assert(
>> + std::is_convertible<ex::memory_resource *, A>::value
>> + , "Must be convertible"
>> + );
>> + }
>> + {
>> + typedef ex::polymorphic_allocator<void> A;
>> + TestResource R;
>> + A const a(&R);
>> + assert(a.resource() == &R);
>> + }
>> +}
>>
>> Added:
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/other_alloc.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/other_alloc.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/other_alloc.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.ctor/other_alloc.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,57 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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
>> +
>> +// template <class U>
>> +//
>> polymorphic_allocator<T>::polymorphic_allocator(polymorphic_allocator<U>
>> const &);
>> +
>> +
>> +#include <experimental/memory_resource>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +namespace ex = std::experimental::pmr;
>> +
>> +int main()
>> +{
>> + typedef ex::polymorphic_allocator<void> A1;
>> + typedef ex::polymorphic_allocator<char> A2;
>> + { // Test that the conversion is implicit and noexcept.
>> + static_assert(
>> + std::is_convertible<A1 const &, A2>::value, ""
>> + );
>> + static_assert(
>> + std::is_convertible<A2 const &, A1>::value, ""
>> + );
>> + static_assert(
>> + std::is_nothrow_constructible<A1, A2 const &>::value, ""
>> + );
>> + static_assert(
>> + std::is_nothrow_constructible<A2, A1 const &>::value, ""
>> + );
>> + }
>> + // copy other type
>> + {
>> + A1 const a((ex::memory_resource*)42);
>> + A2 const a2(a);
>> + assert(a.resource() == a2.resource());
>> + assert(a2.resource() == (ex::memory_resource*)42);
>> + }
>> + {
>> + A1 a((ex::memory_resource*)42);
>> + A2 const a2(std::move(a));
>> + assert(a.resource() == a2.resource());
>> + assert(a2.resource() == (ex::memory_resource*)42);
>> + }
>> +}
>>
>> Added:
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/equal.pass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/equal.pass.cpp?rev=268829&view=auto
>>
>> ==============================================================================
>> ---
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/equal.pass.cpp
>> (added)
>> +++
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/equal.pass.cpp
>> Fri May 6 20:04:55 2016
>> @@ -0,0 +1,133 @@
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// 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;
>> +
>> +// template <class T, class U>
>> +// bool operator==(
>> +// polymorphic_allocator<T> const &
>> +// , polymorphic_allocator<U> const &) noexcept
>> +
>> +#include <experimental/memory_resource>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#include "test_memory_resource.hpp"
>> +
>> +namespace ex = std::experimental::pmr;
>> +
>> +int main()
>> +{
>> + typedef ex::polymorphic_allocator<void> A1;
>> + typedef ex::polymorphic_allocator<int> A2;
>> + // check return types
>> + {
>> + A1 const a1;
>> + A2 const a2;
>> + static_assert(std::is_same<decltype(a1 == a2), bool>::value, "");
>> + static_assert(noexcept(a1 == a2), "");
>> + }
>> + // equal same type (different resource)
>> + {
>> + TestResource d1(1);
>> + TestResource d2(1);
>> + A1 const a1(&d1);
>> + A1 const a2(&d2);
>> +
>> + assert(a1 == a2);
>> + assert(d1.checkIsEqualCalledEq(1));
>> + assert(d2.checkIsEqualCalledEq(0));
>> +
>> + d1.reset();
>> +
>> + assert(a2 == a1);
>> + assert(d1.checkIsEqualCalledEq(0));
>> + assert(d2.checkIsEqualCalledEq(1));
>> + }
>> + // equal same type (same resource)
>> + {
>> + TestResource d1;
>> + A1 const a1(&d1);
>> + A1 const a2(&d1);
>> +
>> + assert(a1 == a2);
>> + assert(d1.checkIsEqualCalledEq(0));
>> +
>> + assert(a2 == a1);
>> + assert(d1.checkIsEqualCalledEq(0));
>> + }
>> + // equal different type (different resource)
>> + {
>> + TestResource d1(42);
>> + TestResource d2(42);
>> + A1 const a1(&d1);
>> + A2 const a2(&d2);
>> +
>> + assert(a1 == a2);
>> + assert(d1.checkIsEqualCalledEq(1));
>> + assert(d2.checkIsEqualCalledEq(0));
>> +
>> + assert(a2 == a1);
>> + assert(d1.checkIsEqualCalledEq(1));
>> + assert(d2.checkIsEqualCalledEq(1));
>> +
>> + }
>> + // equal different type (same resource)
>> + {
>> + TestResource d1(42);
>> + A1 const a1(&d1);
>> + A2 const a2(&d1);
>> +
>> + assert(a1 == a2);
>> + assert(d1.checkIsEqualCalledEq(0));
>> +
>> + assert(a2 == a1);
>> + assert(d1.checkIsEqualCalledEq(0));
>> +
>> + }
>> + // not equal same type
>> + {
>> + TestResource d1(1);
>> + TestResource d2(2);
>> + A1 const a1(&d1);
>> + A1 const a2(&d2);
>> +
>> + assert(!(a1 == a2));
>> + assert(d1.checkIsEqualCalledEq(1));
>> + assert(d2.checkIsEqualCalledEq(0));
>> +
>> + d1.reset();
>> +
>> + assert(!(a2 == a1));
>> + assert(d1.checkIsEqualCalledEq(0));
>> + assert(d2.checkIsEqualCalledEq(1));
>> +
>> + }
>> + // not equal different types
>> + {
>> + TestResource d1;
>> + TestResource1 d2;
>> + A1 const a1(&d1);
>> + A2 const a2(&d2);
>> +
>> + assert(!(a1 == a2));
>> + assert(d1.checkIsEqualCalledEq(1));
>> + assert(d2.checkIsEqualCalledEq(0));
>> +
>> + d1.reset();
>> +
>> + assert(!(a2 == a1));
>> + assert(d1.checkIsEqualCalledEq(0));
>> + assert(d2.checkIsEqualCalledEq(1));
>> + }
>> +}
>>
>> Added:
>> libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/not_equal.pass.cpp
>> URL:
>> <http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/memory/memory.polymorphic.allocator.class/memory.polymorphic.allocator.eq/not_equal.pass.cpp?rev=268829&view=auto>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160506/f4352d70/attachment-0001.html>
More information about the cfe-commits
mailing list