2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Piotr Bartosiewicz (p.bartosiewi@partner.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 Piotr Bartosiewicz (p.bartosiewi@partner.samsung.com)
25 #ifndef CONFIG_TO_JSON_VISITOR_HPP
26 #define CONFIG_TO_JSON_VISITOR_HPP
28 #include "config/is-visitable.hpp"
30 #include <json/json.h>
40 : mObject(json_object_new_object())
44 ToJsonVisitor(const ToJsonVisitor& visitor)
45 : mObject(json_object_get(visitor.mObject))
51 json_object_put(mObject);
54 std::string toString() const
56 return json_object_to_json_string(mObject);
60 void visit(const std::string& name, const T& value)
62 json_object_object_add(mObject, name.c_str(), toJsonObject(value));
67 ToJsonVisitor& operator=(const ToJsonVisitor&) = delete;
71 json_object* ret = mObject;
76 static json_object* toJsonObject(int value)
78 return json_object_new_int(value);
81 static json_object* toJsonObject(std::int64_t value)
83 return json_object_new_int64(value);
86 static json_object* toJsonObject(bool value)
88 return json_object_new_boolean(value);
91 static json_object* toJsonObject(double value)
93 return json_object_new_double(value);
96 static json_object* toJsonObject(const std::string& value)
98 return json_object_new_string(value.c_str());
102 static json_object* toJsonObject(const std::vector<T>& value)
104 json_object* array = json_object_new_array();
105 for (const T& v : value) {
106 json_object_array_add(array, toJsonObject(v));
111 template<class T, class = typename std::enable_if<isVisitable<T>::value>::type>
112 static json_object* toJsonObject(const T& value)
114 ToJsonVisitor visitor;
115 value.accept(visitor);
116 return visitor.detach();
120 } // namespace config
122 #endif // CONFIG_TO_JSON_VISITOR_HPP