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 *;
122 iterator(
typename container_type::const_iterator iter,
123 typename container_type::const_iterator end)
124 : parentIter_(iter), endIter_(end) {
125 while (parentIter_ != endIter_ && !*parentIter_ && !**parentIter_) {
130 FCITX_INLINE_DEFINE_DEFAULT_DTOR_AND_COPY(
iterator)
132 bool operator==(
const iterator &other)
const noexcept {
133 return parentIter_ == other.parentIter_;
135 bool operator!=(
const iterator &other)
const noexcept {
136 return !operator==(other);
145 }
while (parentIter_ != endIter_ && !(**parentIter_));
150 auto old = parentIter_;
152 return {old, endIter_};
155 reference operator*()
const {
return ***parentIter_; }
157 pointer operator->()
const {
return (**parentIter_).get(); }
160 typename container_type::const_iterator parentIter_;
161 typename container_type::const_iterator endIter_;
168 std::vector<HandlerTableData<T>> view_;
172 #endif // _FCITX_UTILS_HANDLERTABLE_DETAILS_H_