vcglib/wrap/glw/object.h

297 lines
5.9 KiB
C++

#ifndef GLW_OBJECT_H
#define GLW_OBJECT_H
#include "./bookkeeping.h"
#include "./noncopyable.h"
#include "./objectdeleter.h"
#include "./type.h"
#include "./glheaders.h"
namespace glw
{
class Context;
class ObjectArguments
{
public:
typedef void BaseType;
typedef ObjectArguments ThisType;
ObjectArguments(void)
{
;
}
void clear(void)
{
;
}
};
class Object : public detail::NonCopyable
{
friend class Context;
public:
typedef detail::NonCopyable BaseType;
typedef Object ThisType;
virtual ~Object(void)
{
this->destroy();
}
bool isValid(void) const
{
return ((this->m_name != 0) && this->doIsValid());
}
const Context * context(void) const
{
return this->m_context;
}
Context * context(void)
{
return this->m_context;
}
GLuint name(void) const
{
return this->m_name;
}
virtual Type type(void) const = 0;
protected:
GLuint m_name;
Context * m_context;
Object(Context * ctx)
: m_name (0)
, m_context (ctx)
{
;
}
void destroy(void)
{
if (this->m_name == 0) return;
this->doDestroy();
this->m_name = 0;
this->m_context = 0;
}
virtual void doDestroy(void) = 0;
virtual bool doIsValid(void) const = 0;
};
namespace detail { template <typename T> struct ObjectBase { typedef NoType Type; }; };
namespace detail { template <typename T> struct ObjectSafe { typedef NoType Type; }; };
namespace detail { template <typename T> struct ObjectBound { typedef NoType Type; }; };
namespace detail { template <> struct BaseOf <Object> { typedef NoType Type; }; };
namespace detail { template <> struct DeleterOf <Object> { typedef ObjectDeleter Type; }; };
typedef detail::ObjectSharedPointerTraits <Object> ::Type ObjectPtr;
class SafeObject : public detail::NonCopyable
{
friend class Context;
friend class BoundObject;
public:
typedef detail::NonCopyable BaseType;
typedef SafeObject ThisType;
SafeObject(void)
: m_object(0)
{
;
}
virtual ~SafeObject(void)
{
;
}
bool isNull(void) const
{
return this->m_object.isNull();
}
bool isValid(void) const
{
return this->m_object->isValid();
}
const Context * context(void) const
{
if (this->isNull()) return 0;
return this->m_object->context();
}
Context * context(void)
{
if (this->isNull()) return 0;
return this->m_object->context();
}
GLuint name(void) const
{
if (this->isNull()) return 0;
return this->m_object->name();
}
Type type(void) const
{
if (this->isNull()) return InvalidType;
return this->m_object->type();
}
protected:
SafeObject(const ObjectPtr & object)
: m_object(object)
{
;
}
const ObjectPtr & object(void) const
{
return this->m_object;
}
ObjectPtr & object(void)
{
return this->m_object;
}
private:
ObjectPtr m_object;
};
namespace detail { template <> struct BaseOf <SafeObject> { typedef NoType Type; }; };
namespace detail { template <> struct DeleterOf <SafeObject> { typedef DefaultDeleter<SafeObject> Type; }; };
namespace detail { template <> struct ObjectBase <SafeObject> { typedef Object Type; }; };
namespace detail { template <> struct ObjectSafe <Object > { typedef SafeObject Type; }; };
typedef detail::ObjectSharedPointerTraits <SafeObject> ::Type ObjectHandle;
class ObjectBindingParams
{
public:
typedef void BaseType;
typedef ObjectBindingParams ThisType;
GLenum target;
GLint unit;
ObjectBindingParams(void)
: target (GL_NONE)
, unit (0)
{
;
}
ObjectBindingParams(GLenum aTarget, GLenum aUnit)
: target (aTarget)
, unit (aUnit)
{
;
}
};
class BoundObject : public detail::NonCopyable
{
friend class Context;
public:
typedef detail::NonCopyable BaseType;
typedef BoundObject ThisType;
BoundObject(void)
: m_handle (0)
, m_target (GL_NONE)
, m_unit (0)
{
;
}
virtual ~BoundObject(void)
{
;
}
bool isNull(void) const
{
return this->m_handle.isNull();
}
const ObjectHandle & handle(void) const
{
return this->m_handle;
}
ObjectHandle & handle(void)
{
return this->m_handle;
}
GLenum target(void) const
{
return this->m_target;
}
GLint unit(void) const
{
return this->m_unit;
}
protected:
ObjectHandle m_handle;
GLenum m_target;
GLint m_unit;
BoundObject(const ObjectHandle & handle, const ObjectBindingParams & params)
: m_handle (handle)
, m_target (params.target)
, m_unit (params.unit)
{
;
}
const ObjectPtr & object(void) const
{
return this->handle()->object();
}
ObjectPtr & object(void)
{
return this->handle()->object();
}
virtual void bind (void) = 0;
virtual void unbind (void) = 0;
};
namespace detail { template <typename T> struct ParamsOf { typedef NoType Type; }; };
namespace detail { template <> struct ParamsOf <BoundObject> { typedef ObjectBindingParams Type; }; };
namespace detail { template <> struct BaseOf <BoundObject> { typedef NoType Type; }; };
namespace detail { template <> struct DeleterOf <BoundObject> { typedef DefaultDeleter<BoundObject> Type; }; };
namespace detail { template <> struct ObjectBase <BoundObject> { typedef Object Type; }; };
namespace detail { template <> struct ObjectBound <Object > { typedef BoundObject Type; }; };
typedef detail::ObjectSharedPointerTraits <BoundObject> ::Type BoundObjectHandle;
};
#endif // GLW_OBJECT_H