Hazelcast C++ Client
Hazelcast C++ Client Library
entry_listener.h
1 /*
2  * Copyright (c) 2008-2021, 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> class EntryEventHandler;
33  }
34 
49  class entry_listener final {
50  public:
56  template<typename Handler,
57  typename = util::enable_if_rvalue_ref_t<Handler &&>>
58  entry_listener &on_added(Handler &&h) & {
59  added_ = std::forward<Handler>(h);
60  add_flag(entry_event::type::ADDED);
61  return *this;
62  }
63 
67  template<typename Handler,
68  typename = util::enable_if_rvalue_ref_t<Handler &&>>
69  entry_listener &&on_added(Handler &&h) && {
70  on_added(std::forward<Handler>(h));
71  return std::move(*this);
72  }
73 
79  template<typename Handler,
80  typename = util::enable_if_rvalue_ref_t<Handler &&>>
81  entry_listener &on_removed(Handler &&h) & {
82  removed_ = std::forward<Handler>(h);
83  add_flag(entry_event::type::REMOVED);
84  return *this;
85  }
86 
90  template<typename Handler,
91  typename = util::enable_if_rvalue_ref_t<Handler &&>>
92  entry_listener &&on_removed(Handler &&h) && {
93  on_removed(std::forward<Handler>(h));
94  return std::move(*this);
95  }
96 
102  template<typename Handler,
103  typename = util::enable_if_rvalue_ref_t<Handler &&>>
104  entry_listener &on_updated(Handler &&h) & {
105  updated_ = std::forward<Handler>(h);
106  add_flag(entry_event::type::UPDATED);
107  return *this;
108  }
109 
113  template<typename Handler,
114  typename = util::enable_if_rvalue_ref_t<Handler &&>>
115  entry_listener &&on_updated(Handler &&h) && {
116  on_updated(std::forward<Handler>(h));
117  return std::move(*this);
118  }
119 
125  template<typename Handler,
126  typename = util::enable_if_rvalue_ref_t<Handler &&>>
127  entry_listener &on_evicted(Handler &&h) & {
128  evicted_ = std::forward<Handler>(h);
129  add_flag(entry_event::type::EVICTED);
130  return *this;
131  }
132 
136  template<typename Handler,
137  typename = util::enable_if_rvalue_ref_t<Handler &&>>
138  entry_listener &&on_evicted(Handler &&h) && {
139  on_evicted(std::forward<Handler>(h));
140  return std::move(*this);
141  }
142 
148  template<typename Handler,
149  typename = util::enable_if_rvalue_ref_t<Handler &&>>
150  entry_listener &on_expired(Handler &&h) & {
151  expired_ = std::forward<Handler>(h);
152  add_flag(entry_event::type::EXPIRED);
153  return *this;
154  }
155 
159  template<typename Handler,
160  typename = util::enable_if_rvalue_ref_t<Handler &&>>
161  entry_listener &&on_expired(Handler &&h) && {
162  on_expired(std::forward<Handler>(h));
163  return std::move(*this);
164  }
165 
171  template<typename Handler,
172  typename = util::enable_if_rvalue_ref_t<Handler &&>>
173  entry_listener &on_merged(Handler &&h) & {
174  merged_ = std::forward<Handler>(h);
175  add_flag(entry_event::type::MERGED);
176  return *this;
177  }
178 
182  template<typename Handler,
183  typename = util::enable_if_rvalue_ref_t<Handler &&>>
184  entry_listener &&on_merged(Handler &&h) && {
185  on_merged(std::forward<Handler>(h));
186  return std::move(*this);
187  }
188 
194  template<typename Handler,
195  typename = util::enable_if_rvalue_ref_t<Handler &&>>
196  entry_listener &on_map_evicted(Handler &&h) & {
197  map_evicted_ = std::forward<Handler>(h);
198  add_flag(entry_event::type::EVICT_ALL);
199  return *this;
200  }
201 
205  template<typename Handler,
206  typename = util::enable_if_rvalue_ref_t<Handler &&>>
207  entry_listener &&on_map_evicted(Handler &&h) && {
208  on_map_evicted(std::forward<Handler>(h));
209  return std::move(*this);
210  }
211 
217  template<typename Handler,
218  typename = util::enable_if_rvalue_ref_t<Handler &&>>
219  entry_listener &on_map_cleared(Handler &&h) & {
220  map_cleared_ = std::forward<Handler>(h);
221  add_flag(entry_event::type::CLEAR_ALL);
222  return *this;
223  }
224 
228  template<typename Handler,
229  typename = util::enable_if_rvalue_ref_t<Handler &&>>
230  entry_listener &&on_map_cleared(Handler &&h) && {
231  on_map_cleared(std::forward<Handler>(h));
232  return std::move(*this);
233  }
234 
235  private:
236  using EntryHandlerType = std::function<void(entry_event &&)>;
237  EntryHandlerType added_ = util::noop<entry_event &&>,
238  removed_ = util::noop<entry_event &&>,
239  updated_ = util::noop<entry_event &&>,
240  evicted_ = util::noop<entry_event &&>,
241  expired_ = util::noop<entry_event &&>,
242  merged_ = util::noop<entry_event &&>;
243 
244  using MapHandlerType = std::function<void(map_event &&)>;
245  MapHandlerType map_evicted_ = util::noop<map_event &&>,
246  map_cleared_ = util::noop<map_event &&>;
247 
248  int32_t flags_ = 0;
249 
250  void add_flag(entry_event::type t) {
251  flags_ |= static_cast<int32_t>(t);
252  }
253 
254  template<typename>
255  friend class impl::EntryEventHandler;
256  friend class replicated_map;
257  friend class imap;
258  };
259  }
260 }
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:37