Files
pcas/src/gdd/smartGDDPointer.h
2000-06-27 00:24:41 +00:00

296 lines
6.7 KiB
C++

//
// Smart Pointer Class for GDD
// ( automatically takes care of referencing / unreferening a gdd each time that it is used )
//
// Author: Jeff Hill
//
#ifndef smartGDDPointer_h
#define smartGDDPointer_h
#include "gdd.h"
#include "shareLib.h"
//
// smartConstGDDPointer
//
// smart pointer class which auto ref/unrefs a const GDD
//
class smartConstGDDPointer {
public:
smartConstGDDPointer ();
smartConstGDDPointer (const gdd &valueIn);
smartConstGDDPointer (const gdd *pValueIn);
smartConstGDDPointer (const smartConstGDDPointer &ptrIn);
~smartConstGDDPointer ();
epicsShareFunc void set (const gdd *pNewValue);
smartConstGDDPointer operator = (const gdd *rhs);
smartConstGDDPointer operator = (const smartConstGDDPointer &rhs) ;
const gdd *operator -> () const;
const gdd & operator * () const;
bool operator ! () const;
bool valid () const;
//
// see Meyers, "more effective C++", for explanation on
// why conversion to dumb pointer is ill advised here
//
//operator const gdd * () const;
protected:
union {
gdd *pValue;
const gdd *pConstValue;
};
};
//
// smartGDDPointer
//
// smart pointer class which auto ref/unrefs the GDD
//
class smartGDDPointer : public smartConstGDDPointer {
public:
smartGDDPointer ();
smartGDDPointer ( gdd &valueIn );
smartGDDPointer ( gdd *pValueIn );
smartGDDPointer ( const smartGDDPointer &ptrIn );
void set ( gdd *pNewValue );
smartGDDPointer operator = ( gdd *rhs );
smartGDDPointer operator = ( const smartGDDPointer &rhs );
gdd *operator -> () const;
gdd & operator * () const;
//
// see Meyers, "more effective C++", for explanation on
// why conversion to dumb pointer is ill advised here
//
//operator gdd * () const;
};
//
// smartConstGDDReference
//
// smart reference class which auto ref/unrefs a const GDD
//
// Notes:
// 1) must be used with "->" operator and not "." operator
// 2) must be used with "*" operator as an L-value
//
class smartConstGDDReference {
public:
smartConstGDDReference (const gdd *pValueIn);
smartConstGDDReference (const gdd &valueIn);
smartConstGDDReference (const smartConstGDDReference &refIn);
~smartConstGDDReference ();
const gdd *operator -> () const;
const gdd & operator * () const;
protected:
union {
gdd *pValue;
const gdd *pConstValue;
};
};
//
// smartGDDReference
//
// smart reference class which auto ref/unrefs a const GDD
//
// Notes:
// 1) must be used with "->" operator and not "." operator
// 2) must be used with "*" operator as an L-value
//
class smartGDDReference : public smartConstGDDReference {
public:
smartGDDReference (gdd *pValueIn);
smartGDDReference (gdd &valueIn);
smartGDDReference (const smartGDDReference &refIn);
gdd *operator -> () const;
gdd & operator * () const;
};
inline smartConstGDDPointer::smartConstGDDPointer () :
pConstValue (0) {}
inline smartConstGDDPointer::smartConstGDDPointer (const gdd &valueIn) :
pConstValue (&valueIn)
{
int gddStatus;
gddStatus = this->pConstValue->reference ();
assert (!gddStatus);
}
inline smartConstGDDPointer::smartConstGDDPointer (const gdd *pValueIn) :
pConstValue (pValueIn)
{
if ( this->pConstValue != NULL ) {
int gddStatus;
gddStatus = this->pConstValue->reference ();
assert (!gddStatus);
}
}
inline smartConstGDDPointer::smartConstGDDPointer (const smartConstGDDPointer &ptrIn) :
pConstValue (ptrIn.pConstValue)
{
if ( this->pConstValue != NULL ) {
int gddStatus;
gddStatus = this->pConstValue->reference();
assert(!gddStatus);
}
}
inline smartConstGDDPointer::~smartConstGDDPointer ()
{
if ( this->pConstValue != NULL ) {
int gddStatus;
gddStatus = this->pConstValue->unreference();
assert (!gddStatus);
}
}
inline smartConstGDDPointer smartConstGDDPointer::operator = (const gdd *rhs)
{
this->set (rhs);
return *this;
}
inline smartConstGDDPointer smartConstGDDPointer::operator = (const smartConstGDDPointer &rhs)
{
this->set (rhs.pConstValue);
return *this;
}
inline const gdd *smartConstGDDPointer::operator -> () const
{
return this->pConstValue;
}
inline const gdd & smartConstGDDPointer::operator * () const
{
return *this->pConstValue;
}
inline bool smartConstGDDPointer::operator ! () const
{
if (this->pConstValue) {
return false;
}
else {
return true;
}
}
inline bool smartConstGDDPointer::valid () const
{
if ( this->pConstValue ) {
return true;
}
else {
return false;
}
}
inline smartGDDPointer::smartGDDPointer () :
smartConstGDDPointer () {}
inline smartGDDPointer::smartGDDPointer (gdd &valueIn) :
smartConstGDDPointer (valueIn) {}
inline smartGDDPointer::smartGDDPointer (gdd *pValueIn) :
smartConstGDDPointer (pValueIn) {}
inline smartGDDPointer::smartGDDPointer (const smartGDDPointer &ptrIn) :
smartConstGDDPointer (ptrIn) {}
inline void smartGDDPointer::set (gdd *pNewValue)
{
this->smartConstGDDPointer::set (pNewValue);
}
inline smartGDDPointer smartGDDPointer::operator = (gdd *rhs)
{
this->smartGDDPointer::set (rhs);
return *this;
}
inline smartGDDPointer smartGDDPointer::operator = (const smartGDDPointer &rhs)
{
this->smartGDDPointer::set (rhs.pValue);
return *this;
}
inline gdd *smartGDDPointer::operator -> () const
{
return this->pValue;
}
inline gdd & smartGDDPointer::operator * () const
{
return *this->pValue;
}
inline smartConstGDDReference::smartConstGDDReference (const gdd *pValueIn) :
pConstValue (pValueIn)
{
assert (this->pConstValue);
int gddStatus;
gddStatus = this->pConstValue->reference ();
assert (!gddStatus);
}
inline smartConstGDDReference::smartConstGDDReference (const gdd &valueIn) :
pConstValue (&valueIn)
{
int gddStatus;
gddStatus = this->pConstValue->reference ();
assert (!gddStatus);
}
inline smartConstGDDReference::smartConstGDDReference (const smartConstGDDReference &refIn) :
pConstValue (refIn.pConstValue)
{
int gddStatus;
gddStatus = this->pConstValue->reference();
assert (!gddStatus);
}
inline smartConstGDDReference::~smartConstGDDReference ()
{
int gddStatus;
gddStatus = this->pConstValue->unreference();
assert (!gddStatus);
}
inline const gdd *smartConstGDDReference::operator -> () const
{
return this->pConstValue;
}
inline const gdd & smartConstGDDReference::operator * () const
{
return *this->pConstValue;
}
inline smartGDDReference::smartGDDReference (gdd *pValueIn) :
smartConstGDDReference (pValueIn) {}
inline smartGDDReference::smartGDDReference (gdd &valueIn) :
smartConstGDDReference (valueIn) {}
inline smartGDDReference::smartGDDReference (const smartGDDReference &refIn) :
smartConstGDDReference (refIn) {}
inline gdd *smartGDDReference::operator -> () const
{
return this->pValue;
}
inline gdd & smartGDDReference::operator * () const
{
return *this->pValue;
}
#endif // smartGDDPointer_h