#include <iostream>
using namespace std;

#include <singletontest.h>

#include <singleton.h>


class singletontest_hat
{
public:

   int data;

   singletontest_hat() : data(0) {}

   singletontest_hat(int data_) : data(data_) {}
   ~singletontest_hat() { cout << "~singletontest_hat()  data=" << data << endl; }

   template<class T>
   void print(T t)
   {
      cout << "singletontest_hat::print<T>(T t) t=" << t << endl;
   }
};

class singletontest_cat
{
public:

  int data;
  singletontest_cat() : data(0) {}
  singletontest_cat(int data_) : data(data_) {}

  void print() const
    { cout << "singletontest_cat  data=" << data << endl; }

  ~singletontest_cat() { cout << "~singletontest_cat::print()  data=" << data << endl; }
};




void singletontest01()
{
  singletontest_cat c(23);
  cout << "Creating a singleton singletontest_cat object" << endl;
  cout << "This does not destruct the singletontest_cat when there ";
  cout << "are no references." << endl;
  {
  SingletonPtr<singletontest_cat> init(&c);
  }

  cout << "Try accessing the singletontest_cat's print function." << endl;
  SingletonPtr<singletontest_cat>()->print();

  cout << endl << endl;

  cout << "Reference count test" << endl;
  cout << "The singletontest_hat object is constructed and should be " << endl;
  cout << "destructed imediately when this singleton dies" << endl;

  // Call delete on singletontest_hat(32) when out of scope.
  {
  SingletonPtr<singletontest_hat> (new singletontest_hat(32),SingletonPtr<singletontest_hat>::nonarray);
  }
  cout << "There are no longer any SingletonPtr<singletontest_hat> objects alive" << endl;

  cout << endl;
  cout << "Reference Count test on arrays" << endl;
  cout << "Call delete[] when no SingletonPtr's exist" << endl;
  {
  SingletonPtr<singletontest_hat> (new singletontest_hat[5],SingletonPtr<singletontest_hat>::array);
  }
  cout << "The destructors for 5 singletontest_hat objects should have been called" << endl;
}



