Visual Servoing Platform version 3.6.0
Loading...
Searching...
No Matches
vpJsonParsing.h
1/*
2 * ViSP, open source Visual Servoing Platform software.
3 * Copyright (C) 2005 - 2023 by Inria. All rights reserved.
4 *
5 * This software is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 * See the file LICENSE.txt at the root directory of this source
10 * distribution for additional information about the GNU GPL.
11 *
12 * For using ViSP with software that can not be combined with the GNU
13 * GPL, please contact Inria about acquiring a ViSP Professional
14 * Edition License.
15 *
16 * See https://visp.inria.fr for more information.
17 *
18 * This software was developed at:
19 * Inria Rennes - Bretagne Atlantique
20 * Campus Universitaire de Beaulieu
21 * 35042 Rennes Cedex
22 * France
23 *
24 * If you have questions regarding the use of this file, please contact
25 * Inria at visp@inria.fr
26 *
27 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29 *
30 * Description:
31 * JSON parsing helpers.
32 */
33
34#ifndef _vpJsonParsing_h_
35#define _vpJsonParsing_h_
36
37#include <visp3/core/vpConfig.h>
38
39#ifdef VISP_HAVE_NLOHMANN_JSON
40#include <nlohmann/json.hpp>
41
53template<typename E>
54int flagsFromJSON(const nlohmann::json &j)
55{
56 int flags = 0;
57 if (j.is_array()) {
58 flags = 0;
59 for (const auto &v : j) {
60 E value = v.get<E>(); // If a value is incorrect, this will default to the first value of the enum
61 flags |= value;
62 }
63 }
64 else if (j.is_number_integer()) {
65 flags = j.get<int>();
66 }
67 return flags;
68}
69
78template<typename E>
79nlohmann::json flagsToJSON(const int flags, const std::vector<E> &options)
80{
81 nlohmann::json j = nlohmann::json::array();
82 for (const E option : options) {
83 if (flags & option) {
84 j.push_back(option);
85 }
86 }
87 return j;
88}
89
90template<typename T>
91bool convertFromTypeAndBuildFrom(const nlohmann::json &, T &)
92{
93 return false;
94}
95
96template<typename T, typename O, typename... Os>
97bool convertFromTypeAndBuildFrom(const nlohmann::json &j, T &t)
98{
99 if (j["type"] == O::jsonTypeName) {
100 O other = j;
101 t.buildFrom(other);
102 return true;
103 }
104 else {
105 return convertFromTypeAndBuildFrom<T, Os...>(j, t);
106 }
107}
108
109#endif
110#endif