pointer01.pass.cpp revision bc8d3f97eb5c958007f2713238472e0c1c8fe02c
12538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar//===----------------------------------------------------------------------===//
22538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar//
32538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// ��������������������The LLVM Compiler Infrastructure
42538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar//
52538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// This file is distributed under the University of Illinois Open Source
62538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// License. See LICENSE.TXT for details.
72538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar//
82538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar//===----------------------------------------------------------------------===//
92538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
102538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// <memory>
112538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
122538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// unique_ptr
132538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
1437e3fe9ad7d7cb350cbbce0695c68d652d624bb4Benjamin Kramer// Test unique_ptr(pointer) ctor
152538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
162538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#include <memory>
172538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar#include <cassert>
182538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
192538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar// unique_ptr(pointer) ctor should only require default Deleter ctor
202538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
212538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarstruct A
222538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar{
232538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    static int count;
242538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    A() {++count;}
252538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    A(const A&) {++count;}
262538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    ~A() {--count;}
272538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar};
282538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
292538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarint A::count = 0;
302538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
312538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarclass Deleter
322538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar{
332538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    int state_;
342538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
352538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    Deleter(Deleter&);
362538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    Deleter& operator=(Deleter&);
372538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
382538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarpublic:
392538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    Deleter() : state_(5) {}
402538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
412538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    int state() const {return state_;}
422538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
432538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    void operator()(A* p) {delete p;}
442538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar};
452538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar
462538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbarint main()
472538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar{
482538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    {
492538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    A* p = new A;
502538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    assert(A::count == 1);
512538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    std::unique_ptr<A> s(p);
522538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    assert(s.get() == p);
532538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    }
542538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    assert(A::count == 0);
552538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    {
562538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    A* p = new A;
572538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    assert(A::count == 1);
582538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    std::unique_ptr<A, Deleter> s(p);
592538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    assert(s.get() == p);
602538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    assert(s.get_deleter().state() == 5);
612538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    }
622538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar    assert(A::count == 0);
632538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar}
642538f7ab2ef39ab1a5e48744548d66b560d1fee6Daniel Dunbar