2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Jan Olszak (j.olszak@samsung.com)
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License
21 * @author Jan Olszak (j.olszak@samsung.com)
22 * @brief Visitor for loading from KVStore
25 #ifndef CONFIG_FROM_KVSTORE_VISITOR_HPP
26 #define CONFIG_FROM_KVSTORE_VISITOR_HPP
28 #include "config/is-visitable.hpp"
29 #include "config/exception.hpp"
30 #include "config/kvstore.hpp"
37 class FromKVStoreVisitor {
39 explicit FromKVStoreVisitor(const std::string& filePath, const std::string& prefix)
40 : mStorePtr(new KVStore(filePath)),
42 mTransaction(mStorePtr->getTransaction())
46 FromKVStoreVisitor(const FromKVStoreVisitor& visitor, const std::string& prefix)
47 : mStorePtr(visitor.mStorePtr),
49 mTransaction(visitor.mTransaction)
57 FromKVStoreVisitor& operator=(const FromKVStoreVisitor&) = delete;
60 void visit(const std::string& name, T& value)
62 getInternal(key(mKeyPrefix, name), value);
66 std::shared_ptr<KVStore> mStorePtr;
67 std::string mKeyPrefix;
68 KVStore::Transaction mTransaction;
70 template<typename T, typename std::enable_if<!isVisitable<T>::value, int>::type = 0>
71 void getInternal(const std::string& name, T& value)
73 value = mStorePtr->get<T>(name);
76 template<typename T, typename std::enable_if<isVisitable<T>::value, int>::type = 0>
77 void getInternal(const std::string& name, T& value)
79 FromKVStoreVisitor visitor(*this, name);
80 value.accept(visitor);
83 template<typename T, typename std::enable_if<isVisitable<T>::value, int>::type = 0>
84 void getInternal(const std::string& name, std::vector<T>& values)
88 size_t vectorSize = mStorePtr->get<size_t>(name);
89 if (vectorSize == 0) {
93 values.resize(vectorSize);
94 for (size_t i = 0; i < vectorSize; ++i) {
95 const std::string k = key(name, std::to_string(i));
96 getInternal(k, values[i]);
101 } // namespace config
103 #endif // CONFIG_FROM_KVSTORE_VISITOR_HPP