7 #ifndef _FCITX_UTILS_HANDLERTABLE_DETAILS_H_ 8 #define _FCITX_UTILS_HANDLERTABLE_DETAILS_H_ 16 #include <fcitx-utils/fcitxutils_export.h> 17 #include <fcitx-utils/intrusivelist.h> 18 #include <fcitx-utils/macros.h> 29 using HandlerTableData = std::shared_ptr<std::unique_ptr<T>>;
37 template <
typename... Args>
39 : handler_(std::make_shared<std::unique_ptr<T>>(
40 std::make_unique<T>(std::forward<Args>(args)...))) {}
41 ~HandlerTableEntry()
override { handler_->reset(); }
43 HandlerTableData<T> handler()
const {
return handler_; }
46 HandlerTableData<T> handler_;
58 &ListHandlerTableEntry::node_>;
60 template <
typename... Args>
61 ListHandlerTableEntry(Args &&...args)
63 virtual ~ListHandlerTableEntry() { node_.remove(); }
66 template <
typename Key,
typename T>
69 template <
typename Key,
typename T>
78 &MultiHandlerTableEntry::node_>;
83 &MultiHandlerTableEntry::node_>;
86 key_(std::move(key)) {}
87 ~MultiHandlerTableEntry();
90 template <
typename Key,
typename T>
92 if (node_.isInList()) {
94 table_->postRemove(key_);
100 using container_type = std::vector<HandlerTableData<T>>;
105 template <
typename _Iter>
107 for (; begin != end; begin++) {
108 view_.emplace_back(begin->handler());
114 using iterator_category = std::input_iterator_tag;
115 using value_type = T;
116 using difference_type = std::ptrdiff_t;
117 using reference = value_type &;
118 using pointer = value_type *;
120 iterator(
typename container_type::const_iterator iter,
121 typename container_type::const_iterator end)
122 : parentIter_(iter), endIter_(end) {
123 while (parentIter_ != endIter_ && !*parentIter_ && !**parentIter_) {
128 FCITX_INLINE_DEFINE_DEFAULT_DTOR_AND_COPY(
iterator)
130 bool operator==(
const iterator &other)
const noexcept {
131 return parentIter_ == other.parentIter_;
133 bool operator!=(
const iterator &other)
const noexcept {
134 return !operator==(other);
143 }
while (parentIter_ != endIter_ && !(**parentIter_));
148 auto old = parentIter_;
150 return {old, endIter_};
153 reference operator*() {
return ***parentIter_; }
155 pointer operator->() {
return (**parentIter_).get(); }
158 typename container_type::const_iterator parentIter_;
159 typename container_type::const_iterator endIter_;
166 std::vector<HandlerTableData<T>> view_;
170 #endif // _FCITX_UTILS_HANDLERTABLE_DETAILS_H_