// Copyright (c) 2020 by Chrono
//
// g++ smart_ptr.cpp -std=c++11 -o a.out;./a.out
// g++ smart_ptr.cpp -std=c++14 -o a.out;./a.out
// g++ smart_ptr.cpp -std=c++14 -I../common -o a.out;./a.out
#include
#include
#include
#include
template
std::unique_ptr
my_make_unique(Args&&... args)
{
return std::unique_ptr(
new T(std::forward(args)...));
}
void case1()
{
using namespace std;
unique_ptr ptr1(new int(10));
assert(*ptr1 = 10);
assert(ptr1 != nullptr);
unique_ptr ptr2(new string("hello"));
assert(*ptr2 == "hello");
assert(ptr2->size() == 5);
//ptr1++;
//ptr2 += 2;
//unique_ptr ptr3;
//*ptr3 = 42;
auto ptr3 = make_unique(42);
assert(ptr3 && *ptr3 == 42);
auto ptr4 = make_unique("god of war");
assert(!ptr4->empty());
auto ptr5 = my_make_unique(100L);
assert(*ptr5 == 100);
}
void case2()
{
using namespace std;
auto ptr1 = make_unique(42);
assert(ptr1 && *ptr1 == 42);
auto ptr2 = std::move(ptr1);
assert(!ptr1 && ptr2);
}
void case3()
{
using namespace std;
shared_ptr ptr1(new int(10));
assert(*ptr1 = 10);
shared_ptr ptr2(new string("hello"));
assert(*ptr2 == "hello");
auto ptr3 = make_shared(42);
assert(ptr3 && *ptr3 == 42);
auto ptr4 = make_shared("zelda");
assert(!ptr4->empty());
}
void case4()
{
using namespace std;
auto ptr1 = make_shared(42);
assert(ptr1 && ptr1.unique() );
auto ptr2 = ptr1;
assert(ptr1 && ptr2);
assert(ptr1 == ptr2);
assert(!ptr1.unique() && ptr1.use_count() == 2);
assert(!ptr2.unique() && ptr2.use_count() == 2);
}
class DemoShared final
{
public:
DemoShared() = default;
~DemoShared()
{
// do some blocking thing ...
}
};
class Node final
{
public:
using this_type = Node;
//using shared_type = std::shared_ptr;
using shared_type = std::weak_ptr;
public:
shared_type next;
public:
Node() = default;
~Node()
{
using namespace std;
cout << "node dtor" << endl;
}
};
void case5()
{
using namespace std;
auto n1 = make_shared();
auto n2 = make_shared();
assert(n1.use_count() == 1);
assert(n2.use_count() == 1);
n1->next = n2;
n2->next = n1;
assert(n1.use_count() == 1);
assert(n2.use_count() == 1);
if (!n1->next.expired()) {
auto ptr = n1->next.lock();
assert(ptr == n2);
}
//assert(n1.use_count() == 2);
//assert(n2.use_count() == 2);
}
int main()
{
using namespace std;
case1();
case2();
case3();
case4();
case5();
cout << "smart_ptr demo" << endl;
}