This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Patch updated with tests.
Bootstrapped and tested on Darwin 10.10.4.
2015-07-28 7:57 GMT-04:00 Jonathan Wakely <jwakely@redhat.com>:
>
> On 28/07/15 02:55 +0000, Fan You wrote:
>>
>> Thanks for the review, they helped a lot.
>>
>>
>> When I writing test for polymorphic_allocator, I found [2.1.1] has not been
>> implemented which made use-allocator construction test for memory_resource*
>> impossible. So, I implemented it and the patch is attached, am I allowed to
>> do modification on place outside std::experimental?
>
>
> It's definitely not OK to #include <experimental/utility> in the
> non-experimental standard headers.
>
> I think we can adapt the existing one to work for PMRs in a safe and
> extensible way.
>
> If you declare std::__erased_type as an empty struct and extend
> uses_allocator to check for it, then we don't pollute the namespace
> with the names "experimental" or "erased_type".
>
> Then in <experimental/utility> you can declare
> std::experimental::erased_type as a typedef for std::__erased_type.
>
>
> + template<typename _Alloc, typename _Tp>
> + struct __erased_type_helper
> + { using type = typename is_convertible<_Alloc, _Tp>::type; };
> +
> + template<typename _Alloc>
> + struct __erased_type_helper<_Alloc, std::experimental::erased_type>
> + { using type = true_type; };
>
> This can be simplified using inheritance:
>
> template<typename _Alloc, typename _Tp>
> struct __erased_type_helper
> : is_convertible<_Alloc, _Tp>
> { };
>
> template<typename _Alloc>
> struct __erased_type_helper<_Alloc, __erased_type>
> : true_type
> { };
>
>
> (I'm concerned that the edits to [allocator.uses.construction]
> specified by [mods.allocator.uses] break some uses of std::tuple, but
> I don't have the bandwidth to implement the changes in my head and
> figure out the issues right now, so I'm going to ignore them.)
>
>
>> Also, while testing polymorphic_allocator's construct method, how can I
>> verify it did construct the right thing? I see some test, e.g.
>> scoped_allocator uses "personality" in testsuite_allocator.h, it maps
>> pointers to int, but I cannot understand the point of doing this, can you
>> give me some hint on this?
>
>
> That ensures that memory is deallocated by the same allocator that
> allocated it (or one that compares equal to it, because equal
> allocators can deallocate each other's memory).
>
> What exactly do you want to test? If you just want to test that the
> right constructor is called then make the constructor set some member
> variable (or global variable) saying which constructor was called,
> then you can test that e.g.
>
> enum CtorType { Default, Copy, Move, Other };
>
> // type that takes a memory_resource after other ctor args
> struct A
> {
> using allocator_type = erased_type;
>
> CtorType type;
> pmr::memory_resource* alloc = nullptr;
>
> A() : type(Default) { }
> A(pmr::memory_resource* a) : type(Default), alloc(a) { }
> A(const A&) : type(Copy) { }
> A(const A&, pmr::memory_resource* a) : type(Copy), alloc(a) { }
> A(A&&) : type (Move) { }
> A(A&&, pmr::memory_resource* a) : type(Move), alloc(a) { }
> A(int) : type(Other) { }
> A(int, pmr::memory_resource* a) : type(Other), alloc(a) { }
> };
>
> // type that takes a memory_resource before other ctor args
> struct B
> {
> using allocator_type = erased_type;
>
> CtorType type;
> pmr::memory_resource* alloc = nullptr;
>
> B() : type(Default) { }
> B(allocator_arg_t, pmr::memory_resource* a) : type(Default), alloc(a) { }
> B(const B&) : type(Copy) { }
> B(allocator_arg_t, pmr::memory_resource* a, const B&) : type(Copy), alloc(a) { }
> B(B&&) : type (Move) { }
> B(allocator_arg_t, pmr::memory_resource* a, B&&) : type(Move), alloc(a) { }
> B(int) : type(Other) { }
> B(allocator_arg_t, pmr::memory_resource* a, int) : type(Other), alloc(a) { }
> };
>
> // type that takes no memory_resource
> struct C
> {
> CtorType type;
>
> C() : type(Default) { }
> C(const C&) : type(Copy) { }
> C(C&&) : type (Move) { }
> C(int) : type(Other) { }
> };
>
> Then you can try constructing objects of these types with various
> arguments and verify that the expected constructor is called and that
> the correct memory_resource is passed when expected.
>
> Your test name has a typo in it:
>
> libstdc++-v3/testsuite/experimental/type_erased_allocator/uses_alloctor.cc
>
> In that test you could use static_assert to test the values are correct,
> instead of a runtime VERIFY.
>
Attachment:
a
Description: Binary data
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |