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