blob: 40c44d94906c38ed0d373a574cb5ec683c345a6d [file] [log] [blame]
Howard Hinnantc52f43e2010-08-22 00:59:46 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc52f43e2010-08-22 00:59:46 +00007//
8//===----------------------------------------------------------------------===//
9
10// <memory>
11
12// allocator:
13// template <class... Args> void construct(pointer p, Args&&... args);
14
15#include <memory>
Howard Hinnantc52f43e2010-08-22 00:59:46 +000016#include <cassert>
17
Eric Fiselierb47a4342015-07-28 07:31:50 +000018#include "test_macros.h"
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000019#include "count_new.hpp"
Howard Hinnantc52f43e2010-08-22 00:59:46 +000020
21int A_constructed = 0;
22
23struct A
24{
25 int data;
26 A() {++A_constructed;}
27
28 A(const A&) {++A_constructed;}
29
30 explicit A(int) {++A_constructed;}
31 A(int, int*) {++A_constructed;}
32
33 ~A() {--A_constructed;}
34};
35
36int move_only_constructed = 0;
37
Eric Fiselierb47a4342015-07-28 07:31:50 +000038#if TEST_STD_VER >= 11
Howard Hinnantc52f43e2010-08-22 00:59:46 +000039class move_only
40{
Dan Albert1d4a1ed2016-05-25 22:36:09 -070041 int data;
42
Eric Fiselierb47a4342015-07-28 07:31:50 +000043 move_only(const move_only&) = delete;
44 move_only& operator=(const move_only&)= delete;
Howard Hinnantc52f43e2010-08-22 00:59:46 +000045
46public:
Howard Hinnantc52f43e2010-08-22 00:59:46 +000047 move_only(move_only&&) {++move_only_constructed;}
Howard Hinnant6b41c602011-05-11 20:21:19 +000048 move_only& operator=(move_only&&) {return *this;}
Howard Hinnantc52f43e2010-08-22 00:59:46 +000049
50 move_only() {++move_only_constructed;}
51 ~move_only() {--move_only_constructed;}
52};
Eric Fiselierb47a4342015-07-28 07:31:50 +000053#endif // TEST_STD_VER >= 11
Howard Hinnantc52f43e2010-08-22 00:59:46 +000054
55int main()
56{
57 {
58 std::allocator<A> a;
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000059 assert(globalMemCounter.checkOutstandingNewEq(0));
Howard Hinnantc52f43e2010-08-22 00:59:46 +000060 assert(A_constructed == 0);
61
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000062 globalMemCounter.last_new_size = 0;
Howard Hinnantc52f43e2010-08-22 00:59:46 +000063 A* ap = a.allocate(3);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000064 assert(globalMemCounter.checkOutstandingNewEq(1));
65 assert(globalMemCounter.checkLastNewSizeEq(3 * sizeof(int)));
Howard Hinnantc52f43e2010-08-22 00:59:46 +000066 assert(A_constructed == 0);
67
68 a.construct(ap);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000069 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +000070 assert(A_constructed == 1);
71
72 a.destroy(ap);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000073 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +000074 assert(A_constructed == 0);
75
76 a.construct(ap, A());
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000077 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +000078 assert(A_constructed == 1);
79
80 a.destroy(ap);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000081 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +000082 assert(A_constructed == 0);
83
84 a.construct(ap, 5);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000085 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +000086 assert(A_constructed == 1);
87
88 a.destroy(ap);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000089 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +000090 assert(A_constructed == 0);
91
92 a.construct(ap, 5, (int*)0);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000093 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +000094 assert(A_constructed == 1);
95
96 a.destroy(ap);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +000097 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +000098 assert(A_constructed == 0);
99
100 a.deallocate(ap, 3);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +0000101 assert(globalMemCounter.checkOutstandingNewEq(0));
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000102 assert(A_constructed == 0);
103 }
Eric Fiselierb47a4342015-07-28 07:31:50 +0000104#if TEST_STD_VER >= 11
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000105 {
106 std::allocator<move_only> a;
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +0000107 assert(globalMemCounter.checkOutstandingNewEq(0));
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000108 assert(move_only_constructed == 0);
109
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +0000110 globalMemCounter.last_new_size = 0;
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000111 move_only* ap = a.allocate(3);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +0000112 assert(globalMemCounter.checkOutstandingNewEq(1));
113 assert(globalMemCounter.checkLastNewSizeEq(3 * sizeof(int)));
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000114 assert(move_only_constructed == 0);
115
116 a.construct(ap);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +0000117 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000118 assert(move_only_constructed == 1);
119
120 a.destroy(ap);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +0000121 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000122 assert(move_only_constructed == 0);
123
124 a.construct(ap, move_only());
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +0000125 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000126 assert(move_only_constructed == 1);
127
128 a.destroy(ap);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +0000129 assert(globalMemCounter.checkOutstandingNewEq(1));
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000130 assert(move_only_constructed == 0);
131
132 a.deallocate(ap, 3);
Eric Fiselier4eb5b6d2014-12-22 22:38:59 +0000133 assert(globalMemCounter.checkOutstandingNewEq(0));
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000134 assert(move_only_constructed == 0);
135 }
Eric Fiselierb47a4342015-07-28 07:31:50 +0000136#endif
Howard Hinnantc52f43e2010-08-22 00:59:46 +0000137}