ASPiK SDK
idependency.h
1 // This file is part of VSTGUI. It is subject to the license terms
2 // in the LICENSE file found in the top-level directory of this
3 // distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
4 
5 #ifndef __idependency__
6 #define __idependency__
7 
8 #include "vstguibase.h"
9 #include "vstguidebug.h"
10 #include <list>
11 #include <set>
12 #include <algorithm>
13 #include <cassert>
14 
15 namespace VSTGUI {
16 
17 //----------------------------------------------------------------------------------------------------
25 //----------------------------------------------------------------------------------------------------
27 {
28 public:
30  virtual void addDependency (CBaseObject* obj);
32  virtual void removeDependency (CBaseObject* obj);
34  virtual void changed (IdStringPtr message);
36  virtual void deferChanges (bool state);
37 
40  {
41  public:
42  explicit DeferChanges (IDependency* dep) : dep (dep) { dep->deferChanges (true); }
43  ~DeferChanges () noexcept { dep->deferChanges (false); }
44  protected:
45  IDependency* dep;
46  };
47 
48 //----------------------------------------------------------------------------------------------------
49 protected:
50  IDependency () = default;
51  virtual ~IDependency () noexcept;
52 
53  static void rememberObject (CBaseObject* obj) { obj->remember (); }
54  static void forgetObject (CBaseObject* obj) { obj->forget (); }
55 
56  using DeferedChangesSet = std::set<IdStringPtr>;
57  using DependentList = std::list<CBaseObject*>;
58 
59  int32_t deferChangeCount {0};
60  DeferedChangesSet deferedChanges;
61  DependentList dependents;
62 };
63 
64 //----------------------------------------------------------------------------------------------------
66 {
67  dependents.emplace_back (obj);
68 }
69 
70 //----------------------------------------------------------------------------------------------------
72 {
73  dependents.remove (obj);
74 }
75 
76 //----------------------------------------------------------------------------------------------------
77 inline void IDependency::changed (IdStringPtr message)
78 {
79  if (deferChangeCount)
80  {
81  deferedChanges.emplace (message);
82  }
83  else if (dependents.empty () == false)
84  {
85  CBaseObject* This = dynamic_cast<CBaseObject*> (this);
86  DependentList localList (dependents);
87  std::for_each (localList.begin (), localList.end (), rememberObject);
88  for (auto& obj : localList)
89  obj->notify (This, message);
90  std::for_each (localList.begin (), localList.end (), forgetObject);
91  }
92 }
93 
94 //----------------------------------------------------------------------------------------------------
95 inline void IDependency::deferChanges (bool state)
96 {
97  if (state)
98  {
99  deferChangeCount++;
100  }
101  else if (--deferChangeCount == 0)
102  {
103  for (auto& msg : deferedChanges)
104  changed (msg);
105  deferedChanges.clear ();
106  }
107 }
108 
109 //----------------------------------------------------------------------------------------------------
110 inline IDependency::~IDependency () noexcept
111 {
112  vstgui_assert (dependents.size () == 0);
113 }
114 
115 } // namespace
116 
117 #endif
virtual void deferChanges(bool state)
Definition: idependency.h:95
Base Object with reference counter.
Definition: vstguibase.h:276
virtual void changed(IdStringPtr message)
Definition: idependency.h:77
Definition: customcontrols.cpp:8
void forget() override
decrease refcount and delete object if refcount == 0
Definition: vstguibase.h:260
Definition: idependency.h:39
virtual void addDependency(CBaseObject *obj)
Definition: idependency.h:65
virtual void removeDependency(CBaseObject *obj)
Definition: idependency.h:71
simple dependency between objects.
Definition: idependency.h:26