calibration_tools_v1.0/lidar_driver/include/open3d/io/IJsonConvertibleIO.h
2025-02-20 10:45:17 +08:00

90 lines
4.5 KiB
C++

// ----------------------------------------------------------------------------
// - Open3D: www.open3d.org -
// ----------------------------------------------------------------------------
// Copyright (c) 2018-2023 www.open3d.org
// SPDX-License-Identifier: MIT
// ----------------------------------------------------------------------------
#pragma once
#include <algorithm>
#include <iterator>
#include <string>
#include "open3d/utility/IJsonConvertible.h"
namespace open3d {
namespace io {
/// The general entrance for reading an IJsonConvertible from a file
/// The function calls read functions based on the extension name of filename.
/// \return return true if the read function is successful, false otherwise.
bool ReadIJsonConvertible(const std::string &filename,
utility::IJsonConvertible &object);
/// The general entrance for writing an IJsonConvertible to a file
/// The function calls write functions based on the extension name of filename.
/// \return return true if the write function is successful, false otherwise.
bool WriteIJsonConvertible(const std::string &filename,
const utility::IJsonConvertible &object);
bool ReadIJsonConvertibleFromJSON(const std::string &filename,
utility::IJsonConvertible &object);
bool WriteIJsonConvertibleToJSON(const std::string &filename,
const utility::IJsonConvertible &object);
bool ReadIJsonConvertibleFromJSONString(const std::string &json_string,
utility::IJsonConvertible &object);
bool WriteIJsonConvertibleToJSONString(std::string &json_string,
const utility::IJsonConvertible &object);
/// String to and from enum mapping, based on
/// https://github.com/nlohmann/json/blob/master/include/nlohmann/detail/macro_scope.hpp
/// (MIT license)
/// If you have an enum:
/// enum IMAGE_FORMAT {FORMAT_PNG, FORMAT_JPG};
/// Use as STRINGIFY_ENUM(IMAGE_FORMAT, {
/// {FORMAT_INVALID, nullptr},
/// {FORMAT_PNG, "png"},
/// {FORMAT_JPG, "jpg"}
/// })
/// in the cpp file and
/// DECLARE_STRINGIFY_ENUM(IMAGE_FORMAT)
/// in the header file. This creates the functions
/// - enum_to_string(const ENUM_TYPE &e) -> std::string
/// - enum_from_string(const std::string &str, ENUM_TYPE &e) -> void
/// for conversion between the enum and string. Invalid string values are mapped
/// to the first specified option in the macro.
#define DECLARE_STRINGIFY_ENUM(ENUM_TYPE) \
std::string enum_to_string(ENUM_TYPE e); \
void enum_from_string(const std::string &str, ENUM_TYPE &e); \
inline auto format_as(ENUM_TYPE e) { return enum_to_string(e); }
#define STRINGIFY_ENUM(ENUM_TYPE, ...) \
std::string enum_to_string(ENUM_TYPE e) { \
static_assert(std::is_enum<ENUM_TYPE>::value, \
#ENUM_TYPE " must be an enum!"); \
static const std::pair<ENUM_TYPE, std::string> m[] = __VA_ARGS__; \
auto it = std::find_if( \
std::begin(m), std::end(m), \
[e](const std::pair<ENUM_TYPE, std::string> &es_pair) \
-> bool { return es_pair.first == e; }); \
return ((it != std::end(m)) ? it : std::begin(m))->second; \
} \
void enum_from_string(const std::string &str, ENUM_TYPE &e) { \
static_assert(std::is_enum<ENUM_TYPE>::value, \
#ENUM_TYPE " must be an enum!"); \
static const std::pair<ENUM_TYPE, std::string> m[] = __VA_ARGS__; \
auto it = std::find_if( \
std::begin(m), std::end(m), \
[&str](const std::pair<ENUM_TYPE, std::string> &es_pair) \
-> bool { return es_pair.second == str; }); \
e = ((it != std::end(m)) ? it : std::begin(m))->first; \
utility::LogDebug("{} -> {}", str, e); \
}
} // namespace io
} // namespace open3d