17112dae6acac544a0271a85d95342c583441e2d1Dan Albert//===----------------------------------------------------------------------===//
27112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
37112dae6acac544a0271a85d95342c583441e2d1Dan Albert//                     The LLVM Compiler Infrastructure
47112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
57112dae6acac544a0271a85d95342c583441e2d1Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
67112dae6acac544a0271a85d95342c583441e2d1Dan Albert// Source Licenses. See LICENSE.TXT for details.
77112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
87112dae6acac544a0271a85d95342c583441e2d1Dan Albert//===----------------------------------------------------------------------===//
97112dae6acac544a0271a85d95342c583441e2d1Dan Albert
107112dae6acac544a0271a85d95342c583441e2d1Dan Albert// <memory>
117112dae6acac544a0271a85d95342c583441e2d1Dan Albert
127112dae6acac544a0271a85d95342c583441e2d1Dan Albert// shared_ptr
137112dae6acac544a0271a85d95342c583441e2d1Dan Albert
147112dae6acac544a0271a85d95342c583441e2d1Dan Albert// template<class T, class A, class... Args>
157112dae6acac544a0271a85d95342c583441e2d1Dan Albert//    shared_ptr<T> allocate_shared(const A& a, Args&&... args);
167112dae6acac544a0271a85d95342c583441e2d1Dan Albert
177112dae6acac544a0271a85d95342c583441e2d1Dan Albert#define _LIBCPP_HAS_NO_VARIADICS
187112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include <memory>
197112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include <new>
207112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include <cstdlib>
217112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include <cassert>
227112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include "test_allocator.h"
237112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include "min_allocator.h"
247112dae6acac544a0271a85d95342c583441e2d1Dan Albert
257112dae6acac544a0271a85d95342c583441e2d1Dan Albertstruct Zero
267112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
277112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static int count;
287112dae6acac544a0271a85d95342c583441e2d1Dan Albert    Zero() {++count;}
297112dae6acac544a0271a85d95342c583441e2d1Dan Albert    Zero(Zero const &) {++count;}
307112dae6acac544a0271a85d95342c583441e2d1Dan Albert    ~Zero() {--count;}
317112dae6acac544a0271a85d95342c583441e2d1Dan Albert};
327112dae6acac544a0271a85d95342c583441e2d1Dan Albert
337112dae6acac544a0271a85d95342c583441e2d1Dan Albertint Zero::count = 0;
347112dae6acac544a0271a85d95342c583441e2d1Dan Albert
357112dae6acac544a0271a85d95342c583441e2d1Dan Albertstruct One
367112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
377112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static int count;
387112dae6acac544a0271a85d95342c583441e2d1Dan Albert    int value;
397112dae6acac544a0271a85d95342c583441e2d1Dan Albert    explicit One(int v) : value(v) {++count;}
407112dae6acac544a0271a85d95342c583441e2d1Dan Albert    One(One const & o) : value(o.value) {++count;}
417112dae6acac544a0271a85d95342c583441e2d1Dan Albert    ~One() {--count;}
427112dae6acac544a0271a85d95342c583441e2d1Dan Albert};
437112dae6acac544a0271a85d95342c583441e2d1Dan Albert
447112dae6acac544a0271a85d95342c583441e2d1Dan Albertint One::count = 0;
457112dae6acac544a0271a85d95342c583441e2d1Dan Albert
467112dae6acac544a0271a85d95342c583441e2d1Dan Albert
477112dae6acac544a0271a85d95342c583441e2d1Dan Albertstruct Two
487112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
497112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static int count;
507112dae6acac544a0271a85d95342c583441e2d1Dan Albert    int value;
517112dae6acac544a0271a85d95342c583441e2d1Dan Albert    Two(int v, int) : value(v) {++count;}
527112dae6acac544a0271a85d95342c583441e2d1Dan Albert    Two(Two const & o) : value(o.value) {++count;}
537112dae6acac544a0271a85d95342c583441e2d1Dan Albert    ~Two() {--count;}
547112dae6acac544a0271a85d95342c583441e2d1Dan Albert};
557112dae6acac544a0271a85d95342c583441e2d1Dan Albert
567112dae6acac544a0271a85d95342c583441e2d1Dan Albertint Two::count = 0;
577112dae6acac544a0271a85d95342c583441e2d1Dan Albert
587112dae6acac544a0271a85d95342c583441e2d1Dan Albertstruct Three
597112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
607112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static int count;
617112dae6acac544a0271a85d95342c583441e2d1Dan Albert    int value;
627112dae6acac544a0271a85d95342c583441e2d1Dan Albert    Three(int v, int, int) : value(v) {++count;}
637112dae6acac544a0271a85d95342c583441e2d1Dan Albert    Three(Three const & o) : value(o.value) {++count;}
647112dae6acac544a0271a85d95342c583441e2d1Dan Albert    ~Three() {--count;}
657112dae6acac544a0271a85d95342c583441e2d1Dan Albert};
667112dae6acac544a0271a85d95342c583441e2d1Dan Albert
677112dae6acac544a0271a85d95342c583441e2d1Dan Albertint Three::count = 0;
687112dae6acac544a0271a85d95342c583441e2d1Dan Albert
697112dae6acac544a0271a85d95342c583441e2d1Dan Alberttemplate <class Alloc>
707112dae6acac544a0271a85d95342c583441e2d1Dan Albertvoid test()
717112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
727112dae6acac544a0271a85d95342c583441e2d1Dan Albert    int const bad = -1;
737112dae6acac544a0271a85d95342c583441e2d1Dan Albert    {
747112dae6acac544a0271a85d95342c583441e2d1Dan Albert    std::shared_ptr<Zero> p = std::allocate_shared<Zero>(Alloc());
757112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(Zero::count == 1);
767112dae6acac544a0271a85d95342c583441e2d1Dan Albert    }
777112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(Zero::count == 0);
787112dae6acac544a0271a85d95342c583441e2d1Dan Albert    {
797112dae6acac544a0271a85d95342c583441e2d1Dan Albert    int const i = 42;
807112dae6acac544a0271a85d95342c583441e2d1Dan Albert    std::shared_ptr<One> p = std::allocate_shared<One>(Alloc(), i);
817112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(One::count == 1);
827112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(p->value == i);
837112dae6acac544a0271a85d95342c583441e2d1Dan Albert    }
847112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(One::count == 0);
857112dae6acac544a0271a85d95342c583441e2d1Dan Albert    {
867112dae6acac544a0271a85d95342c583441e2d1Dan Albert    int const i = 42;
877112dae6acac544a0271a85d95342c583441e2d1Dan Albert    std::shared_ptr<Two> p = std::allocate_shared<Two>(Alloc(), i, bad);
887112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(Two::count == 1);
897112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(p->value == i);
907112dae6acac544a0271a85d95342c583441e2d1Dan Albert    }
917112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(Two::count == 0);
927112dae6acac544a0271a85d95342c583441e2d1Dan Albert    {
937112dae6acac544a0271a85d95342c583441e2d1Dan Albert    int const i = 42;
947112dae6acac544a0271a85d95342c583441e2d1Dan Albert    std::shared_ptr<Three> p = std::allocate_shared<Three>(Alloc(), i, bad, bad);
957112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(Three::count == 1);
967112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(p->value == i);
977112dae6acac544a0271a85d95342c583441e2d1Dan Albert    }
987112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(Three::count == 0);
997112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1007112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1017112dae6acac544a0271a85d95342c583441e2d1Dan Albertint main()
1027112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
1037112dae6acac544a0271a85d95342c583441e2d1Dan Albert    {
1047112dae6acac544a0271a85d95342c583441e2d1Dan Albert    int i = 67;
1057112dae6acac544a0271a85d95342c583441e2d1Dan Albert    int const bad = -1;
1067112dae6acac544a0271a85d95342c583441e2d1Dan Albert    std::shared_ptr<Two> p = std::allocate_shared<Two>(test_allocator<Two>(54), i, bad);
1077112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(test_allocator<Two>::alloc_count == 1);
1087112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(Two::count == 1);
1097112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(p->value == 67);
1107112dae6acac544a0271a85d95342c583441e2d1Dan Albert    }
1117112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(Two::count == 0);
1127112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(test_allocator<Two>::alloc_count == 0);
1137112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1147112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test<bare_allocator<void> >();
1157112dae6acac544a0271a85d95342c583441e2d1Dan Albert#if __cplusplus >= 201103L
1167112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test<min_allocator<void> >();
1177112dae6acac544a0271a85d95342c583441e2d1Dan Albert#endif
1187112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
119