blob: 109e88377e1c890b78226616df41c3e61ab9e0f0 [file] [log] [blame]
//TODO: copyrights
#ifndef __REFCOUNTED_H__
#define __REFCOUNTED_H__
#include <list>
namespace Devices
{
/**
* \brief Base class of all the Clover objects
*
* This class implements functions needed by all the Clover objects, like
* reference counting, the object tree (parents/children), etc.
*
* It also uses a special list of known objects, used to check that a pointer
* passed by the user to an OpenCL function actually is an object of the correct
* type. See \c isA().
*/
class Object
{
public:
/**
* \brief Type of object the inherited class actually is
*/
enum Type
{
T_Device, /*!< \brief \c Coal::DeviceInterface */
T_CommandQueue, /*!< \brief \c Coal::CommandQueue */
T_Event, /*!< \brief \c Coal::Event */
T_Context, /*!< \brief \c Coal::Context */
T_Kernel, /*!< \brief \c Coal::Kernel */
T_MemObject, /*!< \brief \c Coal::MemObject */
T_Program, /*!< \brief \c Coal::Program */
T_Sampler /*!< \brief \c Coal::Sampler */
};
/**
* \brief Constructor
* \param type type of the child class calling this constructor
* \param parent parent object
*/
Object(Type type, Object *parent = 0);
virtual ~Object();
/**
* \brief Increments the reference counter
*/
void reference();
/**
* \brief Decrements the reference counter
* \return true if the reference counter has reached 0
*/
bool dereference();
/**
* \brief Reference counter
* \return the number of references of this class currently in use
*/
unsigned int references() const;
/**
* \brief Set if the parent object has to be deleted if its reference count reaches 0
*
* The destructor of \c Coal::Object dereferences its parent object.
* This is done in order to correctly free objects when no object has
* a reference to it anymore.
*
* Some objects such as \c Coal::CommandQueue need to do some operations
* before being deleted. This function tells \c Coal::Object to
* dereference its parent object, but not to call \b delete on it.
*
* \param release true to have \b delete called on the parent object
* when its reference count reaches 0, false to keep it
*/
void setReleaseParent(bool release);
Object *parent() const; /*!< \brief Parent object */
Type type() const; /*!< \brief Type */
/**
* \brief Returns whether this object is an instance of \p type
* \note This function begins with a NULL-check on the \c this pointer,
* so it's safe to use even when \c this is not guaranteed not to
* be NULL.
* \param type type this object must have for the check to pass
* \return true if this object exists and has the correct type
*/
bool isA(Type type) const;
private:
unsigned int p_references;
Object *p_parent;
Type p_type;
std::list<Object *>::iterator p_it;
bool p_release_parent;
};
}
#endif