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& operator=(const FromKVStoreVisitor&) = delete;
49 void visit(const std::string& name, T& value)
51 getInternal(key(mKeyPrefix, name), value);
55 std::shared_ptr<KVStore> mStorePtr;
56 std::string mKeyPrefix;
57 KVStore::Transaction mTransaction;
59 FromKVStoreVisitor(const FromKVStoreVisitor& visitor, const std::string& prefix)
60 : mStorePtr(visitor.mStorePtr),
62 mTransaction(visitor.mTransaction)
66 template<typename T, typename std::enable_if<!isVisitable<T>::value, int>::type = 0>
67 void getInternal(const std::string& name, T& value)
69 value = mStorePtr->get<T>(name);
72 template<typename T, typename std::enable_if<isVisitable<T>::value, int>::type = 0>
73 void getInternal(const std::string& name, T& value)
75 FromKVStoreVisitor visitor(*this, name);
76 value.accept(visitor);
79 template<typename T, typename std::enable_if<isVisitable<T>::value, int>::type = 0>
80 void getInternal(const std::string& name, std::vector<T>& values)
84 size_t vectorSize = mStorePtr->get<size_t>(name);
85 if (vectorSize == 0) {
89 values.resize(vectorSize);
90 for (size_t i = 0; i < vectorSize; ++i) {
91 const std::string k = key(name, std::to_string(i));
92 getInternal(k, values[i]);
99 #endif // CONFIG_FROM_KVSTORE_VISITOR_HPP