7 #ifndef _FCITX_UTILS_HANDLERTABLE_H_ 8 #define _FCITX_UTILS_HANDLERTABLE_H_ 14 #include <unordered_map> 16 #include <fcitx-utils/handlertable_details.h> 17 #include <fcitx-utils/intrusivelist.h> 18 #include <fcitx-utils/macros.h> 19 #include <fcitx-utils/misc.h> 35 template <
typename... Args>
36 FCITX_NODISCARD std::unique_ptr<HandlerTableEntry<T>> add(Args &&...args) {
37 auto result = std::make_unique<ListHandlerTableEntry<T>>(
38 std::forward<Args>(args)...);
39 handlers_.push_back(*result);
44 return {handlers_.begin(), handlers_.end()};
47 size_t size()
const {
return handlers_.size(); }
48 bool empty()
const {
return size() == 0; }
54 template <
typename Key,
typename T>
58 std::unordered_map<Key,
63 std::function<void(const Key &)> removeKey = {})
64 : addKey_(std::move(addKey)), removeKey_(std::move(removeKey)) {}
69 FCITX_NODISCARD std::unique_ptr<HandlerTableEntry<T>> add(
const Key &key,
71 auto iter = keyToHandlers_.find(key);
72 if (iter == keyToHandlers_.end()) {
79 .emplace(std::piecewise_construct,
80 std::forward_as_tuple(key),
81 std::forward_as_tuple())
84 auto result = std::make_unique<MultiHandlerTableEntry<Key, T>>(
85 this, key, std::forward<M>(t));
86 iter->second.push_back(*result);
91 auto iter = keyToHandlers_.find(key);
92 if (iter == keyToHandlers_.end()) {
95 return {iter->second.begin(), iter->second.end()};
98 bool hasKey(
const Key &key)
const {
99 auto iter = keyToHandlers_.find(key);
100 return iter != keyToHandlers_.end();
105 keyToHandlers_.begin()),
107 keyToHandlers_.end())};
111 void postRemove(
const Key &k) {
112 auto iter = keyToHandlers_.find(k);
113 if (iter != keyToHandlers_.end() && iter->second.empty()) {
117 keyToHandlers_.erase(iter);
120 std::unordered_map<Key, IntrusiveListFor<MultiHandlerTableEntry<Key, T>>>
122 std::function<bool(const Key &)> addKey_;
123 std::function<void(const Key &)> removeKey_;
127 #endif // _FCITX_UTILS_HANDLERTABLE_H_