Hazelcast C++ Client
Hazelcast C++ Client Library
entry_listener.h
1 /*
2  * Copyright (c) 2008-2022, Hazelcast, Inc. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <functional>
20 #include <utility>
21 
22 #include "hazelcast/util/noop.h"
23 #include "hazelcast/client/entry_event.h"
24 #include "hazelcast/util/type_traits.h"
25 
26 namespace hazelcast {
27 namespace client {
28 class imap;
29 class map_event;
30 class replicated_map;
31 namespace impl {
32 template<typename>
33 class EntryEventHandler;
34 }
35 
49 class entry_listener final
50 {
51 public:
57  template<typename Handler,
58  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
59  entry_listener& on_added(Handler&& h) &
60  {
61  added_ = std::forward<Handler>(h);
62  add_flag(entry_event::type::ADDED);
63  return *this;
64  }
65 
69  template<typename Handler,
70  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
71  entry_listener&& on_added(Handler&& h) &&
72  {
73  on_added(std::forward<Handler>(h));
74  return std::move(*this);
75  }
76 
82  template<typename Handler,
83  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
84  entry_listener& on_removed(Handler&& h) &
85  {
86  removed_ = std::forward<Handler>(h);
87  add_flag(entry_event::type::REMOVED);
88  return *this;
89  }
90 
94  template<typename Handler,
95  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
96  entry_listener&& on_removed(Handler&& h) &&
97  {
98  on_removed(std::forward<Handler>(h));
99  return std::move(*this);
100  }
101 
107  template<typename Handler,
108  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
109  entry_listener& on_updated(Handler&& h) &
110  {
111  updated_ = std::forward<Handler>(h);
112  add_flag(entry_event::type::UPDATED);
113  return *this;
114  }
115 
119  template<typename Handler,
120  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
121  entry_listener&& on_updated(Handler&& h) &&
122  {
123  on_updated(std::forward<Handler>(h));
124  return std::move(*this);
125  }
126 
132  template<typename Handler,
133  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
134  entry_listener& on_evicted(Handler&& h) &
135  {
136  evicted_ = std::forward<Handler>(h);
137  add_flag(entry_event::type::EVICTED);
138  return *this;
139  }
140 
144  template<typename Handler,
145  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
146  entry_listener&& on_evicted(Handler&& h) &&
147  {
148  on_evicted(std::forward<Handler>(h));
149  return std::move(*this);
150  }
151 
157  template<typename Handler,
158  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
159  entry_listener& on_expired(Handler&& h) &
160  {
161  expired_ = std::forward<Handler>(h);
162  add_flag(entry_event::type::EXPIRED);
163  return *this;
164  }
165 
169  template<typename Handler,
170  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
171  entry_listener&& on_expired(Handler&& h) &&
172  {
173  on_expired(std::forward<Handler>(h));
174  return std::move(*this);
175  }
176 
182  template<typename Handler,
183  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
184  entry_listener& on_merged(Handler&& h) &
185  {
186  merged_ = std::forward<Handler>(h);
187  add_flag(entry_event::type::MERGED);
188  return *this;
189  }
190 
194  template<typename Handler,
195  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
196  entry_listener&& on_merged(Handler&& h) &&
197  {
198  on_merged(std::forward<Handler>(h));
199  return std::move(*this);
200  }
201 
207  template<typename Handler,
208  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
210  {
211  map_evicted_ = std::forward<Handler>(h);
212  add_flag(entry_event::type::EVICT_ALL);
213  return *this;
214  }
215 
219  template<typename Handler,
220  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
221  entry_listener&& on_map_evicted(Handler&& h) &&
222  {
223  on_map_evicted(std::forward<Handler>(h));
224  return std::move(*this);
225  }
226 
232  template<typename Handler,
233  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
235  {
236  map_cleared_ = std::forward<Handler>(h);
237  add_flag(entry_event::type::CLEAR_ALL);
238  return *this;
239  }
240 
244  template<typename Handler,
245  typename = util::enable_if_rvalue_ref_trait<Handler&&>>
246  entry_listener&& on_map_cleared(Handler&& h) &&
247  {
248  on_map_cleared(std::forward<Handler>(h));
249  return std::move(*this);
250  }
251 
252 private:
253  using EntryHandlerType = std::function<void(entry_event&&)>;
254  EntryHandlerType added_ = util::noop<entry_event&&>,
255  removed_ = util::noop<entry_event&&>,
256  updated_ = util::noop<entry_event&&>,
257  evicted_ = util::noop<entry_event&&>,
258  expired_ = util::noop<entry_event&&>,
259  merged_ = util::noop<entry_event&&>;
260 
261  using MapHandlerType = std::function<void(map_event&&)>;
262  MapHandlerType map_evicted_ = util::noop<map_event&&>,
263  map_cleared_ = util::noop<map_event&&>;
264 
265  int32_t flags_ = 0;
266 
267  void add_flag(entry_event::type t) { flags_ |= static_cast<int32_t>(t); }
268 
269  template<typename>
270  friend class impl::EntryEventHandler;
271  friend class replicated_map;
272  friend class imap;
273 };
274 } // namespace client
275 } // namespace hazelcast
Map entry listener to get notified when a map entry is added, removed, updated, evicted,...
entry_listener && on_removed(Handler &&h) &&
Set an handler function to be invoked when an entry is removed.
entry_listener && on_map_evicted(Handler &&h) &&
Set an handler function to be invoked when all entries are evicted by imap::evict_all.
entry_listener && on_added(Handler &&h) &&
Set an handler function to be invoked when an entry is added.
entry_listener & on_evicted(Handler &&h) &
Set an handler function to be invoked when an entry is evicted.
entry_listener && on_merged(Handler &&h) &&
Set an handler function to be invoked after a WAN replicated entry is merged.
entry_listener & on_updated(Handler &&h) &
Set an handler function to be invoked when an entry is updated.
entry_listener && on_evicted(Handler &&h) &&
Set an handler function to be invoked when an entry is evicted.
entry_listener && on_map_cleared(Handler &&h) &&
Set an handler function to be invoked when all entries are removed by imap::clear.
entry_listener & on_merged(Handler &&h) &
Set an handler function to be invoked after a WAN replicated entry is merged.
entry_listener && on_expired(Handler &&h) &&
Set an handler function to be invoked when an entry is expired.
entry_listener && on_updated(Handler &&h) &&
Set an handler function to be invoked when an entry is updated.
entry_listener & on_map_cleared(Handler &&h) &
Set an handler function to be invoked when all entries are removed by imap::clear.
entry_listener & on_expired(Handler &&h) &
Set an handler function to be invoked when an entry is expired.
entry_listener & on_map_evicted(Handler &&h) &
Set an handler function to be invoked when all entries are evicted by imap::evict_all.
entry_listener & on_added(Handler &&h) &
Set an handler function to be invoked when an entry is added.
entry_listener & on_removed(Handler &&h) &
Set an handler function to be invoked when an entry is removed.
Map events common contract.
Definition: map_event.h:36