25 #ifndef CARGO_SQLITE_FROM_KVSTORE_VISITOR_BASE_HPP
26 #define CARGO_SQLITE_FROM_KVSTORE_VISITOR_BASE_HPP
50 template<
typename RecursiveVisitor>
56 void visit(
const std::string& name, T& value)
78 const std::string& prefix)
85 template<typename T, typename std::enable_if<isStreamableIn<T>::value,
int>::type = 0>
91 template<typename T, typename std::enable_if<isVisitable<T>::value,
int>::type = 0>
94 RecursiveVisitor visitor(*
this, name);
95 value.accept(visitor);
99 typename std::enable_if<std::is_enum<T>::value,
int>::type = 0>
102 auto rawValue =
static_cast<typename std::underlying_type<T>::type
>(value);
103 static_cast<RecursiveVisitor*
>(
this)->
visitImpl(name, rawValue);
104 value =
static_cast<T
>(rawValue);
110 size_t storedSize = 0;
113 if (storedSize == 0) {
117 values.resize(storedSize);
118 for (
size_t i = 0; i < storedSize; ++i) {
119 const std::string k =
key(name, std::to_string(i));
123 static_cast<RecursiveVisitor*
>(
this)->
visitImpl(k, values[i]);
127 template<
typename T,
size_t N>
128 void getInternal(
const std::string& name, std::array<T, N>& values)
130 size_t storedSize = 0;
133 if (storedSize != values.size()) {
137 for (
size_t i = 0; i < storedSize; ++i) {
138 const std::string k =
key(name, std::to_string(i));
142 static_cast<RecursiveVisitor*
>(
this)->
visitImpl(k, values[i]);
147 void getInternal(
const std::string& name, std::map<std::string, V>& values)
149 size_t storedSize = 0;
152 for (
size_t i = 0; i < storedSize; ++i) {
153 std::string mapKey, k =
key(name, i);
157 static_cast<RecursiveVisitor*
>(
this)->
visitImpl(k, mapKey);
158 static_cast<RecursiveVisitor*
>(
this)->
visitImpl(k +
".val", values[mapKey]);
162 template<typename T, typename std::enable_if<isLikeTuple<T>::value,
int>::type = 0>
165 size_t storedSize = 0;
168 if (storedSize != std::tuple_size<T>::value) {
172 RecursiveVisitor recursiveVisitor(*
this, name);
173 GetTupleVisitor visitor(recursiveVisitor);
186 if (!
mVisitor.mStore.prefixExists(k)) {
202 #endif // CARGO_SQLITE_FROM_KVSTORE_VISITOR_BASE_HPP
bool prefixExists(const std::string &key)
Definition: kvstore.cpp:259
Internal configuration helper.
void getInternal(const std::string &name, std::map< std::string, V > &values)
Definition: from-kvstore-visitor-base.hpp:147
Declaration of a class for key-value storage in a sqlite3 database.
Definition: kvstore.hpp:43
size_t idx
Definition: from-kvstore-visitor-base.hpp:196
Definition: from-kvstore-visitor-base.hpp:177
Helper function for iterating tuples, pairs and arrays.
Invalid integral type integrity error.
Definition: exception.hpp:51
FromKVStoreVisitorBase(const FromKVStoreVisitorBase &visitor, const std::string &prefix)
Definition: from-kvstore-visitor-base.hpp:77
std::string mKeyPrefix
Definition: from-kvstore-visitor-base.hpp:63
RecursiveVisitor & mVisitor
Definition: from-kvstore-visitor-base.hpp:195
Internal configuration helper.
void visit(T &value)
Definition: from-kvstore-visitor-base.hpp:183
Container size does not match.
Definition: exception.hpp:59
std::string key(const Arg1 &a1, const Args &...args)
Concatenates all parameters into one std::string.
Definition: kvstore-visitor-utils.hpp:60
void getInternal(const std::string &name, std::array< T, N > &values)
Definition: from-kvstore-visitor-base.hpp:128
void getInternal(const std::string &name, std::vector< T > &values)
Definition: from-kvstore-visitor-base.hpp:108
void getInternal(const std::string &name, T &value)
Definition: from-kvstore-visitor-base.hpp:86
void visit(const std::string &name, T &value)
Definition: from-kvstore-visitor-base.hpp:56
FromKVStoreVisitorBase & operator=(const FromKVStoreVisitorBase &)=delete
void getInternal(const std::string &name, T &values)
Definition: from-kvstore-visitor-base.hpp:163
KVStore & mStore
Definition: from-kvstore-visitor-base.hpp:62
KVStore visitors utilities.
std::string get(const std::string &key)
Gets the value corresponding to the key.
Definition: kvstore.cpp:168
Base class for KVStore visitors.
Definition: from-kvstore-visitor-base.hpp:51
Check whether type is accepted by streaming operators.
void visitImpl(const std::string &name, T &value)
Definition: from-kvstore-visitor-base.hpp:66
GetTupleVisitor(RecursiveVisitor &visitor)
Definition: from-kvstore-visitor-base.hpp:180
void visitFields(T &t, F f, A...args)
Definition: visit-fields.hpp:58
FromKVStoreVisitorBase(KVStore &store, const std::string &prefix)
Definition: from-kvstore-visitor-base.hpp:71