/*------------------------------------------------------------------------------
Copyright (c) 2000 Tyrell Corporation. All rights reserved.
Tyrell DarkIce
File : Referable.h
Version : $Revision: 1.2 $
Author : $Author: darkeye $
Location : $Source: /cvsroot/darkice/darkice/src/Referable.h,v $
Copyright notice:
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
------------------------------------------------------------------------------*/
#ifndef REFERABLE_H
#define REFERABLE_H
#ifndef __cplusplus
#error This is a C++ include file
#endif
/* ============================================================ include files */
#include "Exception.h"
/* ================================================================ constants */
/* =================================================================== macros */
/* =============================================================== data types */
/**
* Base class for an object for which references can be made
* with the reference class Ref.
*
* usage:
*
*
* class A : public virtual Referable
* {
* ...
* };
*
*
* @ref Ref
*
* @author $Author: darkeye $
* @version $Revision: 1.2 $
*/
class Referable
{
private:
/**
* Number of references to the object.
*/
unsigned int referenceCount;
/**
* Maximum number of references before an overflow occurs.
*/
static const
unsigned int maxCount = ~((unsigned int)0);
protected:
/**
* Default constructor.
*/
inline
Referable ( void ) throw ()
{
referenceCount = 0;
}
/**
* Desctructor.
*
* @exception Exception
*/
inline virtual
~Referable ( void ) throw ( Exception )
{
if ( referenceCount > 0 ) {
throw Exception( __FILE__, __LINE__,
"reference count positive in destructor",
referenceCount);
}
}
public:
/**
* Increase reference count.
*
* @return the new reference count.
* @exception Exception
*/
inline unsigned int
increaseReferenceCount ( void ) throw ( Exception )
{
if ( referenceCount >= maxCount ) {
throw Exception( __FILE__,
__LINE__,
"reference count overflow",
referenceCount );
}
return ++referenceCount;
}
/**
* Decrease reference count.
*
* @return the new reference count.
* @exception Exception
*/
inline unsigned int
decreaseReferenceCount ( void ) throw ( Exception )
{
if ( referenceCount == 0 ) {
throw Exception( __FILE__, __LINE__,
"reference count underflow",
referenceCount );
}
return --referenceCount;
}
/**
* Get the reference count.
*
* @return the reference count.
*/
inline unsigned int
getReferenceCount ( void ) const throw ()
{
return referenceCount;
}
};
/* ================================================= external data structures */
/* ====================================================== function prototypes */
#endif /* REFERABLE_H */
/*------------------------------------------------------------------------------
$Source: /cvsroot/darkice/darkice/src/Referable.h,v $
$Log: Referable.h,v $
Revision 1.2 2000/11/11 12:33:13 darkeye
added kdoc-style documentation
Revision 1.1.1.1 2000/11/05 10:05:54 darkeye
initial version
------------------------------------------------------------------------------*/
Generated by: darkeye on destroy on Sun Feb 15 23:41:12 2004, using kdoc 2.0a54. |