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