iuser_class.h File Reference
Description
Abstract interface for user-defined classes.
Code Example
iuser_class.h
/***************************************************************************************************
* Copyright 2024 NVIDIA Corporation. All rights reserved.
**************************************************************************************************/
#ifndef MI_NEURAYLIB_IUSER_CLASS_H
#define MI_NEURAYLIB_IUSER_CLASS_H
#include <mi/base/interface_declare.h>
#include <mi/base/interface_implement.h>
#include <mi/base/lock.h>
#include <mi/neuraylib/iserializer.h>
namespace mi {
class IArray;
namespace neuraylib {
class IDeserializer;
class ITransaction;
class IUser_class : public
mi::base::Interface_declare<0xa8bbfac5,0xf1b0,0x4ab5,0x99,0x18,0x9a,0x46,0xf8,0xb8,0x32,0x2b,
neuraylib::ISerializable>
{
public:
virtual IUser_class* copy() const = 0;
virtual const char* get_class_name() const = 0;
virtual IArray* get_references( ITransaction* transaction) const = 0;
// Sets the embedded pointer.
//
// The embedded pointer is used for internal purposes. Users must not use this method.
virtual bool set_pointer( const base::IInterface* pointer) = 0;
// Returns the embedded pointer.
//
// The embedded pointer is used for internal purposes. Users must not use this method.
virtual const base::IInterface* get_pointer() const = 0;
};
template <Uint32 id1, Uint16 id2, Uint16 id3
, Uint8 id4, Uint8 id5, Uint8 id6, Uint8 id7
, Uint8 id8, Uint8 id9, Uint8 id10, Uint8 id11
, class I = IUser_class>
class User_class : public base::Interface_implement<I>
{
public:
typedef base::Uuid_t< id1, id2, id3, id4, id5, id6, id7, id8, id9, id10, id11>
IID;
User_class() : m_pointer( 0) { }
User_class( const User_class& other) : base::Interface_implement<I>( other), m_pointer( 0) { }
User_class& operator=( const User_class& other)
{
base::Interface_implement< I>::operator=( other);
return *this;
}
~User_class()
{
mi_base_assert( m_pointer == 0);
}
virtual const char* get_class_name() const
{
return "User class";
}
virtual base::Uuid
get_class_id() const
{
return IID();
}
// Overrides the standard release() implementation.
//
// If the release count drops to 1, and the embedded pointer is set, release it.
virtual Uint32 release() const
{
base::Lock::Block block( &m_pointer_lock);
base::Interface_implement< I>::retain();
Uint32 count = base::Interface_implement< I>::release();
if( count == 1) {
block.release();
return base::Interface_implement< I>::release();
}
if(( count == 2) && m_pointer) {
m_pointer->release();
m_pointer = 0;
}
return base::Interface_implement<I>::release();
}
// Sets the embedded pointer.
//
// The embedded pointer is used for internal purposes. Users must not use this method.
virtual bool set_pointer( const base::IInterface* pointer)
{
base::Lock::Block block( &m_pointer_lock);
if( m_pointer)
return false;
m_pointer = pointer;
if( m_pointer)
m_pointer->retain();
return true;
}
// Returns the embedded pointer.
//
// The embedded pointer is used for internal purposes. Users must not use this method.
virtual const base::IInterface* get_pointer() const
{
base::Lock::Block block( &m_pointer_lock);
if( m_pointer)
m_pointer->retain();
return m_pointer;
}
private:
// The embedded pointer.
//
// The embedded pointer is used for internal purposes. Users must not access the pointer.
mutable const base::IInterface* m_pointer;
// The lock that protects the embedded pointer.
mutable base::Lock m_pointer_lock;
};
// end group mi_neuray_plugins
} // namespace neuraylib
} // namespace mi
#endif // MI_NEURAYLIB_IUSER_CLASS_H
Namespaces
- namespace
- Common namespace for APIs of NVIDIA Advanced Rendering Center GmbH. More...
- namespace
- Namespace for the neuray API. More...