147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2006 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_SIGSLOTREPEATER_H__
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_SIGSLOTREPEATER_H__
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// repeaters are both signals and slots, which are designed as intermediate
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// pass-throughs for signals and slots which don't know about each other (for
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// modularity or encapsulation).  This eliminates the need to declare a signal
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// handler whose sole purpose is to fire another signal.  The repeater connects
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// to the originating signal using the 'repeat' method.  When the repeated
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// signal fires, the repeater will also fire.
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/sigslot.h"
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace sigslot {
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  template<class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  class repeater0 : public signal0<mt_policy>,
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    public has_slots<mt_policy>
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  {
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  public:
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    typedef signal0<mt_policy> base_type;
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    typedef repeater0<mt_policy> this_type;
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    repeater0() { }
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    repeater0(const this_type& s) : base_type(s) { }
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void reemit() { signal0<mt_policy>::emit(); }
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void repeat(base_type &s) { s.connect(this, &this_type::reemit); }
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void stop(base_type &s) { s.disconnect(this); }
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  };
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  template<class arg1_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  class repeater1 : public signal1<arg1_type, mt_policy>,
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    public has_slots<mt_policy>
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  {
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  public:
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    typedef signal1<arg1_type, mt_policy> base_type;
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    typedef repeater1<arg1_type, mt_policy> this_type;
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    repeater1() { }
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    repeater1(const this_type& s) : base_type(s) { }
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void reemit(arg1_type a1) { signal1<arg1_type, mt_policy>::emit(a1); }
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void repeat(base_type& s) { s.connect(this, &this_type::reemit); }
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void stop(base_type &s) { s.disconnect(this); }
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  };
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  template<class arg1_type, class arg2_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  class repeater2 : public signal2<arg1_type, arg2_type, mt_policy>,
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    public has_slots<mt_policy>
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  {
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  public:
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    typedef signal2<arg1_type, arg2_type, mt_policy> base_type;
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    typedef repeater2<arg1_type, arg2_type, mt_policy> this_type;
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    repeater2() { }
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    repeater2(const this_type& s) : base_type(s) { }
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void reemit(arg1_type a1, arg2_type a2) { signal2<arg1_type, arg2_type, mt_policy>::emit(a1,a2); }
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void repeat(base_type& s) { s.connect(this, &this_type::reemit); }
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void stop(base_type &s) { s.disconnect(this); }
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  };
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  template<class arg1_type, class arg2_type, class arg3_type,
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org           class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  class repeater3 : public signal3<arg1_type, arg2_type, arg3_type, mt_policy>,
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    public has_slots<mt_policy>
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  {
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  public:
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    typedef signal3<arg1_type, arg2_type, arg3_type, mt_policy> base_type;
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    typedef repeater3<arg1_type, arg2_type, arg3_type, mt_policy> this_type;
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    repeater3() { }
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    repeater3(const this_type& s) : base_type(s) { }
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void reemit(arg1_type a1, arg2_type a2, arg3_type a3) {
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            signal3<arg1_type, arg2_type, arg3_type, mt_policy>::emit(a1,a2,a3);
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void repeat(base_type& s) { s.connect(this, &this_type::reemit); }
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void stop(base_type &s) { s.disconnect(this); }
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  };
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace sigslot
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // WEBRTC_BASE_SIGSLOTREPEATER_H__
95