// mem.cpp

#include "mem.h"
#include <stdio.h>
#include <vector>

class Foo
{
	public:
		Foo() { printf("%s\n", __FUNCTION__); }
		~Foo() { printf("%s\n", __FUNCTION__); }
};

class Bar
{
	public:
		Bar() { printf("%s\n", __FUNCTION__); }
		~Bar() { printf("%s\n", __FUNCTION__); }
};

void test1(void)
{
	typedef mem::shared_ptr<Foo> SF;
	typedef mem::shared_ptr<Bar> SB;
	typedef mem::weak_ptr<Foo> WF;
	typedef mem::weak_ptr<Bar> WB;

	SF f1 = SF(new Foo);
	SF f2 = SF(new Foo);
	SB f3 = SB(new Bar);

	WF w1(f1);
	WF w2(w1);
	WB w3(f3);

	printf("w1 == w2 : %d\n", w1 == w2);
	printf("w2 == w1 : %d\n", w2 == w1);
	printf("f1 == f2 : %d\n", f1 == f2);
	printf("f1 == f3 : %d\n", f1 == f3);
	printf("w1 == w3 : %d\n", w1 == w3);

	printf("w1 == f1 : %d\n", w1 == f1);
	printf("f1 == w1 : %d\n", f1 == w1);

	printf("w1 == f3 : %d\n", w1 == f3);
	printf("f3 == w1 : %d\n", f3 == w1);

	w1.reset();

	SF g1 = w2.lock();

	f1.reset();
	w2.reset();

	printf("ref count = %u\n", g1.ref_count());

	g1.reset();

	printf("%s:%d:\n", __FUNCTION__, __LINE__);
}

void test2(void)
{
	typedef mem::shared_ptr<Foo> FooShPtr;
	typedef std::vector<FooShPtr> FooShPtrVec;
	FooShPtrVec vec;
	vec.push_back(FooShPtr(new Foo));
	vec.push_back(FooShPtr(new Foo));
	vec.push_back(FooShPtr(new Foo));
}

int main(int, char **)
{
	test1();
	test2();
	return 0;
}

