#include <memory>
#include <cassert>
#include <utility>
#include "test_macros.h"
struct A {};
struct D {
void operator()(A const* ptr) const
{
delete ptr;
}
};
int main(int, char**)
{
{
std::shared_ptr<A> s0(new A);
std::weak_ptr<A> w = s0;
auto s = std::shared_ptr(w);
ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>);
assert(s0.use_count() == 2);
assert(s.use_count() == 2);
assert(s0.get() == s.get());
}
{
std::shared_ptr<A const> s0(new A);
std::weak_ptr<A const> w = s0;
auto s = std::shared_ptr(w);
ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>);
assert(s0.use_count() == 2);
assert(s.use_count() == 2);
assert(s0.get() == s.get());
}
{
std::unique_ptr<A> u(new A);
A* uPointee = u.get();
std::shared_ptr s = std::move(u);
ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>);
assert(u == nullptr);
assert(s.get() == uPointee);
}
{
std::unique_ptr<A const> u(new A);
A const* uPointee = u.get();
std::shared_ptr s = std::move(u);
ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>);
assert(u == nullptr);
assert(s.get() == uPointee);
}
{
std::unique_ptr<A, D> u(new A, D{});
A* uPointee = u.get();
std::shared_ptr s(std::move(u));
ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>);
assert(u == nullptr);
assert(s.get() == uPointee);
}
{
std::unique_ptr<A const, D> u(new A, D{});
A const* uPointee = u.get();
std::shared_ptr s(std::move(u));
ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>);
assert(u == nullptr);
assert(s.get() == uPointee);
}
return 0;
}