Fcitx
addoninstance_details.h
1 /*
2  * SPDX-FileCopyrightText: 2017-2017 CSSlayer <wengxt@gmail.com>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  *
6  */
7 #ifndef _FCITX_ADDONINSTANCE_DETAILS_H_
8 #define _FCITX_ADDONINSTANCE_DETAILS_H_
9 
10 #include <functional>
11 #include <string>
12 #include <utility>
13 
14 namespace fcitx {
15 
16 class AddonInstance;
17 class AddonInstancePrivate;
19 public:
20  virtual ~AddonFunctionAdaptorBase() = default;
21 };
22 
23 template <typename Sig>
25 
26 template <typename Ret, typename... Args>
27 class AddonFunctionAdaptorErasure<Ret(Args...)>
28  : public AddonFunctionAdaptorBase {
29 public:
30  virtual Ret callback(Args... args) = 0;
31 };
32 
33 template <typename T>
35 
36 template <typename Signature>
37 using AddonFunctionSignatureType =
39 
40 template <typename Signature>
41 using AddonFunctionSignatureReturnType =
42  typename std::function<AddonFunctionSignatureType<Signature>>::result_type;
43 
44 template <typename CallbackType>
46 
47 template <typename Class, typename Ret, typename... Args>
48 class AddonFunctionAdaptor<Ret (Class::*)(Args...)>
49  : public AddonFunctionAdaptorErasure<Ret(Args...)> {
50 public:
51  typedef Ret (Class::*CallbackType)(Args...);
52  typedef Ret Signature(Args...);
53 
54  AddonFunctionAdaptor(const std::string &name, Class *addon,
55  CallbackType pCallback)
56  : AddonFunctionAdaptorErasure<Ret(Args...)>(), addon_(addon),
57  pCallback_(pCallback) {
58  addon->registerCallback(name, this);
59  }
60 
61  Ret callback(Args... args) override {
62  return (addon_->*pCallback_)(std::forward<Args>(args)...);
63  }
64 
65 private:
66  Class *addon_;
67  CallbackType pCallback_;
68 };
69 
70 template <typename Class, typename Ret, typename... Args>
71 class AddonFunctionAdaptor<Ret (Class::*)(Args...) const>
72  : public AddonFunctionAdaptorErasure<Ret(Args...)> {
73 public:
74  typedef Ret (Class::*CallbackType)(Args...) const;
75  typedef Ret Signature(Args...);
76 
77  AddonFunctionAdaptor(const std::string &name, Class *addon,
78  CallbackType pCallback)
79  : AddonFunctionAdaptorErasure<Ret(Args...)>(), addon_(addon),
80  pCallback_(pCallback) {
81  addon->registerCallback(name, this);
82  }
83 
84  Ret callback(Args... args) override {
85  return (addon_->*pCallback_)(std::forward<Args>(args)...);
86  }
87 
88 private:
89  Class *addon_;
90  CallbackType pCallback_;
91 };
92 
93 template <typename CallbackType>
95 MakeAddonFunctionAdaptor(CallbackType pCallback);
96 
97 } // namespace fcitx
98 
99 #endif // _FCITX_ADDONINSTANCE_DETAILS_H_
Definition: action.cpp:12