42#if SMTG_CPP11_STDLIBSUPPORT
43#include <unordered_map>
51#define NON_EXISTING_DEPENDENCY_CHECK 0
52#define CLASS_NAME_TRACKED DEVELOPMENT
90 inline bool operator== (
const Dependency&
d)
const {
return obj ==
d.obj; }
91 inline bool operator!= (
const Dependency&
d)
const {
return obj !=
d.obj; }
92 inline bool operator< (
const Dependency&
d)
const {
return obj <
d.obj; }
93 inline bool operator> (
const Dependency&
d)
const {
return obj >
d.obj; }
138#if CLASS_NAME_TRACKED
146#if SMTG_CPP11_STDLIBSUPPORT
147using DependentMap = std::unordered_map<const FUnknown*, DependentList>;
178 while (iterMap != map.end ())
182 while (iterList != list.end ())
213 if (!unknown || !_dependent)
218#if CLASS_NAME_TRACKED
219 Update::Dependency dependent (unknown, _dependent);
223 dependent.objClass = obj->
isA ();
226 dependent.depClass = obj->
isA ();
233 if (it == map.end ())
236 list.push_back (dependent);
241 (*it).second.push_back (dependent);
251 if (unknown ==
nullptr && dependent ==
nullptr)
257 while (iter !=
table->updateData.end ())
259 if ((*iter).obj == unknown || unknown ==
nullptr)
263 if ((*iter).dependents[
count] == dependent)
264 (*iter).dependents[
count] =
nullptr;
270 if (unknown ==
nullptr)
276 while (iterMap != map.end ())
280 bool listIsEmpty =
false;
282 while (iterList != list.end ())
284#if CLASS_NAME_TRACKED
285 if ((*iterList).dep == dependent)
287 if ((*iterList) == dependent)
290 if (list.size () == 1u)
296 iterList = list.erase (iterList);
305 iterMap = map.erase (iterMap);
313 bool mustFlush =
true;
318#if NON_EXISTING_DEPENDENCY_CHECK
319 SMTG_ASSERT (iterList != map.end () &&
"ERROR: Trying to remove a non existing dependency!")
321 if (iterList != map.end ())
323 if (dependent ==
nullptr)
325 map.erase (iterList);
329 int32 eraseCount = 0;
332 while (iterDependentlist != dependentlist.end ())
334#if CLASS_NAME_TRACKED
335 if ((*iterDependentlist).dep == dependent)
337 if ((*iterDependentlist) == dependent)
340 iterDependentlist = dependentlist.erase (iterDependentlist);
342 if (dependentlist.empty ())
344 map.erase (iterList);
384 if (iterList != map.end ())
388 while (iterDependentlist != dependentlist.end ())
390#if CLASS_NAME_TRACKED
391 dependents[
count] = (*iterDependentlist).dep;
393 dependents[
count] = *iterDependentlist;
397 if (
count >= maxDependents)
399 if (dependents == smallDependents)
402 memcpy (dependents, smallDependents,
count *
sizeof (dependents[0]));
431 if (dependents != smallDependents)
439 table->updateData.pop_back ();
443 if (suppressUpdateDone ==
false)
467 bool hasDependency = (iterList != map.end ());
468 if (hasDependency ==
false)
476 while (iter !=
table->defered.end ())
478 if ((*iter).obj == unknown && (*iter).msg ==
message)
489 table->defered.push_back (change);
501 while (
table->defered.empty () ==
false)
508 table->defered.pop_front ();
511 bool canSignal =
true;
513 while (iter !=
table->updateData.end ())
515 if ((*iter).obj == obj)
531 deferedAgain.push_back (change);
544 std::find (
table->defered.begin (),
table->defered.end (), tmp);
545 if (it ==
table->defered.end ())
551 if ((*it).obj !=
nullptr)
554 table->defered.erase (it);
558 bool canSignal =
true;
560 while (iter !=
table->updateData.end ())
562 if ((*iter).obj ==
object)
578 deferedAgain.push_back (change);
584 if (deferedAgain.empty () ==
false)
589 while (iter != deferedAgain.end ())
591 table->defered.push_back (*iter);
611 auto iter = std::find (
table->defered.begin (),
table->defered.end (), change);
612 if (iter !=
table->defered.end ())
613 table->defered.erase (iter);
632 if (iterList != map.end ())
633 return iterList->second.size ();
648bool UpdateHandler::checkDeferred (
FUnknown*
object)
664bool UpdateHandler::hasDependencies (FUnknown*
u)
674 bool hasDependency = (iterList != map.end ());
676 return hasDependency;
680void UpdateHandler::printForObject (
FObject* obj)
const
686 FUnknownPtr<IDependent> dep (obj);
692 while (iterList != map.end ())
696 while (iterDependentlist != dependentlist.end ())
698#if CLASS_NAME_TRACKED
699 if ((*iterList).first == unknown || (*iterDependentlist).dep == dep.getInterface ())
703 FDebugPrint (
"Dependencies for object %8" FORMAT_INT64A
" %s\n", (
uint64)obj,
707 FDebugPrint (
"%s %8" FORMAT_INT64A
"\n <- %s %8" FORMAT_INT64A
"\n",
708 (*iterDependentlist).depClass, (
uint64) (*iterDependentlist).dep,
709 (*iterDependentlist).objClass, (
uint64) ((*iterList).first));
712 if ((*iterList).first == unknown || (*iterDependentlist) == dep.getInterface ())
716 FDebugPrint (
"Dependencies for object %8" FORMAT_INT64A
" %s\n", (
uint64)obj,
720 FDebugPrint (
"%8" FORMAT_INT64A
"\n <- %8" FORMAT_INT64A
"\n",
721 (
uint64) (*iterDependentlist), (
uint64) ((*iterList).first));
#define nullptr
Definition DistrhoDefines.h:75
static void message(int level, const char *fmt,...)
Definition adplugdb.cpp:120
FObject()
default constructor...
Definition fobject.h:85
static void setUpdateHandler(IUpdateHandler *handler)
set method for the local attribute
Definition fobject.h:115
static FObject * unknownToObject(FUnknown *unknown)
pointer conversion from FUnknown to FObject
Definition fobject.h:136
static IUpdateHandler * getUpdateHandler()
get method for the local attribute
Definition fobject.h:116
virtual void updateDone(int32)
empty virtual method that should be overridden by derived classes
Definition fobject.h:112
virtual FClassID isA() const
a local alternative to getFClassID ()
Definition fobject.h:92
Definition funknown.h:361
static const FUID iid
Definition funknown.h:382
Definition iupdatehandler.h:76
virtual void PLUGIN_API update(FUnknown *changedUnknown, int32 message)=0
@ kDestroyed
Definition iupdatehandler.h:86
Definition smartpointer.h:44
tresult PLUGIN_API addDependent(FUnknown *object, IDependent *dependent) SMTG_OVERRIDE
Definition updatehandler.cpp:210
UpdateHandler()
Definition updatehandler.cpp:193
Update::Table * table
Definition updatehandler.h:132
static bool lockUpdates
Definition updatehandler.h:134
size_t countDependencies(FUnknown *object=nullptr)
Definition updatehandler.cpp:622
tresult PLUGIN_API triggerUpdates(FUnknown *object, int32 message) SMTG_OVERRIDE
Definition updatehandler.cpp:450
tresult PLUGIN_API triggerDeferedUpdates(FUnknown *object=nullptr) SMTG_OVERRIDE
Definition updatehandler.cpp:496
tresult PLUGIN_API removeDependent(FUnknown *object, IDependent *dependent) SMTG_OVERRIDE
Definition updatehandler.cpp:248
~UpdateHandler()
Definition updatehandler.cpp:201
tresult doTriggerUpdates(FUnknown *object, int32 message, bool suppressUpdateDone)
Definition updatehandler.cpp:364
Steinberg::Base::Thread::FLock lock
Definition updatehandler.h:131
tresult PLUGIN_API deferUpdates(FUnknown *object, int32 message) SMTG_OVERRIDE
Definition updatehandler.cpp:456
tresult PLUGIN_API cancelUpdates(FUnknown *object) SMTG_OVERRIDE
Definition updatehandler.cpp:600
unsigned * m
Definition inflate.c:1559
register unsigned j
Definition inflate.c:1576
unsigned d
Definition inflate.c:940
struct huft * u[BMAX]
Definition inflate.c:1583
register unsigned i
Definition inflate.c:1575
#define SMTG_WARNING(s)
Definition fdebug.h:197
#define NEW
Definition fdebug.h:212
#define SMTG_ASSERT(f)
Definition fdebug.h:196
#define DEF_CLASS_IID(ClassName)
Definition funknown.h:78
JSAMPIMAGE data
Definition jpeglib.h:945
const char * msg
Definition missing_descriptor.c:20
@ unknown
Definition VstPlugin.cpp:75
Definition updatehandler.cpp:61
const uint32 kHashSize
Definition updatehandler.cpp:62
std::deque< UpdateData > UpdateDataList
Definition updatehandler.cpp:135
void updateDone(FUnknown *unknown, int32 message)
Definition updatehandler.cpp:162
DeferedChangeList::const_iterator DeferedChangeListIterConst
Definition updatehandler.cpp:132
std::vector< IDependent * > DependentList
Definition updatehandler.cpp:141
uint32 hashPointer(void *p)
Definition updatehandler.cpp:66
std::map< const FUnknown *, DependentList > DependentMap
Definition updatehandler.cpp:149
IPtr< FUnknown > getUnknownBase(FUnknown *unknown)
Definition updatehandler.cpp:72
const uint32 kMapSize
Definition updatehandler.cpp:63
DependentMap::iterator DependentMapIter
Definition updatehandler.cpp:151
DependentMap::const_iterator DependentMapIterConst
Definition updatehandler.cpp:152
DependentList::const_iterator DependentListIterConst
Definition updatehandler.cpp:144
DependentList::iterator DependentListIter
Definition updatehandler.cpp:143
std::deque< DeferedChange > DeferedChangeList
Definition updatehandler.cpp:131
UpdateDataList::const_iterator UpdateDataListIterConst
Definition updatehandler.cpp:136
DeferedChangeList::iterator DeferedChangeListIter
Definition updatehandler.cpp:133
Definition baseiids.cpp:43
unsigned long long uint64
Definition ftypes.h:67
int int32
Definition ftypes.h:50
static int32 countEntries(Update::DependentMap &map)
Definition updatehandler.cpp:174
@ kResultFalse
Definition funknown.h:195
@ kResultTrue
Definition funknown.h:194
int32 tresult
Definition ftypes.h:76
FIDString FClassID
Definition fobject.h:52
IPtr< I > owned(I *p)
Definition smartpointer.h:241
unsigned int uint32
Definition ftypes.h:51
Definition updatehandler.cpp:104
DeferedChange(const DeferedChange &r)
Definition updatehandler.cpp:107
FUnknown * obj
Definition updatehandler.cpp:110
int32 msg
Definition updatehandler.cpp:111
~DeferedChange()
Definition updatehandler.cpp:106
DeferedChange(FUnknown *o, int32 m=0)
Definition updatehandler.cpp:105
bool operator!=(const DeferedChange &d) const
Definition updatehandler.cpp:109
bool operator==(const DeferedChange &d) const
Definition updatehandler.cpp:108
Definition updatehandler.cpp:155
DependentMap depMap[kHashSize]
Definition updatehandler.cpp:156
DeferedChangeList defered
Definition updatehandler.cpp:157
UpdateDataList updateData
Definition updatehandler.cpp:158
Definition updatehandler.cpp:116
FUnknown * obj
Definition updatehandler.cpp:121
bool operator==(const UpdateData &d) const
Definition updatehandler.cpp:124
uint32 count
Definition updatehandler.cpp:123
UpdateData(FUnknown *o, IDependent **d, uint32 c)
Definition updatehandler.cpp:117
IDependent ** dependents
Definition updatehandler.cpp:122
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
memcpy(hh, h, RAND_HEAD_LEN)
int r
Definition crypt.c:458
int result
Definition process.c:1455
_WDL_CSTRING_PREFIX void INT_PTR count
Definition wdlcstring.h:263