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
19 MapDiff(ccf::kv::untyped::MapDiff map_diff_) : map_diff(map_diff_) {}
20
21 MapDiff(ccf::kv::untyped::ChangeSet& changes, const std::string& map_name) :
22 map_diff(changes, map_name)
23 {}
24
32 std::optional<std::optional<V>> get(const K& key)
33 {
34 const auto opt_v_rep = map_diff.get(KSerialiser::to_serialised(key));
35
36 if (opt_v_rep.has_value())
37 {
38 if (opt_v_rep.value().has_value())
39 {
40 return VSerialiser::from_serialised(opt_v_rep.value().value());
41 }
42 }
43
44 return std::nullopt;
45 }
46
53 bool has(const K& key)
54 {
55 return map_diff.has(KSerialiser::to_serialised(key));
56 }
57
64 bool is_deleted(const K& key)
65 {
66 return map_diff.is_deleted(KSerialiser::to_serialised(key));
67 }
68
84 template <class F>
85 void foreach(F&& f)
86 {
87 const auto& g =
88 [&](
90 const std::optional<ccf::kv::serialisers::SerialisedEntry>& v_rep)
91 -> bool {
92 const auto k = KSerialiser::from_serialised(k_rep);
93 if (v_rep.has_value())
94 {
95 const std::optional<V> v =
96 VSerialiser::from_serialised(v_rep.value());
97 return f(k, v);
98 }
99 else
100 {
101 const std::optional<V> v = std::nullopt;
102 return f(k, v);
103 }
104 };
105 map_diff.foreach(g);
106 }
107
115 template <class F>
116 void foreach_key(F&& f)
117 {
118 auto g = [&](
121 return f(KSerialiser::from_serialised(k_rep));
122 };
123 map_diff.foreach(g);
124 }
125
133 template <class F>
134 void foreach_value(F&& f)
135 {
136 auto g =
137 [&](
139 const std::optional<ccf::kv::serialisers::SerialisedEntry>& v_rep) {
140 if (v_rep.has_value())
141 {
142 return f(VSerialiser::from_serialised(v_rep));
143 }
144 else
145 {
146 return f(std::nullopt);
147 }
148 };
149 map_diff.foreach(g);
150 }
151
156 size_t size()
157 {
158 return map_diff.size();
159 }
160 };
161}
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:21
K KeyType
Definition map_diff.h:16
void foreach_value(F &&f)
Definition map_diff.h:134
void foreach_key(F &&f)
Definition map_diff.h:116
V ValueType
Definition map_diff.h:17
size_t size()
Definition map_diff.h:156
ccf::kv::untyped::MapDiff map_diff
Definition map_diff.h:13
bool has(const K &key)
Definition map_diff.h:53
MapDiff(ccf::kv::untyped::MapDiff map_diff_)
Definition map_diff.h:19
bool is_deleted(const K &key)
Definition map_diff.h:64
std::optional< std::optional< V > > get(const K &key)
Definition map_diff.h:32
Definition untyped_map_diff.h:19
bool has(const KeyType &key)
Definition untyped_map_diff.cpp:43
bool is_deleted(const KeyType &key)
Definition untyped_map_diff.cpp:59
std::optional< std::optional< ValueType > > get(const KeyType &key)
Definition untyped_map_diff.cpp:28
void foreach(const ElementVisitorWithEarlyOut &fn)
Definition untyped_map_diff.cpp:75
size_t size()
Definition untyped_map_diff.cpp:80
ccf::ByteVector SerialisedEntry
Definition serialised_entry.h:8
Definition app_interface.h:19
Definition untyped_change_set.h:43