// @(#)root/hist:$Id$
// Author: David Gonzalez Maline   12/11/09

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TFitResultPtr.h"
#include "TFitResult.h"
#include "TError.h"

/**
TFitResultPtr provides an indirection to the TFitResult class and with a semantics
identical to a TFitResult pointer, i.e. it is like a smart pointer to a TFitResult.
In addition it provides an automatic comversion to an integer. In this way it can be
returned from the TH1::Fit method and the change in TH1::Fit be backward compatible.
The class

 */

ClassImp(TFitResultPtr)

TFitResultPtr::TFitResultPtr(const std::shared_ptr<TFitResult> & p) :
   fStatus(-1),
   fPointer(p)
{
   // constructor from a TFitResult pointer
   if (fPointer) fStatus = fPointer->Status();
}

TFitResultPtr::TFitResultPtr(TFitResult * p) :
   fStatus(-1),
   fPointer(std::shared_ptr<TFitResult>(p))
{
   // constructor from a TFitResult pointer
   if (fPointer) fStatus = fPointer->Status();
}

TFitResultPtr::TFitResultPtr(const TFitResultPtr& rhs) :
   fStatus(rhs.fStatus), fPointer(rhs.fPointer)
{
}

TFitResultPtr::~TFitResultPtr()
{
   // destructor - delete the contained TFitResult pointer if needed
   // if ( fPointer != 0)
   //    delete fPointer;
}


TFitResult& TFitResultPtr::operator*() const
{
   // implement the de-reference operator to make the class acts as a pointer to a TFitResult
   // assert in case the class does not contain a pointer to TFitResult
   if  (!fPointer) {
      Error("TFitResultPtr","TFitResult is empty - use the fit option S");
   }
   return *fPointer;
}

TFitResult* TFitResultPtr::operator->() const
{
   // implement the -> operator to make the class acts as a pointer to a TFitResult
   // assert in case the class does not contain a pointer to TFitResult
   if  (!fPointer) {
      Error("TFitResultPtr","TFitResult is empty - use the fit option S");
   }
   return fPointer.get();
}

TFitResult * TFitResultPtr::Get() const {
   // return contained pointer
   return fPointer.get();
}

TFitResultPtr & TFitResultPtr::operator=(const TFitResultPtr& rhs)
{
   // assignment operator
   // if needed copy the TFitResult  object and delete previous one if existing
   if ( &rhs == this) return *this; // self assignment
   fStatus = rhs.fStatus;
   fPointer = rhs.fPointer; 
   // if ( fPointer ) delete fPointer;
   // fPointer = 0;
   // if (rhs.fPointer != 0)  fPointer = new TFitResult(*rhs);
   return *this;
}

 TFitResultPtr.cxx:1
 TFitResultPtr.cxx:2
 TFitResultPtr.cxx:3
 TFitResultPtr.cxx:4
 TFitResultPtr.cxx:5
 TFitResultPtr.cxx:6
 TFitResultPtr.cxx:7
 TFitResultPtr.cxx:8
 TFitResultPtr.cxx:9
 TFitResultPtr.cxx:10
 TFitResultPtr.cxx:11
 TFitResultPtr.cxx:12
 TFitResultPtr.cxx:13
 TFitResultPtr.cxx:14
 TFitResultPtr.cxx:15
 TFitResultPtr.cxx:16
 TFitResultPtr.cxx:17
 TFitResultPtr.cxx:18
 TFitResultPtr.cxx:19
 TFitResultPtr.cxx:20
 TFitResultPtr.cxx:21
 TFitResultPtr.cxx:22
 TFitResultPtr.cxx:23
 TFitResultPtr.cxx:24
 TFitResultPtr.cxx:25
 TFitResultPtr.cxx:26
 TFitResultPtr.cxx:27
 TFitResultPtr.cxx:28
 TFitResultPtr.cxx:29
 TFitResultPtr.cxx:30
 TFitResultPtr.cxx:31
 TFitResultPtr.cxx:32
 TFitResultPtr.cxx:33
 TFitResultPtr.cxx:34
 TFitResultPtr.cxx:35
 TFitResultPtr.cxx:36
 TFitResultPtr.cxx:37
 TFitResultPtr.cxx:38
 TFitResultPtr.cxx:39
 TFitResultPtr.cxx:40
 TFitResultPtr.cxx:41
 TFitResultPtr.cxx:42
 TFitResultPtr.cxx:43
 TFitResultPtr.cxx:44
 TFitResultPtr.cxx:45
 TFitResultPtr.cxx:46
 TFitResultPtr.cxx:47
 TFitResultPtr.cxx:48
 TFitResultPtr.cxx:49
 TFitResultPtr.cxx:50
 TFitResultPtr.cxx:51
 TFitResultPtr.cxx:52
 TFitResultPtr.cxx:53
 TFitResultPtr.cxx:54
 TFitResultPtr.cxx:55
 TFitResultPtr.cxx:56
 TFitResultPtr.cxx:57
 TFitResultPtr.cxx:58
 TFitResultPtr.cxx:59
 TFitResultPtr.cxx:60
 TFitResultPtr.cxx:61
 TFitResultPtr.cxx:62
 TFitResultPtr.cxx:63
 TFitResultPtr.cxx:64
 TFitResultPtr.cxx:65
 TFitResultPtr.cxx:66
 TFitResultPtr.cxx:67
 TFitResultPtr.cxx:68
 TFitResultPtr.cxx:69
 TFitResultPtr.cxx:70
 TFitResultPtr.cxx:71
 TFitResultPtr.cxx:72
 TFitResultPtr.cxx:73
 TFitResultPtr.cxx:74
 TFitResultPtr.cxx:75
 TFitResultPtr.cxx:76
 TFitResultPtr.cxx:77
 TFitResultPtr.cxx:78
 TFitResultPtr.cxx:79
 TFitResultPtr.cxx:80
 TFitResultPtr.cxx:81
 TFitResultPtr.cxx:82
 TFitResultPtr.cxx:83
 TFitResultPtr.cxx:84
 TFitResultPtr.cxx:85
 TFitResultPtr.cxx:86
 TFitResultPtr.cxx:87
 TFitResultPtr.cxx:88
 TFitResultPtr.cxx:89
 TFitResultPtr.cxx:90
 TFitResultPtr.cxx:91
 TFitResultPtr.cxx:92
 TFitResultPtr.cxx:93