Twitch SDK (Internal)
eventsource.h
Go to the documentation of this file.
1 /********************************************************************************************
2 * Twitch Broadcasting SDK
3 *
4 * This software is supplied under the terms of a license agreement with Twitch Interactive, Inc. and
5 * may not be copied or used except in accordance with the terms of that agreement
6 * Copyright (c) 2012-2016 Twitch Interactive, Inc.
7 *********************************************************************************************/
8 
9 #pragma once
10 
11 #include <functional>
12 #include <memory>
13 #include <vector>
14 
15 
16 namespace ttv
17 {
18  template <typename T> class EventSource;
19 }
20 
21 template <typename T>
22 class ttv::EventSource
23 {
24 public:
25  void AddListener(const std::shared_ptr<T>& listener)
26  {
27  if (listener != nullptr)
28  {
29  auto iter = FindListener(listener);
30  if (iter == mListeners.end())
31  {
32  mListeners.push_back(listener);
33  }
34  }
35  }
36 
37  bool RemoveListener(const std::shared_ptr<T>& listener)
38  {
39  if (listener != nullptr)
40  {
41  auto iter = FindListener(listener);
42  if (iter != mListeners.end())
43  {
44  mListeners.erase(iter);
45  return true;
46  }
47  }
48 
49  return false;
50  }
51 
53  {
54  mListeners.clear();
55  }
56 
57  void Invoke(std::function<void(const std::shared_ptr<T>&)> callback)
58  {
59  std::vector<std::shared_ptr<T>> listeners;
60  CaptureListeners(listeners);
61  Invoke(callback, listeners);
62  }
63 
64  void Invoke(std::function<void(const std::shared_ptr<T>&)> callback, const std::vector<std::shared_ptr<T>>& listeners)
65  {
66  for (const auto& listener : listeners)
67  {
68  callback(listener);
69  }
70  }
71 
72  bool Empty()
73  {
74  Tidy();
75  return mListeners.empty();
76  }
77 
78  void CaptureListeners(std::vector<std::shared_ptr<T>>& listeners)
79  {
80  for (IterType iter = mListeners.begin(); iter != mListeners.end();)
81  {
82  auto locked = iter->lock();
83 
84  if (locked == nullptr)
85  {
86  iter = mListeners.erase(iter);
87  }
88  else
89  {
90  listeners.push_back(locked);
91  ++iter;
92  }
93  }
94  }
95 
96 private:
97  typedef typename std::weak_ptr<T> ListenerType;
98  typedef typename std::vector<ListenerType> ListType;
99  typedef typename ListType::iterator IterType;
100 
101  void Tidy()
102  {
103  for (IterType iter = mListeners.begin(); iter != mListeners.end(); )
104  {
105  auto locked = iter->lock();
106 
107  if (locked == nullptr)
108  {
109  iter = mListeners.erase(iter);
110  }
111  else
112  {
113  ++iter;
114  }
115  }
116  }
117 
118  IterType FindListener(const std::shared_ptr<T>& listener)
119  {
120  IterType iter = mListeners.begin();
121 
122  for (; iter != mListeners.end(); )
123  {
124  auto locked = iter->lock();
125 
126  if (locked == nullptr)
127  {
128  iter = mListeners.erase(iter);
129  }
130  else if (locked == listener)
131  {
132  break;
133  }
134  else
135  {
136  ++iter;
137  }
138  }
139 
140  return iter;
141  }
142 
143  ListType mListeners;
144 };
std::vector< ListenerType > ListType
Definition: eventsource.h:98
IterType FindListener(const std::shared_ptr< T > &listener)
Definition: eventsource.h:118
void Invoke(std::function< void(const std::shared_ptr< T > &)> callback)
Definition: eventsource.h:57
JSON (JavaScript Object Notation).
Definition: adsapi.h:16
Definition: eventsource.h:18
ListType::iterator IterType
Definition: eventsource.h:99
bool Empty()
Definition: eventsource.h:72
void AddListener(const std::shared_ptr< T > &listener)
Definition: eventsource.h:25
void Invoke(std::function< void(const std::shared_ptr< T > &)> callback, const std::vector< std::shared_ptr< T >> &listeners)
Definition: eventsource.h:64
void ClearListeners()
Definition: eventsource.h:52
bool RemoveListener(const std::shared_ptr< T > &listener)
Definition: eventsource.h:37
void CaptureListeners(std::vector< std::shared_ptr< T >> &listeners)
Definition: eventsource.h:78
void Tidy()
Definition: eventsource.h:101
std::weak_ptr< T > ListenerType
Definition: eventsource.h:97
ListType mListeners
Definition: eventsource.h:143