48#define SMTG_DEPENDENCY_COUNT DEVELOPMENT
54using FClassID = FIDString;
90#if SMTG_DEPENDENCY_COUNT
107 tresult PLUGIN_API
queryInterface (
const TUID _iid,
void** obj) SMTG_OVERRIDE;
108 uint32 PLUGIN_API
addRef () SMTG_OVERRIDE;
109 uint32 PLUGIN_API
release () SMTG_OVERRIDE;
117 virtual void changed (int32 msg = kChanged);
120 virtual bool isEqualInstance (
FUnknown* d) {
return this == d;}
126 static inline bool classIDsEqual (FClassID ci1, FClassID ci2);
135#if SMTG_DEPENDENCY_COUNT
136 int16 dependencyCount = 0;
160 return (ci1 && ci2) ? (
strcmp (ci1, ci2) == 0) :
false;
169 if (
object && object->
isTypeOf (C::getFClassID (),
true))
181 return FCast<C> (
object);
194inline C* FUCast (FUnknown*
object)
196 return FUnknownPtr<C> (
object);
222inline void SafeRelease (I *& ptr)
233inline void SafeRelease (IPtr<I> & ptr)
241inline void SafeDelete (T *& ptr)
253inline void AssignShared (T*& dest, T* newPtr)
267inline void AssignSharedDependent (IDependent* _this, T*& dest, T* newPtr)
273 dest->removeDependent (_this);
274 AssignShared (dest, newPtr);
276 dest->addDependent (_this);
281inline void AssignSharedDependent (IDependent* _this, IPtr<T>& dest, T* newPtr)
287 dest->removeDependent (_this);
290 dest->addDependent (_this);
295inline void SafeReleaseDependent (IDependent* _this, T*& dest)
298 dest->removeDependent (_this);
304inline void SafeReleaseDependent (IDependent* _this, IPtr<T>& dest)
307 dest->removeDependent (_this);
323 void unlockRegister ();
330#define SINGLETON(ClassName) \
331 static ClassName* instance (bool create = true) \
333 static Steinberg::FObject* inst = nullptr; \
334 if (inst == nullptr && create && Steinberg::Singleton::isTerminated () == false) \
336 Steinberg::Singleton::lockRegister (); \
337 if (inst == nullptr) \
339 inst = NEW ClassName; \
340 Steinberg::Singleton::registerInstance (&inst); \
342 Steinberg::Singleton::unlockRegister (); \
344 return (ClassName*)inst; \
348#define OBJ_METHODS(className, baseClass) \
349 static inline Steinberg::FClassID getFClassID () {return (#className);} \
350 virtual Steinberg::FClassID isA () const SMTG_OVERRIDE {return className::getFClassID ();} \
351 virtual bool isA (Steinberg::FClassID s) const SMTG_OVERRIDE {return isTypeOf (s, false);} \
352 virtual bool isTypeOf (Steinberg::FClassID s, bool askBaseClass = true) const SMTG_OVERRIDE \
353 { return (FObject::classIDsEqual (s, #className) ? true : (askBaseClass ? baseClass::isTypeOf (s, true) : false)); }
360#define REFCOUNT_METHODS(BaseClass) \
361virtual Steinberg::uint32 PLUGIN_API addRef ()SMTG_OVERRIDE{ return BaseClass::addRef (); } \
362virtual Steinberg::uint32 PLUGIN_API release ()SMTG_OVERRIDE{ return BaseClass::release (); }
387#define DEFINE_INTERFACES \
388Steinberg::tresult PLUGIN_API queryInterface (const Steinberg::TUID iid, void** obj) SMTG_OVERRIDE \
394#define DEF_INTERFACE(InterfaceName) \
395 QUERY_INTERFACE (iid, obj, InterfaceName::iid, InterfaceName)
400#define END_DEFINE_INTERFACES(BaseClass) \
401 return BaseClass::queryInterface (iid, obj); \
420#define DEF_INTERFACES_1(InterfaceName,BaseClass) \
422DEF_INTERFACE (InterfaceName) \
423END_DEFINE_INTERFACES (BaseClass)
426#define DEF_INTERFACES_2(InterfaceName1,InterfaceName2,BaseClass) \
428DEF_INTERFACE (InterfaceName1) \
429DEF_INTERFACE (InterfaceName2) \
430END_DEFINE_INTERFACES (BaseClass)
433#define DEF_INTERFACES_3(InterfaceName1,InterfaceName2,InterfaceName3,BaseClass) \
435DEF_INTERFACE (InterfaceName1) \
436DEF_INTERFACE (InterfaceName2) \
437DEF_INTERFACE (InterfaceName3) \
438END_DEFINE_INTERFACES (BaseClass)
441#define DEF_INTERFACES_4(InterfaceName1,InterfaceName2,InterfaceName3,InterfaceName4,BaseClass) \
443 DEF_INTERFACE (InterfaceName1) \
444 DEF_INTERFACE (InterfaceName2) \
445 DEF_INTERFACE (InterfaceName3) \
446 DEF_INTERFACE (InterfaceName4) \
447 END_DEFINE_INTERFACES (BaseClass)
463#define FUNKNOWN_METHODS(InterfaceName,BaseClass) \
464DEF_INTERFACES_1(InterfaceName,BaseClass) \
465REFCOUNT_METHODS(BaseClass)
467#define FUNKNOWN_METHODS2(InterfaceName1,InterfaceName2,BaseClass) \
468DEF_INTERFACES_2(InterfaceName1,InterfaceName2,BaseClass) \
469REFCOUNT_METHODS(BaseClass)
471#define FUNKNOWN_METHODS3(InterfaceName1,InterfaceName2,InterfaceName3,BaseClass) \
472DEF_INTERFACES_3(InterfaceName1,InterfaceName2,InterfaceName3,BaseClass) \
473REFCOUNT_METHODS(BaseClass)
475#define FUNKNOWN_METHODS4(InterfaceName1,InterfaceName2,InterfaceName3,InterfaceName4,BaseClass) \
476DEF_INTERFACES_4(InterfaceName1,InterfaceName2,InterfaceName3,InterfaceName4,BaseClass) \
477REFCOUNT_METHODS(BaseClass)
498#define IUNKNOWN_REFCOUNT_METHODS(BaseClass) \
499STDMETHOD_ (ULONG, AddRef) (void) {return BaseClass::addRef ();} \
500STDMETHOD_ (ULONG, Release) (void) {return BaseClass::release ();}
503#define COM_QUERY_INTERFACE(iid, obj, InterfaceName) \
504if (riid == __uuidof(InterfaceName)) \
507 *obj = (InterfaceName*)this; \
512#define COM_OBJECT_QUERY_INTERFACE(InterfaceName,BaseClass) \
513STDMETHOD (QueryInterface) (REFIID riid, void** object) \
515 COM_QUERY_INTERFACE (riid, object, InterfaceName) \
516 return BaseClass::queryInterface ((FIDString)&riid, object); \
520#define COM_UNKNOWN_METHODS(InterfaceName,BaseClass) \
521COM_OBJECT_QUERY_INTERFACE(InterfaceName,BaseClass) \
522IUNKNOWN_REFCOUNT_METHODS(BaseClass)
Implements FUnknown and IDependent.
virtual void addDependent(IDependent *dep)
adds dependency to the object
FObject()=default
default constructor...
virtual void removeDependent(IDependent *dep)
removes dependency from the object
virtual void changed(int32 msg=kChanged)
Inform all dependents, that the object has changed.
static bool classIDsEqual(FClassID ci1, FClassID ci2)
compares (evaluates) 2 class IDs
static void setUpdateHandler(IUpdateHandler *handler)
set method for the local attribute
static const FUID iid
Special UID that is used to cast an FUnknown pointer to a FObject.
uint32 PLUGIN_API addRef() SMTG_OVERRIDE
please refer to FUnknown::addref ()
virtual void deferUpdate(int32 msg=kChanged)
Similar to triggerUpdates, except only delivered in idle (usefull in collecting updates).
static FObject * unknownToObject(FUnknown *unknown)
pointer conversion from FUnknown to FObject
FObject & operator=(const FObject &)
overloads operator "=" as the reference assignment
virtual ~FObject()
destructor...
tresult PLUGIN_API queryInterface(const TUID _iid, void **obj) SMTG_OVERRIDE
please refer to FUnknown::queryInterface ()
static IUpdateHandler * getUpdateHandler()
get method for the local attribute
virtual void updateDone(int32)
empty virtual method that should be overridden by derived classes
int32 refCount
COM-model local reference count.
virtual bool isTypeOf(FClassID s, bool=true) const
evaluates if the passed ID is of the FObject type
uint32 PLUGIN_API release() SMTG_OVERRIDE
please refer to FUnknown::release ()
int32 getRefCount()
returns the current interface reference count
void PLUGIN_API update(FUnknown *, int32) SMTG_OVERRIDE
empty virtual method that should be overridden by derived classes for data updates upon changes
virtual FClassID isA() const
a local alternative to getFClassID ()
static FClassID getFClassID()
return Class ID as an ASCII string (statically)
FUnknown * unknownCast()
get FUnknown interface from object
virtual bool isA(FClassID s) const
evaluates if the passed ID is of the FObject type
Handling 16 Byte Globally Unique Identifiers.
FUnknownPtr - automatic interface conversion and smart pointer in one.
The basic interface of all interfaces.
virtual tresult PLUGIN_API queryInterface(const TUID _iid, void **obj)=0
Query for a pointer to the specified interface.
A dependent will get notified about changes of a model.
Host implements dependency handling for plugins.
C * FCast(const FObject *object)
FCast overload 1 - FObject to FObject.
C * FUCast(FObject *object)
FUCast - casting from FUnknown to Interface.
bool isTerminated()
Returns true when singleton instances were already released.
void lockRegister()
lock and unlock the singleton registration for multi-threading safety
void registerInstance(FObject **o)
registers an instance (type FObject)