LMMS
Loading...
Searching...
No Matches
fobject.h File Reference

Go to the source code of this file.

Classes

class  Steinberg::FObject

Namespaces

namespace  Steinberg
namespace  Steinberg::Singleton

Macros

#define SINGLETON(ClassName)
#define OBJ_METHODS(className, baseClass)
#define REFCOUNT_METHODS(BaseClass)
Macros to implement FUnknown::queryInterface ().
<b>Examples:</b>
@code
class Foo : public FObject, public IFoo2, public IFoo3 
{
    ...
    DEFINE_INTERFACES
        DEF_INTERFACE (IFoo2)
        DEF_INTERFACE (IFoo3)
    END_DEFINE_INTERFACES (FObject)
    REFCOUNT_METHODS(FObject)
    // Implement IFoo2 interface ...
    // Implement IFoo3 interface ...
    ...
};
@endcode    
#define DEFINE_INTERFACES
#define DEF_INTERFACE(InterfaceName)
#define END_DEFINE_INTERFACES(BaseClass)
Convenient macros to implement Steinberg::FUnknown::queryInterface ().

Examples:

class Foo : public FObject, public IFoo2, public IFoo3
{
...
DEF_INTERFACES_2(IFoo2,IFoo3,FObject)
...
};
#define DEF_INTERFACES_2(InterfaceName1, InterfaceName2, BaseClass)
Definition fobject.h:417
#define REFCOUNT_METHODS(BaseClass)
Definition fobject.h:351
#define DEF_INTERFACES_1(InterfaceName, BaseClass)
#define DEF_INTERFACES_2(InterfaceName1, InterfaceName2, BaseClass)
#define DEF_INTERFACES_3(InterfaceName1, InterfaceName2, InterfaceName3, BaseClass)
#define DEF_INTERFACES_4(InterfaceName1, InterfaceName2, InterfaceName3, InterfaceName4, BaseClass)
Convenient macros to implement Steinberg::FUnknown methods.

Examples:

class Foo : public FObject, public IFoo2, public IFoo3
{
...
FUNKNOWN_METHODS2(IFoo2,IFoo3,FObject)
...
};
#define FUNKNOWN_METHODS2(InterfaceName1, InterfaceName2, BaseClass)
Definition fobject.h:458
#define FUNKNOWN_METHODS(InterfaceName, BaseClass)
#define FUNKNOWN_METHODS2(InterfaceName1, InterfaceName2, BaseClass)
#define FUNKNOWN_METHODS3(InterfaceName1, InterfaceName2, InterfaceName3, BaseClass)
#define FUNKNOWN_METHODS4(InterfaceName1, InterfaceName2, InterfaceName3, InterfaceName4, BaseClass)

Typedefs

using Steinberg::FClassID = FIDString

Functions

template<class C>
C * Steinberg::FCast (const FObject *object)
template<class C>
C * Steinberg::FCast (FUnknown *unknown)
template<class C>
C * Steinberg::FUCast (FObject *object)
template<class C>
C * Steinberg::FUCast (FUnknown *object)
template<class T>
void Steinberg::AssignShared (T *&dest, T *newPtr)
template<class T>
void Steinberg::AssignSharedDependent (IDependent *_this, T *&dest, T *newPtr)
template<class T>
void Steinberg::AssignSharedDependent (IDependent *_this, IPtr< T > &dest, T *newPtr)
template<class T>
void Steinberg::SafeReleaseDependent (IDependent *_this, T *&dest)
template<class T>
void Steinberg::SafeReleaseDependent (IDependent *_this, IPtr< T > &dest)
void Steinberg::Singleton::registerInstance (FObject **o)
bool Steinberg::Singleton::isTerminated ()
void Steinberg::Singleton::lockRegister ()
void Steinberg::Singleton::unlockRegister ()
Convenience methods that call release or delete respectively

on a pointer if it is non-zero, and then set the pointer to zero. Note: you should prefer using IPtr or OPtr instead of these methods whenever possible. Examples:

~Foo ()
{
// instead of ...
if (somePointer)
{
somePointer->release ();
somePointer = 0;
}
// ... just being lazy I write
SafeRelease (somePointer)
}
void SafeRelease(I *&ptr)
Definition fobject.h:213
template<class I>
void Steinberg::SafeRelease (I *&ptr)
template<class I>
void Steinberg::SafeRelease (IPtr< I > &ptr)
template<class T>
void Steinberg::SafeDelete (T *&ptr)

Detailed Description

Basic Object implementing FUnknown.

Macro Definition Documentation

◆ DEF_INTERFACE

#define DEF_INTERFACE ( InterfaceName)
Value:
QUERY_INTERFACE (iid, obj, InterfaceName::iid, InterfaceName)
#define QUERY_INTERFACE(iid, obj, InterfaceIID, InterfaceName)
Definition funknown.h:131

Add a interfaces.

◆ DEF_INTERFACES_1

#define DEF_INTERFACES_1 ( InterfaceName,
BaseClass )
Value:
DEFINE_INTERFACES \
DEF_INTERFACE (InterfaceName) \
END_DEFINE_INTERFACES (BaseClass)

◆ DEF_INTERFACES_2

#define DEF_INTERFACES_2 ( InterfaceName1,
InterfaceName2,
BaseClass )
Value:
DEFINE_INTERFACES \
DEF_INTERFACE (InterfaceName1) \
DEF_INTERFACE (InterfaceName2) \
END_DEFINE_INTERFACES (BaseClass)

◆ DEF_INTERFACES_3

#define DEF_INTERFACES_3 ( InterfaceName1,
InterfaceName2,
InterfaceName3,
BaseClass )
Value:
DEFINE_INTERFACES \
DEF_INTERFACE (InterfaceName1) \
DEF_INTERFACE (InterfaceName2) \
DEF_INTERFACE (InterfaceName3) \
END_DEFINE_INTERFACES (BaseClass)

◆ DEF_INTERFACES_4

#define DEF_INTERFACES_4 ( InterfaceName1,
InterfaceName2,
InterfaceName3,
InterfaceName4,
BaseClass )
Value:
DEFINE_INTERFACES \
DEF_INTERFACE (InterfaceName1) \
DEF_INTERFACE (InterfaceName2) \
DEF_INTERFACE (InterfaceName3) \
DEF_INTERFACE (InterfaceName4) \
END_DEFINE_INTERFACES (BaseClass)

◆ DEFINE_INTERFACES

#define DEFINE_INTERFACES
Value:
Steinberg::tresult PLUGIN_API queryInterface (const Steinberg::TUID iid, void** obj) SMTG_OVERRIDE \
{
#define SMTG_OVERRIDE
Definition fplatform.h:241
int8 TUID[16]
plain UID type
Definition funknown.h:210
int32 tresult
Definition ftypes.h:76

Start defining interfaces.

◆ END_DEFINE_INTERFACES

#define END_DEFINE_INTERFACES ( BaseClass)
Value:
return BaseClass::queryInterface (iid, obj); \
}

End defining interfaces.

◆ FUNKNOWN_METHODS

#define FUNKNOWN_METHODS ( InterfaceName,
BaseClass )
Value:
DEF_INTERFACES_1(InterfaceName,BaseClass) \
REFCOUNT_METHODS(BaseClass)
#define DEF_INTERFACES_1(InterfaceName, BaseClass)
Definition fobject.h:411

◆ FUNKNOWN_METHODS2

#define FUNKNOWN_METHODS2 ( InterfaceName1,
InterfaceName2,
BaseClass )
Value:
DEF_INTERFACES_2(InterfaceName1,InterfaceName2,BaseClass) \
REFCOUNT_METHODS(BaseClass)

◆ FUNKNOWN_METHODS3

#define FUNKNOWN_METHODS3 ( InterfaceName1,
InterfaceName2,
InterfaceName3,
BaseClass )
Value:
DEF_INTERFACES_3(InterfaceName1,InterfaceName2,InterfaceName3,BaseClass) \
REFCOUNT_METHODS(BaseClass)
#define DEF_INTERFACES_3(InterfaceName1, InterfaceName2, InterfaceName3, BaseClass)
Definition fobject.h:424

◆ FUNKNOWN_METHODS4

#define FUNKNOWN_METHODS4 ( InterfaceName1,
InterfaceName2,
InterfaceName3,
InterfaceName4,
BaseClass )
Value:
DEF_INTERFACES_4(InterfaceName1,InterfaceName2,InterfaceName3,InterfaceName4,BaseClass) \
REFCOUNT_METHODS(BaseClass)
#define DEF_INTERFACES_4(InterfaceName1, InterfaceName2, InterfaceName3, InterfaceName4, BaseClass)
Definition fobject.h:432

◆ OBJ_METHODS

#define OBJ_METHODS ( className,
baseClass )
Value:
static inline Steinberg::FClassID getFClassID () {return (#className);} \
virtual Steinberg::FClassID isA () const SMTG_OVERRIDE {return className::getFClassID ();} \
virtual bool isA (Steinberg::FClassID s) const SMTG_OVERRIDE {return isTypeOf (s, false);} \
virtual bool isTypeOf (Steinberg::FClassID s, bool askBaseClass = true) const SMTG_OVERRIDE \
{ return (classIDsEqual (s, #className) ? true : (askBaseClass ? baseClass::isTypeOf (s, true) : false)); }
unsigned s
Definition inflate.c:1555
FIDString FClassID
Definition fobject.h:52
#define const
Definition zconf.h:137

◆ REFCOUNT_METHODS

#define REFCOUNT_METHODS ( BaseClass)
Value:
virtual Steinberg::uint32 PLUGIN_API addRef ()SMTG_OVERRIDE{ return BaseClass::addRef (); } \
virtual Steinberg::uint32 PLUGIN_API release ()SMTG_OVERRIDE{ return BaseClass::release (); }
unsigned int uint32
Definition ftypes.h:51

Delegate refcount functions to BaseClass. BaseClase must implement ref counting.

◆ SINGLETON

#define SINGLETON ( ClassName)
Value:
static ClassName* instance (bool create = true) \
{ \
static Steinberg::FObject* inst = nullptr; \
if (inst == nullptr && create && Steinberg::Singleton::isTerminated () == false) \
{ \
Steinberg::Singleton::lockRegister (); \
if (inst == nullptr) \
{ \
inst = NEW ClassName; \
Steinberg::Singleton::registerInstance (&inst); \
} \
Steinberg::Singleton::unlockRegister (); \
} \
return (ClassName*)inst; \
}
Definition fobject.h:82
#define NEW
Definition fdebug.h:212
bool isTerminated()
Definition fobject.cpp:133