brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 9b875e6 Raw
89 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <memory>10// UNSUPPORTED: c++03, c++11, c++1411 12// template<class T> class shared_ptr13 14// shared_ptr(weak_ptr<T>) -> shared_ptr<T>15// shared_ptr(unique_ptr<T>) -> shared_ptr<T>16 17#include <memory>18#include <cassert>19#include <utility>20 21#include "test_macros.h"22 23struct A {};24 25struct D {26  void operator()(A const* ptr) const27  {28    delete ptr;29  }30};31 32int main(int, char**)33{34  {35    std::shared_ptr<A> s0(new A);36    std::weak_ptr<A> w = s0;37    auto s = std::shared_ptr(w);38    ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>);39    assert(s0.use_count() == 2);40    assert(s.use_count() == 2);41    assert(s0.get() == s.get());42  }43  {44    std::shared_ptr<A const> s0(new A);45    std::weak_ptr<A const> w = s0;46    auto s = std::shared_ptr(w);47    ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>);48    assert(s0.use_count() == 2);49    assert(s.use_count() == 2);50    assert(s0.get() == s.get());51  }52 53  {54    std::unique_ptr<A> u(new A);55    A* uPointee = u.get();56    std::shared_ptr s = std::move(u);57    ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>);58    assert(u == nullptr);59    assert(s.get() == uPointee);60  }61  {62    std::unique_ptr<A const> u(new A);63    A const* uPointee = u.get();64    std::shared_ptr s = std::move(u);65    ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>);66    assert(u == nullptr);67    assert(s.get() == uPointee);68  }69 70  {71    std::unique_ptr<A, D> u(new A, D{});72    A* uPointee = u.get();73    std::shared_ptr s(std::move(u));74    ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>);75    assert(u == nullptr);76    assert(s.get() == uPointee);77  }78  {79    std::unique_ptr<A const, D> u(new A, D{});80    A const* uPointee = u.get();81    std::shared_ptr s(std::move(u));82    ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>);83    assert(u == nullptr);84    assert(s.get() == uPointee);85  }86 87  return 0;88}89