123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- // This file was GENERATED by command:
- // pump.py callback.h.pump
- // DO NOT EDIT BY HAND!!!
- /*
- * Copyright 2012 The WebRTC Project Authors. All rights reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
- // To generate callback.h from callback.h.pump, execute:
- // ../third_party/googletest/src/googletest/scripts/pump.py callback.h.pump
- // Callbacks are callable object containers. They can hold a function pointer
- // or a function object and behave like a value type. Internally, data is
- // reference-counted, making copies and pass-by-value inexpensive.
- //
- // Callbacks are typed using template arguments. The format is:
- // CallbackN<ReturnType, ParamType1, ..., ParamTypeN>
- // where N is the number of arguments supplied to the callable object.
- // Callbacks are invoked using operator(), just like a function or a function
- // object. Default-constructed callbacks are "empty," and executing an empty
- // callback does nothing. A callback can be made empty by assigning it from
- // a default-constructed callback.
- //
- // Callbacks are similar in purpose to std::function (which isn't available on
- // all platforms we support) and a lightweight alternative to sigslots. Since
- // they effectively hide the type of the object they call, they're useful in
- // breaking dependencies between objects that need to interact with one another.
- // Notably, they can hold the results of Bind(), std::bind*, etc, without
- // needing
- // to know the resulting object type of those calls.
- //
- // Sigslots, on the other hand, provide a fuller feature set, such as multiple
- // subscriptions to a signal, optional thread-safety, and lifetime tracking of
- // slots. When these features are needed, choose sigslots.
- //
- // Example:
- // int sqr(int x) { return x * x; }
- // struct AddK {
- // int k;
- // int operator()(int x) const { return x + k; }
- // } add_k = {5};
- //
- // Callback1<int, int> my_callback;
- // cout << my_callback.empty() << endl; // true
- //
- // my_callback = Callback1<int, int>(&sqr);
- // cout << my_callback.empty() << endl; // false
- // cout << my_callback(3) << endl; // 9
- //
- // my_callback = Callback1<int, int>(add_k);
- // cout << my_callback(10) << endl; // 15
- //
- // my_callback = Callback1<int, int>();
- // cout << my_callback.empty() << endl; // true
- #ifndef RTC_BASE_CALLBACK_H_
- #define RTC_BASE_CALLBACK_H_
- #include "api/scoped_refptr.h"
- #include "rtc_base/ref_count.h"
- #include "rtc_base/ref_counted_object.h"
- namespace rtc {
- template <class R>
- class Callback0 {
- public:
- // Default copy operations are appropriate for this class.
- Callback0() {}
- template <class T>
- Callback0(const T& functor)
- : helper_(new RefCountedObject<HelperImpl<T> >(functor)) {}
- R operator()() {
- if (empty())
- return R();
- return helper_->Run();
- }
- bool empty() const { return !helper_; }
- private:
- struct Helper : RefCountInterface {
- virtual ~Helper() {}
- virtual R Run() = 0;
- };
- template <class T>
- struct HelperImpl : Helper {
- explicit HelperImpl(const T& functor) : functor_(functor) {}
- virtual R Run() { return functor_(); }
- T functor_;
- };
- scoped_refptr<Helper> helper_;
- };
- template <class R, class P1>
- class Callback1 {
- public:
- // Default copy operations are appropriate for this class.
- Callback1() {}
- template <class T>
- Callback1(const T& functor)
- : helper_(new RefCountedObject<HelperImpl<T> >(functor)) {}
- R operator()(P1 p1) {
- if (empty())
- return R();
- return helper_->Run(p1);
- }
- bool empty() const { return !helper_; }
- private:
- struct Helper : RefCountInterface {
- virtual ~Helper() {}
- virtual R Run(P1 p1) = 0;
- };
- template <class T>
- struct HelperImpl : Helper {
- explicit HelperImpl(const T& functor) : functor_(functor) {}
- virtual R Run(P1 p1) { return functor_(p1); }
- T functor_;
- };
- scoped_refptr<Helper> helper_;
- };
- template <class R, class P1, class P2>
- class Callback2 {
- public:
- // Default copy operations are appropriate for this class.
- Callback2() {}
- template <class T>
- Callback2(const T& functor)
- : helper_(new RefCountedObject<HelperImpl<T> >(functor)) {}
- R operator()(P1 p1, P2 p2) {
- if (empty())
- return R();
- return helper_->Run(p1, p2);
- }
- bool empty() const { return !helper_; }
- private:
- struct Helper : RefCountInterface {
- virtual ~Helper() {}
- virtual R Run(P1 p1, P2 p2) = 0;
- };
- template <class T>
- struct HelperImpl : Helper {
- explicit HelperImpl(const T& functor) : functor_(functor) {}
- virtual R Run(P1 p1, P2 p2) { return functor_(p1, p2); }
- T functor_;
- };
- scoped_refptr<Helper> helper_;
- };
- template <class R, class P1, class P2, class P3>
- class Callback3 {
- public:
- // Default copy operations are appropriate for this class.
- Callback3() {}
- template <class T>
- Callback3(const T& functor)
- : helper_(new RefCountedObject<HelperImpl<T> >(functor)) {}
- R operator()(P1 p1, P2 p2, P3 p3) {
- if (empty())
- return R();
- return helper_->Run(p1, p2, p3);
- }
- bool empty() const { return !helper_; }
- private:
- struct Helper : RefCountInterface {
- virtual ~Helper() {}
- virtual R Run(P1 p1, P2 p2, P3 p3) = 0;
- };
- template <class T>
- struct HelperImpl : Helper {
- explicit HelperImpl(const T& functor) : functor_(functor) {}
- virtual R Run(P1 p1, P2 p2, P3 p3) { return functor_(p1, p2, p3); }
- T functor_;
- };
- scoped_refptr<Helper> helper_;
- };
- template <class R, class P1, class P2, class P3, class P4>
- class Callback4 {
- public:
- // Default copy operations are appropriate for this class.
- Callback4() {}
- template <class T>
- Callback4(const T& functor)
- : helper_(new RefCountedObject<HelperImpl<T> >(functor)) {}
- R operator()(P1 p1, P2 p2, P3 p3, P4 p4) {
- if (empty())
- return R();
- return helper_->Run(p1, p2, p3, p4);
- }
- bool empty() const { return !helper_; }
- private:
- struct Helper : RefCountInterface {
- virtual ~Helper() {}
- virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4) = 0;
- };
- template <class T>
- struct HelperImpl : Helper {
- explicit HelperImpl(const T& functor) : functor_(functor) {}
- virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4) {
- return functor_(p1, p2, p3, p4);
- }
- T functor_;
- };
- scoped_refptr<Helper> helper_;
- };
- template <class R, class P1, class P2, class P3, class P4, class P5>
- class Callback5 {
- public:
- // Default copy operations are appropriate for this class.
- Callback5() {}
- template <class T>
- Callback5(const T& functor)
- : helper_(new RefCountedObject<HelperImpl<T> >(functor)) {}
- R operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
- if (empty())
- return R();
- return helper_->Run(p1, p2, p3, p4, p5);
- }
- bool empty() const { return !helper_; }
- private:
- struct Helper : RefCountInterface {
- virtual ~Helper() {}
- virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) = 0;
- };
- template <class T>
- struct HelperImpl : Helper {
- explicit HelperImpl(const T& functor) : functor_(functor) {}
- virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
- return functor_(p1, p2, p3, p4, p5);
- }
- T functor_;
- };
- scoped_refptr<Helper> helper_;
- };
- } // namespace rtc
- #endif // RTC_BASE_CALLBACK_H_
|