1 // Copyright (C) 2016-2025 Free Software Foundation, Inc.
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
18 // { dg-do compile { target c++11 } }
25 struct TaggingAllocator
29 TaggingAllocator() = default;
32 TaggingAllocator(const TaggingAllocator
<U
>&) { }
35 allocate(std::size_t n
) { return std::allocator
<T
>{}.allocate(n
); }
38 deallocate(T
* p
, std::size_t n
) { std::allocator
<T
>{}.deallocate(p
, n
); }
40 template<typename U
, typename
... Args
>
42 construct(U
* p
, Args
&&... args
)
43 { ::new((void*)p
) U(Tag
{}, std::forward
<Args
>(args
)...); }
45 template<typename U
, typename
... Args
>
51 template<typename T
, typename U
>
53 operator==(const TaggingAllocator
<T
>&, const TaggingAllocator
<U
>&)
56 template<typename T
, typename U
>
58 operator!=(const TaggingAllocator
<T
>&, const TaggingAllocator
<U
>&)
63 // All constructors must be passed the Tag type.
65 // DefaultInsertable into vector<X, TaggingAllocator<X>>,
67 // CopyInsertable into vector<X, TaggingAllocator<X>>,
69 // MoveInsertable into vector<X, TaggingAllocator<X>>, and
72 // EmplaceConstructible into vector<X, TaggingAllocator<X>> from args.
73 template<typename
... Args
>
76 // not DefaultConstructible, CopyConstructible or MoveConstructible.
82 X
& operator=(const X
&) { return *this; }
85 X
& operator=(X
&&) { return *this; }
91 // Erasable from vector<X, TaggingAllocator<X>>.
92 friend class TaggingAllocator
<X
>;
95 template class std::vector
<X
, TaggingAllocator
<X
>>;
99 std::vector
<X
, TaggingAllocator
<X
>> v
;
102 v
.emplace(v
.begin());
103 v
.emplace(v
.begin(), 1, 2, 3);