move01.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//===----------------------------------------------------------------------===//
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//                     The LLVM Compiler Infrastructure
42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//
54f0d97057c5c640b25518358886f8c47da9fc052Jean-Michel Trivi// This file is distributed under the University of Illinois Open Source
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// License. See LICENSE.TXT for details.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//
82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//===----------------------------------------------------------------------===//
92228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// <memory>
112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// unique_ptr
132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// Test unique_ptr move assignment
152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// test move assignment.  Should only require a MoveConstructible deleter, or if
172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//    deleter is a reference, not even that.
182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include <memory>
202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include <cassert>
212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "../../deleter.h"
232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstruct A
252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    static int count;
272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    A() {++count;}
282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    A(const A&) {++count;}
292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    ~A() {--count;}
302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project};
312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint A::count = 0;
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint main()
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    std::unique_ptr<A> s1(new A);
382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    A* p = s1.get();
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    std::unique_ptr<A> s2(new A);
402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(A::count == 2);
412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    s2 = std::move(s1);
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(A::count == 1);
432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(s2.get() == p);
442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(s1.get() == 0);
452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(A::count == 0);
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    std::unique_ptr<A, Deleter<A> > s1(new A, Deleter<A>(5));
492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    A* p = s1.get();
502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    std::unique_ptr<A, Deleter<A> > s2(new A);
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(A::count == 2);
522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    s2 = std::move(s1);
532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(s2.get() == p);
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(s1.get() == 0);
552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(A::count == 1);
562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(s2.get_deleter().state() == 5);
572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(s1.get_deleter().state() == 0);
582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(A::count == 0);
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CDeleter<A> d1(5);
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    std::unique_ptr<A, CDeleter<A>&> s1(new A, d1);
632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    A* p = s1.get();
642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    CDeleter<A> d2(6);
652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    std::unique_ptr<A, CDeleter<A>&> s2(new A, d2);
662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    s2 = std::move(s1);
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(s2.get() == p);
682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(s1.get() == 0);
692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(A::count == 1);
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(d1.state() == 5);
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(d2.state() == 5);
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    assert(A::count == 0);
742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project