LMMS
Loading...
Searching...
No Matches
funknown.h
Go to the documentation of this file.
1//-----------------------------------------------------------------------------
2// Project : SDK Core
3//
4// Category : SDK Core Interfaces
5// Filename : pluginterfaces/base/funknown.h
6// Created by : Steinberg, 01/2004
7// Description : Basic Interface
8//
9//-----------------------------------------------------------------------------
10// This file is part of a Steinberg SDK. It is subject to the license terms
11// in the LICENSE file found in the top-level directory of this distribution
12// and at www.steinberg.net/sdklicenses.
13// No part of the SDK, including this file, may be copied, modified, propagated,
14// or distributed except according to the terms contained in the LICENSE file.
15//-----------------------------------------------------------------------------
16
17#pragma once
18
22#include <cstring>
23
24#if SMTG_CPP11_STDLIBSUPPORT
25#include <type_traits>
26#endif
27
28//------------------------------------------------------------------------
31
32//------------------------------------------------------------------------
33// Unique Identifier macros
34//------------------------------------------------------------------------
35
36#if COM_COMPATIBLE
37#define INLINE_UID(l1, l2, l3, l4) \
38{ \
39 (::Steinberg::int8)(((::Steinberg::uint32)(l1) & 0x000000FF) ), (::Steinberg::int8)(((::Steinberg::uint32)(l1) & 0x0000FF00) >> 8), \
40 (::Steinberg::int8)(((::Steinberg::uint32)(l1) & 0x00FF0000) >> 16), (::Steinberg::int8)(((::Steinberg::uint32)(l1) & 0xFF000000) >> 24), \
41 (::Steinberg::int8)(((::Steinberg::uint32)(l2) & 0x00FF0000) >> 16), (::Steinberg::int8)(((::Steinberg::uint32)(l2) & 0xFF000000) >> 24), \
42 (::Steinberg::int8)(((::Steinberg::uint32)(l2) & 0x000000FF) ), (::Steinberg::int8)(((::Steinberg::uint32)(l2) & 0x0000FF00) >> 8), \
43 (::Steinberg::int8)(((::Steinberg::uint32)(l3) & 0xFF000000) >> 24), (::Steinberg::int8)(((::Steinberg::uint32)(l3) & 0x00FF0000) >> 16), \
44 (::Steinberg::int8)(((::Steinberg::uint32)(l3) & 0x0000FF00) >> 8), (::Steinberg::int8)(((::Steinberg::uint32)(l3) & 0x000000FF) ), \
45 (::Steinberg::int8)(((::Steinberg::uint32)(l4) & 0xFF000000) >> 24), (::Steinberg::int8)(((::Steinberg::uint32)(l4) & 0x00FF0000) >> 16), \
46 (::Steinberg::int8)(((::Steinberg::uint32)(l4) & 0x0000FF00) >> 8), (::Steinberg::int8)(((::Steinberg::uint32)(l4) & 0x000000FF) ) \
47}
48#else
49#define INLINE_UID(l1, l2, l3, l4) \
50{ \
51 (::Steinberg::int8)(((::Steinberg::uint32)(l1) & 0xFF000000) >> 24), (::Steinberg::int8)(((::Steinberg::uint32)(l1) & 0x00FF0000) >> 16), \
52 (::Steinberg::int8)(((::Steinberg::uint32)(l1) & 0x0000FF00) >> 8), (::Steinberg::int8)(((::Steinberg::uint32)(l1) & 0x000000FF) ), \
53 (::Steinberg::int8)(((::Steinberg::uint32)(l2) & 0xFF000000) >> 24), (::Steinberg::int8)(((::Steinberg::uint32)(l2) & 0x00FF0000) >> 16), \
54 (::Steinberg::int8)(((::Steinberg::uint32)(l2) & 0x0000FF00) >> 8), (::Steinberg::int8)(((::Steinberg::uint32)(l2) & 0x000000FF) ), \
55 (::Steinberg::int8)(((::Steinberg::uint32)(l3) & 0xFF000000) >> 24), (::Steinberg::int8)(((::Steinberg::uint32)(l3) & 0x00FF0000) >> 16), \
56 (::Steinberg::int8)(((::Steinberg::uint32)(l3) & 0x0000FF00) >> 8), (::Steinberg::int8)(((::Steinberg::uint32)(l3) & 0x000000FF) ), \
57 (::Steinberg::int8)(((::Steinberg::uint32)(l4) & 0xFF000000) >> 24), (::Steinberg::int8)(((::Steinberg::uint32)(l4) & 0x00FF0000) >> 16), \
58 (::Steinberg::int8)(((::Steinberg::uint32)(l4) & 0x0000FF00) >> 8), (::Steinberg::int8)(((::Steinberg::uint32)(l4) & 0x000000FF) ) \
59}
60#endif
61
62//------------------------------------------------------------------------
63#define DECLARE_UID(name, l1, l2, l3, l4) ::Steinberg::TUID name = INLINE_UID (l1, l2, l3, l4);
64
65//------------------------------------------------------------------------
66#define EXTERN_UID(name) extern const ::Steinberg::TUID name;
67
68#ifdef INIT_CLASS_IID
69#define DECLARE_CLASS_IID(ClassName, l1, l2, l3, l4) \
70 static const ::Steinberg::TUID ClassName##_iid = INLINE_UID (l1, l2, l3, l4); \
71 \
72const ::Steinberg::FUID ClassName::iid (ClassName##_iid);
73#else
74#define DECLARE_CLASS_IID(ClassName, l1, l2, l3, l4) \
75 static const ::Steinberg::TUID ClassName##_iid = INLINE_UID (l1, l2, l3, l4);
76#endif
77
78#define DEF_CLASS_IID(ClassName) const ::Steinberg::FUID ClassName::iid (ClassName##_iid);
79
80#define INLINE_UID_OF(ClassName) ClassName##_iid
81
82#define INLINE_UID_FROM_FUID(x) \
83 INLINE_UID (x.getLong1 (), x.getLong2 (), x.getLong3 (), x.getLong4 ())
84
85//------------------------------------------------------------------------
86// FUnknown implementation macros
87//------------------------------------------------------------------------
88
89#define DECLARE_FUNKNOWN_METHODS \
90public: \
91 virtual ::Steinberg::tresult PLUGIN_API queryInterface (const ::Steinberg::TUID _iid, void** obj) SMTG_OVERRIDE; \
92 virtual ::Steinberg::uint32 PLUGIN_API addRef () SMTG_OVERRIDE; \
93 virtual ::Steinberg::uint32 PLUGIN_API release () SMTG_OVERRIDE; \
94protected : \
95 ::Steinberg::int32 __funknownRefCount; \
96public:
97
98//------------------------------------------------------------------------
99
100#define DELEGATE_REFCOUNT(ClassName) \
101public: \
102 virtual ::Steinberg::uint32 PLUGIN_API addRef () SMTG_OVERRIDE { return ClassName::addRef (); } \
103 virtual ::Steinberg::uint32 PLUGIN_API release () SMTG_OVERRIDE { return ClassName::release (); }
104
105//------------------------------------------------------------------------
106#define IMPLEMENT_REFCOUNT(ClassName) \
107::Steinberg::uint32 PLUGIN_API ClassName::addRef () \
108{ \
109 return ::Steinberg::FUnknownPrivate::atomicAdd (__funknownRefCount, 1); \
110} \
111::Steinberg::uint32 PLUGIN_API ClassName::release () \
112{ \
113 if (::Steinberg::FUnknownPrivate::atomicAdd (__funknownRefCount, -1) == 0) \
114 { \
115 delete this; \
116 return 0; \
117 } \
118 return __funknownRefCount; \
119}
120
121//------------------------------------------------------------------------
122#define FUNKNOWN_CTOR { __funknownRefCount = 1; }
123#if SMTG_FUNKNOWN_DTOR_ASSERT
124#include <cassert>
125#define FUNKNOWN_DTOR { assert (__funknownRefCount == 0); }
126#else
127#define FUNKNOWN_DTOR
128#endif
129
130//------------------------------------------------------------------------
131#define QUERY_INTERFACE(iid, obj, InterfaceIID, InterfaceName) \
132if (::Steinberg::FUnknownPrivate::iidEqual (iid, InterfaceIID)) \
133{ \
134 addRef (); \
135 *obj = static_cast< InterfaceName* >(this); \
136 return ::Steinberg::kResultOk; \
137}
138
139//------------------------------------------------------------------------
140#define IMPLEMENT_QUERYINTERFACE(ClassName, InterfaceName, ClassIID) \
141::Steinberg::tresult PLUGIN_API ClassName::queryInterface (const ::Steinberg::TUID _iid, void** obj)\
142{ \
143 QUERY_INTERFACE (_iid, obj, ::Steinberg::FUnknown::iid, InterfaceName) \
144 QUERY_INTERFACE (_iid, obj, ClassIID, InterfaceName) \
145 *obj = nullptr; \
146 return ::Steinberg::kNoInterface; \
147}
148
149//------------------------------------------------------------------------
150#define IMPLEMENT_FUNKNOWN_METHODS(ClassName,InterfaceName,ClassIID) \
151 IMPLEMENT_REFCOUNT (ClassName) \
152 IMPLEMENT_QUERYINTERFACE (ClassName, InterfaceName, ClassIID)
153
154//------------------------------------------------------------------------
155// Result Codes
156//------------------------------------------------------------------------
157
158namespace Steinberg {
159
160//------------------------------------------------------------------------
161#if COM_COMPATIBLE
162#if SMTG_OS_WINDOWS
163enum
164{
165 kNoInterface = static_cast<tresult>(0x80004002L), // E_NOINTERFACE
166 kResultOk = static_cast<tresult>(0x00000000L), // S_OK
168 kResultFalse = static_cast<tresult>(0x00000001L), // S_FALSE
169 kInvalidArgument = static_cast<tresult>(0x80070057L), // E_INVALIDARG
170 kNotImplemented = static_cast<tresult>(0x80004001L), // E_NOTIMPL
171 kInternalError = static_cast<tresult>(0x80004005L), // E_FAIL
172 kNotInitialized = static_cast<tresult>(0x8000FFFFL), // E_UNEXPECTED
173 kOutOfMemory = static_cast<tresult>(0x8007000EL) // E_OUTOFMEMORY
174};
175#else
176enum
177{
178 kNoInterface = static_cast<tresult>(0x80000004L), // E_NOINTERFACE
179 kResultOk = static_cast<tresult>(0x00000000L), // S_OK
181 kResultFalse = static_cast<tresult>(0x00000001L), // S_FALSE
182 kInvalidArgument = static_cast<tresult>(0x80000003L), // E_INVALIDARG
183 kNotImplemented = static_cast<tresult>(0x80000001L), // E_NOTIMPL
184 kInternalError = static_cast<tresult>(0x80000008L), // E_FAIL
185 kNotInitialized = static_cast<tresult>(0x8000FFFFL), // E_UNEXPECTED
186 kOutOfMemory = static_cast<tresult>(0x80000002L) // E_OUTOFMEMORY
187};
188#endif
189#else
190enum
191{
201};
202#endif
203
204//------------------------------------------------------------------------
205typedef int64 LARGE_INT; // obsolete
206
207//------------------------------------------------------------------------
208// FUID class declaration
209//------------------------------------------------------------------------
210typedef int8 TUID[16];
211
212//------------------------------------------------------------------------
213/* FUnknown private */
214namespace FUnknownPrivate {
215SMTG_ALWAYS_INLINE bool iidEqual (const void* iid1, const void* iid2)
216{
217 const uint64* p1 = reinterpret_cast<const uint64*> (iid1);
218 const uint64* p2 = reinterpret_cast<const uint64*> (iid2);
219 return p1[0] == p2[0] && p1[1] == p2[1];
220}
221
222int32 PLUGIN_API atomicAdd (int32& value, int32 amount);
223}
224
225//------------------------------------------------------------------------
232class FUID
233{
234public:
235//------------------------------------------------------------------------
236 FUID ();
237 FUID (uint32 l1, uint32 l2, uint32 l3, uint32 l4);
238 FUID (const FUID&);
239 virtual ~FUID () {}
240
241#if SMTG_CPP11_STDLIBSUPPORT
242 FUID (FUID&& other);
243 FUID& operator= (FUID&& other);
244#endif
245
249 bool generate ();
250
253 bool isValid () const;
254
255 FUID& operator = (const FUID& f);
256 bool operator == (const FUID& f) const { return ::Steinberg::FUnknownPrivate::iidEqual (data, f.data); }
257 bool operator < (const FUID& f) const { return memcmp (data, f.data, sizeof (TUID)) < 0; }
258 bool operator != (const FUID& f) const { return !::Steinberg::FUnknownPrivate::iidEqual (data, f.data); }
259
260 uint32 getLong1 () const;
261 uint32 getLong2 () const;
262 uint32 getLong3 () const;
263 uint32 getLong4 () const;
264
265 void from4Int (uint32 d1, uint32 d2, uint32 d3, uint32 d4);
266 void to4Int (uint32& d1, uint32& d2, uint32& d3, uint32& d4) const;
267
268 typedef char8 String[33];
269
282 void toString (char8* string) const;
283
287 bool fromString (const char8* string);
288
291 void toRegistryString (char8* string) const;
292
294 bool fromRegistryString (const char8* string);
295
303
306 void print (char8* string = nullptr, int32 style = kINLINE_UID) const;
307
308 template <size_t N>
309 inline explicit FUID (const int8 (&uid)[N])
310 {
311#if SMTG_CPP11_STDLIBSUPPORT
312 static_assert (N == sizeof (TUID), "only TUID allowed");
313#endif
314 memcpy (data, uid, sizeof (TUID));
315 }
316 inline void toTUID (TUID result) const { memcpy (result, data, sizeof (TUID)); }
317 inline operator const TUID& () const { return data; }
318 inline const TUID& toTUID () const { return data; }
319
320 static FUID fromTUID (const TUID uid)
321 {
322 FUID res;
323 if (uid)
324 memcpy (res.data, uid, sizeof (TUID));
325 return res;
326 }
327
328//------------------------------------------------------------------------
329protected:
331};
332
333#if SMTG_CPP11_STDLIBSUPPORT
334template <typename T>
335inline bool operator== (const FUID& f1, T f2)
336{
337 static_assert (
338 std::is_same<typename std::remove_cv<T>::type, FUID>::value,
339 "Do not compare a FUID with a TUID directly. Either convert the TUID to a FUID and compare them or use FUnknownPrivate::iidEqual");
340 return f1.operator== (f2);
341}
342#endif
343
344//------------------------------------------------------------------------
345// FUnknown
346//------------------------------------------------------------------------
361{
362public:
363
364//------------------------------------------------------------------------
370 virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) = 0;
371
375 virtual uint32 PLUGIN_API addRef () = 0;
376
379 virtual uint32 PLUGIN_API release () = 0;
380
381//------------------------------------------------------------------------
382 static const FUID iid;
383//------------------------------------------------------------------------
384};
385
386
387DECLARE_CLASS_IID (FUnknown, 0x00000000, 0x00000000, 0xC0000000, 0x00000046)
388
389//------------------------------------------------------------------------
390// FUnknownPtr
391//------------------------------------------------------------------------
401template <class I>
402class FUnknownPtr : public IPtr<I>
403{
404public:
405//------------------------------------------------------------------------
406 inline FUnknownPtr (FUnknown* unknown); // query interface
407 inline FUnknownPtr (const FUnknownPtr& p) : IPtr<I> (p) {}
408 inline FUnknownPtr () {}
409
410 inline FUnknownPtr& operator= (const FUnknownPtr& p)
411 {
413 return *this;
414 }
415 inline I* operator= (FUnknown* unknown);
416 inline I* getInterface () { return this->ptr; }
417
418#if SMTG_CPP11_STDLIBSUPPORT
419 inline FUnknownPtr (FUnknownPtr&& p) SMTG_NOEXCEPT : IPtr<I> (std::move (p)) {}
420 inline FUnknownPtr& operator= (FUnknownPtr&& p) SMTG_NOEXCEPT
421 {
422 IPtr<I>::operator= (std::move (p));
423 return *this;
424 }
425#endif
426};
427
428#if SMTG_CPP11_STDLIBSUPPORT
429
430//------------------------------------------------------------------------
431namespace FUnknownPrivate {
432
433template <typename T>
434struct Void : std::false_type
435{
436 using Type = void;
437};
438
439template <typename T>
440using VoidT = typename Void<T>::Type;
441
442//------------------------------------------------------------------------
447template <typename T, typename U = void>
448struct HasIIDType : std::false_type
449{
450};
451
452//------------------------------------------------------------------------
453template <typename T>
454struct HasIIDType<T, FUnknownPrivate::VoidT<typename T::IID>> : std::true_type
455{
456};
457
458//------------------------------------------------------------------------
459} // FUnknownPrivate
460
461//------------------------------------------------------------------------
463template <typename T,
464 typename std::enable_if<FUnknownPrivate::HasIIDType<T>::value>::type* = nullptr>
465const TUID& getTUID ()
466{
467 return T::IID::toTUID ();
468}
469
470//------------------------------------------------------------------------
472template <typename T,
473 typename std::enable_if<!FUnknownPrivate::HasIIDType<T>::value>::type* = nullptr>
474const TUID& getTUID ()
475{
476 return T::iid.toTUID ();
477}
478
479#else // SMTG_CPP11_STDLIBSUPPORT
480
481template<typename T>
482const TUID& getTUID ()
483{
484 return T::iid.toTUID ();
485}
486
487#endif // SMTG_CPP11_STDLIBSUPPORT
488
489//------------------------------------------------------------------------
490template <class I>
492{
493 if (unknown && unknown->queryInterface (getTUID<I> (), (void**)&this->ptr) != kResultOk)
494 this->ptr = 0;
495}
496
497//------------------------------------------------------------------------
498template <class I>
500{
501 I* newPtr = 0;
502 if (unknown && unknown->queryInterface (getTUID<I> (), (void**)&newPtr) == kResultOk)
503 {
504 OPtr<I> rel (newPtr);
505 return IPtr<I>::operator= (newPtr);
506 }
507
508 return IPtr<I>::operator= (0);
509}
510
511//------------------------------------------------------------------------
512// FReleaser (obsolete)
513//------------------------------------------------------------------------
539{
542 {
543 if (u)
544 u->release ();
545 }
547};
548
549//------------------------------------------------------------------------
550} // namespace Steinberg
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
Definition funknown.h:233
FUID()
Definition funknown.cpp:119
FUID(const int8(&uid)[N])
Definition funknown.h:309
bool operator==(const FUID &f) const
Definition funknown.h:256
uint32 getLong1() const
Definition funknown.cpp:256
FUID & operator=(const FUID &f)
Definition funknown.cpp:200
void toString(char8 *string) const
Definition funknown.cpp:296
char8 String[33]
Definition funknown.h:268
void from4Int(uint32 d1, uint32 d2, uint32 d3, uint32 d4)
Definition funknown.cpp:207
bool fromRegistryString(const char8 *string)
Definition funknown.cpp:345
bool operator<(const FUID &f) const
Definition funknown.h:257
uint32 getLong2() const
Definition funknown.cpp:266
void print(char8 *string=nullptr, int32 style=kINLINE_UID) const
Definition funknown.cpp:414
bool operator!=(const FUID &f) const
Definition funknown.h:258
TUID data
Definition funknown.h:330
bool fromString(const char8 *string)
Definition funknown.cpp:314
bool isValid() const
Definition funknown.cpp:192
void toRegistryString(char8 *string) const
Definition funknown.cpp:383
UIDPrintStyle
Definition funknown.h:297
@ kCLASS_UID
"DECLARE_CLASS_IID (Interface, 0x00000000, 0x00000000, 0x00000000, 0x00000000)"
Definition funknown.h:301
@ kDECLARE_UID
"DECLARE_UID (0x00000000, 0x00000000, 0x00000000, 0x00000000)"
Definition funknown.h:299
@ kINLINE_UID
"INLINE_UID (0x00000000, 0x00000000, 0x00000000, 0x00000000)"
Definition funknown.h:298
@ kFUID
"FUID (0x00000000, 0x00000000, 0x00000000, 0x00000000)"
Definition funknown.h:300
virtual ~FUID()
Definition funknown.h:239
void toTUID(TUID result) const
Definition funknown.h:316
const TUID & toTUID() const
Definition funknown.h:318
static FUID fromTUID(const TUID uid)
Definition funknown.h:320
uint32 getLong3() const
Definition funknown.cpp:276
void to4Int(uint32 &d1, uint32 &d2, uint32 &d3, uint32 &d4) const
Definition funknown.cpp:247
uint32 getLong4() const
Definition funknown.cpp:286
bool generate()
Definition funknown.cpp:151
Definition funknown.h:361
virtual uint32 PLUGIN_API addRef()=0
virtual uint32 PLUGIN_API release()=0
virtual tresult PLUGIN_API queryInterface(const TUID _iid, void **obj)=0
static const FUID iid
Definition funknown.h:382
Definition funknown.h:403
FUnknownPtr(const FUnknownPtr &p)
Definition funknown.h:407
FUnknownPtr & operator=(const FUnknownPtr &p)
Definition funknown.h:410
I * getInterface()
Definition funknown.h:416
FUnknownPtr(FUnknown *unknown)
Definition funknown.h:491
FUnknownPtr()
Definition funknown.h:408
Definition smartpointer.h:44
I * ptr
Definition smartpointer.h:121
I * operator=(I *ptr)
Definition smartpointer.h:159
IPtr(I *ptr, bool addRef=true)
Definition smartpointer.h:126
Definition smartpointer.h:210
unsigned f
Definition inflate.c:1572
#define SMTG_NOEXCEPT
Definition fplatform.h:247
#define SMTG_ALWAYS_INLINE
Definition ftypes.h:185
#define DECLARE_CLASS_IID(ClassName, l1, l2, l3, l4)
Definition funknown.h:74
static PuglViewHint int value
Definition pugl.h:1708
static const SerdStyle style
Definition sratom.c:36
Definition funknown.cpp:86
int32 PLUGIN_API atomicAdd(int32 &var, int32 d)
Definition funknown.cpp:88
SMTG_ALWAYS_INLINE bool iidEqual(const void *iid1, const void *iid2)
Definition funknown.h:215
Definition baseiids.cpp:43
unsigned long long uint64
Definition ftypes.h:67
int64 LARGE_INT
Definition funknown.h:205
int int32
Definition ftypes.h:50
char char8
Definition ftypes.h:93
int8 TUID[16]
plain UID type
Definition funknown.h:210
char int8
Definition ftypes.h:39
@ kNoInterface
Definition funknown.h:192
@ kResultOk
Definition funknown.h:193
@ kInvalidArgument
Definition funknown.h:196
@ kInternalError
Definition funknown.h:198
@ kOutOfMemory
Definition funknown.h:200
@ kNotImplemented
Definition funknown.h:197
@ kResultFalse
Definition funknown.h:195
@ kResultTrue
Definition funknown.h:194
@ kNotInitialized
Definition funknown.h:199
long long int64
Definition ftypes.h:66
int32 tresult
Definition ftypes.h:76
unsigned int uint32
Definition ftypes.h:51
bool operator==(const ConstString &s1, const ConstString &s2)
Definition fstring.h:665
const TUID & getTUID()
Definition funknown.h:482
void Void
Definition juce_Functional.h:30
Type
Definition Lv2Ports.h:60
#define N
Definition nseel-cfunc.c:36
FReleaser(FUnknown *u)
Definition funknown.h:540
FUnknown * u
Definition funknown.h:546
~FReleaser()
Definition funknown.h:541
uch * p
Definition crypt.c:594
memcpy(hh, h, RAND_HEAD_LEN)
int result
Definition process.c:1455
#define void
Definition unzip.h:396