/*******************************************************************************
* pointer.h
*
* This module contains to Pointer class which is a limited version of std::auto_ptr.
*
* ---------------------------------------------------------------------------
* Persistence of Vision Ray Tracer ('POV-Ray') version 3.7.
* Copyright 1991-2013 Persistence of Vision Raytracer Pty. Ltd.
*
* POV-Ray is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* POV-Ray is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
* ---------------------------------------------------------------------------
* POV-Ray is based on the popular DKB raytracer version 2.12.
* DKBTrace was originally written by David K. Buck.
* DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
* ---------------------------------------------------------------------------
* $File: //depot/public/povray/3.x/source/base/pointer.h $
* $Revision: #1 $
* $Change: 6069 $
* $DateTime: 2013/11/06 11:59:40 $
* $Author: chrisc $
*******************************************************************************/
#ifndef POINTER_H
#define POINTER_H
#include "configbase.h"
namespace pov_base
{
// TODO FIXME - the Pointer class should be replaced by one of the boost/std smart pointers
template class Pointer
{
public:
explicit Pointer(X *p = NULL)
{
ptr = p;
}
Pointer(X& a)
{
ptr = a.release();
}
template Pointer(Pointer& a)
{
ptr = a.release();
}
~Pointer()
{
if(ptr != NULL)
delete ptr;
ptr = NULL;
}
Pointer& operator=(Pointer& a)
{
reset(a.release());
return *this;
}
template Pointer& operator=(Pointer& a)
{
reset(a.release());
return *this;
}
X& operator*() const
{
return *ptr;
}
const X *operator->() const
{
return ptr;
}
X *operator->()
{
return ptr;
}
const X *get() const
{
return ptr;
}
X *release()
{
X *t = ptr;
ptr = NULL;
return t;
}
void reset(X *p = NULL)
{
if(ptr != NULL)
delete ptr;
ptr = p;
}
bool operator==(const void *p) const
{
return (ptr == p);
}
bool operator!=(const void *p) const
{
return (ptr != p);
}
private:
X *ptr;
};
}
#endif