/*
Le résultat attendu de ce programme est:



A(0)
A(1)
message
message
f:
message const
message const
:f
g:
message const
:g
~A(1)
message
message
~A(0)



*/





#include "SmartPointer.hpp"
#include<iostream>



using namespace utils;

class A{
  int i;
public:
  A(int i):i(i){
    std::cout<<"A("<<i<<")"<<std::endl;
  }
  ~A(){
    std::cout<<"~A("<<i<<")"<<std::endl;
  }
  void message() const
  {
    std::cout<<"message const"<<std::endl;
  }
  void message() 
  {
    std::cout<<"message"<<std::endl;
  }
};

void f(const SmartPointer<A> s)
{
  std::cout<<"f:"<<std::endl;
  s->message();
  (*s).message();
  std::cout<<":f"<<std::endl;
}

void g(const A*p)
{
  std::cout<<"g:"<<std::endl;
  p->message();
  std::cout<<":g"<<std::endl;
}
void h(A *p)
{
  std::cout<<"h:"<<std::endl;
  p->message();
  std::cout<<":h"<<std::endl;
}

int main(int argc, char **argv)
{
  SmartPointer<A> s1(new A(0));
  SmartPointer<A> s2(s1);

  s1 = new A(1);
  s1->message();
  (*s1).message();
  f(s1);
  g(s1);
  s1 = s2;
  
  s1->message();
  s2->message();
  return 0;
}
