CCF
Loading...
Searching...
No Matches
map_diff.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
6
7namespace ccf::kv
8{
9 template <typename K, typename V, typename KSerialiser, typename VSerialiser>
10 class MapDiff : public AbstractHandle
11 {
12 protected:
14
15 public:
16 using KeyType = K;
17 using ValueType = V;
18
20 map_diff(std::move(map_diff_))
21 {}
22
23 MapDiff(ccf::kv::untyped::ChangeSet& changes, const std::string& map_name) :
24 map_diff(changes, map_name)
25 {}
26
34 std::optional<std::optional<V>> get(const K& key)
35 {
36 const auto opt_v_rep = map_diff.get(KSerialiser::to_serialised(key));
37
38 if (opt_v_rep.has_value())
39 {
40 if (opt_v_rep.value().has_value())
41 {
42 return VSerialiser::from_serialised(opt_v_rep.value().value());
43 }
44 }
45
46 return std::nullopt;
47 }
48
55 bool has(const K& key)
56 {
57 return map_diff.has(KSerialiser::to_serialised(key));
58 }
59
66 bool is_deleted(const K& key)
67 {
68 return map_diff.is_deleted(KSerialiser::to_serialised(key));
69 }
70
86 template <class F>
87 void foreach(F&& f) // NOLINT(cppcoreguidelines-missing-std-forward)
88 {
89 const auto& g =
90 [&](
92 const std::optional<ccf::kv::serialisers::SerialisedEntry>& v_rep)
93 -> bool {
94 const auto k = KSerialiser::from_serialised(k_rep);
95 if (v_rep.has_value())
96 {
97 const std::optional<V> v =
98 VSerialiser::from_serialised(v_rep.value());
99 return f(k, v);
100 }
101 const std::optional<V> v = std::nullopt;
102 return f(k, v);
103 };
104 map_diff.foreach(g);
105 }
106
114 template <class F>
115 void foreach_key(F&& f) // NOLINT(cppcoreguidelines-missing-std-forward)
116 {
117 auto g = [&](
120 return f(KSerialiser::from_serialised(k_rep));
121 };
122 map_diff.foreach(g);
123 }
124
132 template <class F>
133 void foreach_value(F&& f) // NOLINT(cppcoreguidelines-missing-std-forward)
134 {
135 auto g =
136 [&](
138 const std::optional<ccf::kv::serialisers::SerialisedEntry>& v_rep) {
139 if (v_rep.has_value())
140 {
141 return f(VSerialiser::from_serialised(v_rep));
142 }
143 return f(std::nullopt);
144 };
145 map_diff.foreach(g);
146 }
147
152 size_t size()
153 {
154 return map_diff.size();
155 }
156 };
157}
Definition abstract_handle.h:8
Definition map_diff.h:11
MapDiff(ccf::kv::untyped::ChangeSet &changes, const std::string &map_name)
Definition map_diff.h:23
K KeyType
Definition map_diff.h:16
void foreach_value(F &&f)
Definition map_diff.h:133
void foreach_key(F &&f)
Definition map_diff.h:115
V ValueType
Definition map_diff.h:17
size_t size()
Definition map_diff.h:152
ccf::kv::untyped::MapDiff map_diff
Definition map_diff.h:13
bool has(const K &key)
Definition map_diff.h:55
MapDiff(ccf::kv::untyped::MapDiff map_diff_)
Definition map_diff.h:19
bool is_deleted(const K &key)
Definition map_diff.h:66
std::optional< std::optional< V > > get(const K &key)
Definition map_diff.h:34
Definition untyped_map_diff.h:19
bool has(const KeyType &key)
Definition untyped_map_diff.cpp:44
bool is_deleted(const KeyType &key)
Definition untyped_map_diff.cpp:60
std::optional< std::optional< ValueType > > get(const KeyType &key)
Definition untyped_map_diff.cpp:29
void foreach(const ElementVisitorWithEarlyOut &fn)
Definition untyped_map_diff.cpp:76
size_t size()
Definition untyped_map_diff.cpp:81
ccf::ByteVector SerialisedEntry
Definition serialised_entry.h:8
Definition app_interface.h:19
STL namespace.
Definition untyped_change_set.h:43