blob: ca4485457e65010cdebd9e892e5b5eca4638dc8f [file] [log] [blame]
Taylor Brandstettere68b6c92017-10-05 09:13:55 -07001/*
2 * Copyright 2017 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef RTC_BASE_SIGSLOTREPEATER_H__
12#define RTC_BASE_SIGSLOTREPEATER_H__
13
14// repeaters are both signals and slots, which are designed as intermediate
15// pass-throughs for signals and slots which don't know about each other (for
16// modularity or encapsulation). This eliminates the need to declare a signal
17// handler whose sole purpose is to fire another signal. The repeater connects
18// to the originating signal using the 'repeat' method. When the repeated
19// signal fires, the repeater will also fire.
20//
21// TODO(deadbeef): Actually use this, after we decide on some style points on
22// using signals, so it doesn't get deleted again.
23
24#include "rtc_base/sigslot.h"
25
26namespace sigslot {
27
28template <class mt_policy, typename... Args>
29class repeater_with_thread_policy
30 : public signal_with_thread_policy<mt_policy, Args...>,
31 public has_slots<mt_policy> {
32 private:
33 // These typedefs are just to make the code below more readable. Code using
34 // repeaters shouldn't need to reference these types directly.
35 typedef signal_with_thread_policy<mt_policy, Args...> base_type;
36 typedef repeater_with_thread_policy<mt_policy, Args...> this_type;
37
38 public:
39 repeater_with_thread_policy() {}
40 repeater_with_thread_policy(const this_type& s) : base_type(s) {}
41
42 void reemit(Args... args) { base_type::emit(args...); }
43 void repeat(base_type& s) { s.connect(this, &this_type::reemit); }
44 void stop(base_type& s) { s.disconnect(this); }
45};
46
47// Alias with default thread policy. Needed because both default arguments
48// and variadic template arguments must go at the end of the list, so we
49// can't have both at once.
50template <typename... Args>
51using repeater =
52 repeater_with_thread_policy<SIGSLOT_DEFAULT_MT_POLICY, Args...>;
53
54} // namespace sigslot
55
56#endif // RTC_BASE_SIGSLOTREPEATER_H__