//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <memory>
// allocator:
// template <class... Args> void construct(pointer p, Args&&... args);
#include<memory>#include<new>#include<cstdlib>#include<cassert>intnew_called=0;void*operatornew(std::size_ts)throw(std::bad_alloc){++new_called;assert(s==3*sizeof(int));returnstd::malloc(s);}voidoperatordelete(void*p)throw(){--new_called;std::free(p);}intA_constructed=0;structA{intdata;A(){++A_constructed;}A(constA&){++A_constructed;}explicitA(int){++A_constructed;}A(int,int*){++A_constructed;}~A(){--A_constructed;}};intmove_only_constructed=0;classmove_only{intdata;#ifdef _LIBCPP_MOVEmove_only(constmove_only&);move_only&operator=(constmove_only&);#elsemove_only(move_only&);move_only&operator=(move_only&);#endifpublic:#ifdef _LIBCPP_MOVEmove_only(move_only&&){++move_only_constructed;}move_only&operator=(move_only&&){}#elseoperatorstd::__rv<move_only>(){returnstd::__rv<move_only>(*this);}move_only(std::__rv<move_only>){++move_only_constructed;}#endifmove_only(){++move_only_constructed;}~move_only(){--move_only_constructed;}};intmain(){{std::allocator<A>a;assert(new_called==0);assert(A_constructed==0);A*ap=a.allocate(3);assert(new_called==1);assert(A_constructed==0);a.construct(ap);assert(new_called==1);assert(A_constructed==1);a.destroy(ap);assert(new_called==1);assert(A_constructed==0);a.construct(ap,A());assert(new_called==1);assert(A_constructed==1);a.destroy(ap);assert(new_called==1);assert(A_constructed==0);a.construct(ap,5);assert(new_called==1);assert(A_constructed==1);a.destroy(ap);assert(new_called==1);assert(A_constructed==0);a.construct(ap,5,(int*)0);assert(new_called==1);assert(A_constructed==1);a.destroy(ap);assert(new_called==1);assert(A_constructed==0);a.deallocate(ap,3);assert(new_called==0);assert(A_constructed==0);}{std::allocator<move_only>a;assert(new_called==0);assert(move_only_constructed==0);move_only*ap=a.allocate(3);assert(new_called==1);assert(move_only_constructed==0);a.construct(ap);assert(new_called==1);assert(move_only_constructed==1);a.destroy(ap);assert(new_called==1);assert(move_only_constructed==0);a.construct(ap,move_only());assert(new_called==1);assert(move_only_constructed==1);a.destroy(ap);assert(new_called==1);assert(move_only_constructed==0);a.deallocate(ap,3);assert(new_called==0);assert(move_only_constructed==0);}}