FDStore class for binary serialization
[archive/platform/core/system/libConfig.git] / src / config / from-fdstore-visitor.hpp
1 /*
2  *  Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *  Contact: Jan Olszak (j.olszak@samsung.com)
5  *
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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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
17  */
18
19 /**
20  * @file
21  * @author  Jan Olszak (j.olszak@samsung.com)
22  * @brief   Visitor for loading from FDStore
23  */
24
25 #ifndef CONFIG_FROM_FDSTORE_VISITOR_HPP
26 #define CONFIG_FROM_FDSTORE_VISITOR_HPP
27
28 #include "config/is-visitable.hpp"
29 #include "config/fdstore.hpp"
30
31 #include <string>
32
33 namespace config {
34
35 class FromFDStoreVisitor {
36 public:
37     explicit FromFDStoreVisitor(int fd)
38         : mStore(fd)
39     {
40     }
41
42     FromFDStoreVisitor(const FromFDStoreVisitor& visitor) = default;
43
44     FromFDStoreVisitor& operator=(const FromFDStoreVisitor&) = delete;
45
46     template<typename T>
47     void visit(const std::string& name, T& value)
48     {
49         readInternal(value);
50     }
51
52 private:
53     FDStore mStore;
54
55     void readInternal(std::string& value)
56     {
57         size_t size;
58         readInternal(size);
59         value.resize(size);
60         mStore.read(&value.front(), size);
61     }
62
63     template<typename T, typename std::enable_if<std::is_arithmetic<T>::value, int>::type = 0>
64     void readInternal(T& value)
65     {
66         mStore.read(&value, sizeof(T));
67     }
68
69     template<typename T, typename std::enable_if<isVisitable<T>::value, int>::type = 0>
70     void readInternal(T& value)
71     {
72         FromFDStoreVisitor visitor(*this);
73         value.accept(visitor);
74     }
75
76     template<typename T>
77     void readInternal(std::vector<T>& values)
78     {
79         size_t vectorSize;
80         readInternal(vectorSize);
81         values.resize(vectorSize);
82
83         for (T& value : values) {
84             readInternal(value);
85         }
86     }
87 };
88
89 } // namespace config
90
91 #endif // CONFIG_FROM_FDSTORE_VISITOR_HPP