Rename internal macros; Move TomlTable to its own file
This commit is contained in:
parent
1346b33c74
commit
3fa87439d5
55
include/TomlTable.hpp
Normal file
55
include/TomlTable.hpp
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright © 2024 Saul D. Beniquez
|
||||
* License: Mozilla Public License v2.0 (MPL2)
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||
* v.2.0. If a copy of the MPL was not distributed with this file, You can
|
||||
* obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "util/toml.hpp"
|
||||
|
||||
#include <toml++/toml.hpp>
|
||||
|
||||
namespace IOCore {
|
||||
|
||||
struct TomlTable : public toml::table {
|
||||
TomlTable() = default;
|
||||
TomlTable(const toml::table& tbl) : toml::table(tbl) {}
|
||||
TomlTable(const TomlTable& tbl) : toml::table(tbl) {}
|
||||
TomlTable(TomlTable&& tbl) noexcept : toml::table(std::move(tbl)) {}
|
||||
|
||||
template<typename T>
|
||||
TomlTable(const T& obj)
|
||||
{
|
||||
to_toml_table(*this, obj);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
auto operator=(const T& obj) -> TomlTable&
|
||||
{
|
||||
to_toml_table(*this, obj);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
auto operator=(T&& obj) -> TomlTable&
|
||||
{
|
||||
to_toml_table(*this, obj);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
auto as() -> T
|
||||
{
|
||||
T retval;
|
||||
from_toml_table(*this, retval);
|
||||
return retval;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
// clang-format off
|
||||
// vim: set foldmethod=syntax foldminlines=10 textwidth=80 ts=8 sts=0 sw=8 noexpandtab ft=cpp.doxygen :
|
@ -10,60 +10,58 @@
|
||||
//
|
||||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
#define TOML_EXPAND(x) x
|
||||
#define TOML_ENUM_FIELD(field) { field, #field }
|
||||
|
||||
#define IOCORE_EXPAND(x) x
|
||||
#define IOCORE_ENUM_FIELD(field) { field, #field }
|
||||
|
||||
#define IOCORE_FOREACH_PARAM_1(func, param) func(param)
|
||||
#define IOCORE_FOREACH_PARAM_2(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_1(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_3(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_2(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_4(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_3(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_5(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_4(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_6(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_5(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_7(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_6(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_8(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_7(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_9(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_8(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_10(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_9(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_11(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_10(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_12(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_11(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_13(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_12(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_14(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_13(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_15(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_14(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_16(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_15(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_17(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_16(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_18(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_17(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_19(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_18(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_20(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_19(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_PARAM_21(func, param, ...) func(param); IOCORE_EXPAND(IOCORE_FOREACH_PARAM_20(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_1(func, param) func(param)
|
||||
#define FOREACH_PARAM_2(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_1(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_3(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_2(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_4(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_3(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_5(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_4(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_6(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_5(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_7(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_6(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_8(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_7(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_9(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_8(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_10(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_9(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_11(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_10(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_12(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_11(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_13(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_12(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_14(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_13(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_15(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_14(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_16(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_15(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_17(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_16(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_18(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_17(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_19(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_18(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_20(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_19(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM_21(func, param, ...) func(param); TOML_EXPAND(FOREACH_PARAM_20(func, __VA_ARGS__))
|
||||
|
||||
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_1(func, param) func(param)
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_2(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_1(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_3(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_2(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_4(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_3(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_5(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_4(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_6(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_5(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_7(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_6(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_8(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_7(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_9(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_8(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_10(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_9(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_11(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_10(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_12(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_11(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_13(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_12(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_14(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_13(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_15(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_14(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_16(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_15(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_17(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_16(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_18(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_17(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_19(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_18(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_20(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_19(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM_21(func, param, ...) func(param), IOCORE_EXPAND(IOCORE_FOREACH_ENUM_PARAM_20(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_1(func, param) func(param)
|
||||
#define FOREACH_ENUM_PARAM_2(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_1(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_3(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_2(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_4(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_3(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_5(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_4(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_6(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_5(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_7(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_6(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_8(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_7(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_9(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_8(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_10(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_9(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_11(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_10(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_12(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_11(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_13(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_12(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_14(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_13(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_15(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_14(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_16(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_15(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_17(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_16(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_18(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_17(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_19(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_18(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_20(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_19(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM_21(func, param, ...) func(param), TOML_EXPAND(FOREACH_ENUM_PARAM_20(func, __VA_ARGS__))
|
||||
|
||||
|
||||
#define GET_FOREACH_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,NAME,...) NAME
|
||||
#define IOCORE_FOREACH_PARAM(func, ...) IOCORE_EXPAND(GET_FOREACH_MACRO(__VA_ARGS__, IOCORE_FOREACH_PARAM_21, IOCORE_FOREACH_PARAM_20, IOCORE_FOREACH_PARAM_19, IOCORE_FOREACH_PARAM_18, IOCORE_FOREACH_PARAM_17, IOCORE_FOREACH_PARAM_16, IOCORE_FOREACH_PARAM_15, IOCORE_FOREACH_PARAM_14, IOCORE_FOREACH_PARAM_13, IOCORE_FOREACH_PARAM_12, IOCORE_FOREACH_PARAM_11, IOCORE_FOREACH_PARAM_10, IOCORE_FOREACH_PARAM_9, IOCORE_FOREACH_PARAM_8, IOCORE_FOREACH_PARAM_7, IOCORE_FOREACH_PARAM_6, IOCORE_FOREACH_PARAM_5, IOCORE_FOREACH_PARAM_4, IOCORE_FOREACH_PARAM_3, IOCORE_FOREACH_PARAM_2, IOCORE_FOREACH_PARAM_1)(func, __VA_ARGS__))
|
||||
#define IOCORE_FOREACH_ENUM_PARAM(func, ...) IOCORE_EXPAND(GET_FOREACH_MACRO(__VA_ARGS__, IOCORE_FOREACH_ENUM_PARAM_21, IOCORE_FOREACH_ENUM_PARAM_20, IOCORE_FOREACH_ENUM_PARAM_19, IOCORE_FOREACH_ENUM_PARAM_18, IOCORE_FOREACH_ENUM_PARAM_17, IOCORE_FOREACH_ENUM_PARAM_16, IOCORE_FOREACH_ENUM_PARAM_15, IOCORE_FOREACH_ENUM_PARAM_14, IOCORE_FOREACH_ENUM_PARAM_13, IOCORE_FOREACH_ENUM_PARAM_12, IOCORE_FOREACH_ENUM_PARAM_11, IOCORE_FOREACH_ENUM_PARAM_10, IOCORE_FOREACH_ENUM_PARAM_9, IOCORE_FOREACH_ENUM_PARAM_8, IOCORE_FOREACH_ENUM_PARAM_7, IOCORE_FOREACH_ENUM_PARAM_6, IOCORE_FOREACH_ENUM_PARAM_5, IOCORE_FOREACH_ENUM_PARAM_4, IOCORE_FOREACH_ENUM_PARAM_3, IOCORE_FOREACH_ENUM_PARAM_2, IOCORE_FOREACH_ENUM_PARAM_1)(func, __VA_ARGS__))
|
||||
#define FOREACH_PARAM(func, ...) TOML_EXPAND(GET_FOREACH_MACRO(__VA_ARGS__, FOREACH_PARAM_21, FOREACH_PARAM_20, FOREACH_PARAM_19, FOREACH_PARAM_18, FOREACH_PARAM_17, FOREACH_PARAM_16, FOREACH_PARAM_15, FOREACH_PARAM_14, FOREACH_PARAM_13, FOREACH_PARAM_12, FOREACH_PARAM_11, FOREACH_PARAM_10, FOREACH_PARAM_9, FOREACH_PARAM_8, FOREACH_PARAM_7, FOREACH_PARAM_6, FOREACH_PARAM_5, FOREACH_PARAM_4, FOREACH_PARAM_3, FOREACH_PARAM_2, FOREACH_PARAM_1)(func, __VA_ARGS__))
|
||||
#define FOREACH_ENUM_PARAM(func, ...) TOML_EXPAND(GET_FOREACH_MACRO(__VA_ARGS__, FOREACH_ENUM_PARAM_21, FOREACH_ENUM_PARAM_20, FOREACH_ENUM_PARAM_19, FOREACH_ENUM_PARAM_18, FOREACH_ENUM_PARAM_17, FOREACH_ENUM_PARAM_16, FOREACH_ENUM_PARAM_15, FOREACH_ENUM_PARAM_14, FOREACH_ENUM_PARAM_13, FOREACH_ENUM_PARAM_12, FOREACH_ENUM_PARAM_11, FOREACH_ENUM_PARAM_10, FOREACH_ENUM_PARAM_9, FOREACH_ENUM_PARAM_8, FOREACH_ENUM_PARAM_7, FOREACH_ENUM_PARAM_6, FOREACH_ENUM_PARAM_5, FOREACH_ENUM_PARAM_4, FOREACH_ENUM_PARAM_3, FOREACH_ENUM_PARAM_2, FOREACH_ENUM_PARAM_1)(func, __VA_ARGS__))
|
||||
|
||||
// clang-format off
|
||||
// vim: set foldmethod=syntax foldminlines=10 textwidth=80 ts=8 sts=0 sw=8 noexpandtab ft=cpp.doxygen :
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <initializer_list>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include <toml++/toml.hpp>
|
||||
@ -18,9 +19,18 @@
|
||||
#include "../Exception.hpp"
|
||||
#include "./macros.hpp"
|
||||
|
||||
namespace IOCore::Toml {
|
||||
struct TomlException;
|
||||
struct Table;
|
||||
namespace IOCore {
|
||||
struct TomlException : public Exception {
|
||||
|
||||
TomlException()
|
||||
: Exception("TOML Serialization/Deseralization Exception")
|
||||
{
|
||||
}
|
||||
explicit TomlException(const std::string& message) : Exception(message)
|
||||
{
|
||||
}
|
||||
~TomlException() override = default;
|
||||
};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
@ -33,7 +43,7 @@ void extract_from_toml_table(
|
||||
#define IOCORE_TOML_TO(field) add_to_toml_table(tbl, #field, obj.field);
|
||||
#define IOCORE_TOML_FROM(field) extract_from_toml_table(tbl, #field, obj.field);
|
||||
|
||||
#define IOCORE_INIT_METADATA(T) \
|
||||
#define TOML_INIT_METADATA(T) \
|
||||
auto metadata = toml::table(); \
|
||||
metadata.insert_or_assign("type", #T); \
|
||||
tbl.insert_or_assign("General", metadata);
|
||||
@ -42,12 +52,12 @@ void extract_from_toml_table(
|
||||
const char* _class_name = #T; \
|
||||
friend void to_toml_table(toml::table& tbl, const T& obj) \
|
||||
{ \
|
||||
IOCORE_FOREACH_PARAM(IOCORE_TOML_TO, __VA_ARGS__) \
|
||||
FOREACH_PARAM(IOCORE_TOML_TO, __VA_ARGS__) \
|
||||
} \
|
||||
\
|
||||
friend void from_toml_table(const toml::table& tbl, T& obj) \
|
||||
{ \
|
||||
IOCORE_FOREACH_PARAM(IOCORE_TOML_FROM, __VA_ARGS__) \
|
||||
FOREACH_PARAM(IOCORE_TOML_FROM, __VA_ARGS__) \
|
||||
}
|
||||
|
||||
#define IOCORE_TOML_ENUM(ENUM_TYPE, ...) \
|
||||
@ -62,9 +72,7 @@ void extract_from_toml_table(
|
||||
); \
|
||||
using pair_t = std::pair<ENUM_TYPE, const char*>; \
|
||||
static const pair_t _enum_to_string[] = { \
|
||||
IOCORE_FOREACH_ENUM_PARAM( \
|
||||
IOCORE_ENUM_FIELD, __VA_ARGS__ \
|
||||
) \
|
||||
FOREACH_ENUM_PARAM(TOML_ENUM_FIELD, __VA_ARGS__) \
|
||||
}; \
|
||||
auto it = std::find_if( \
|
||||
std::begin(_enum_to_string), \
|
||||
@ -87,9 +95,7 @@ void extract_from_toml_table(
|
||||
); \
|
||||
using pair_t = std::pair<ENUM_TYPE, const char*>; \
|
||||
static const pair_t _enum_to_string[] = { \
|
||||
IOCORE_FOREACH_ENUM_PARAM( \
|
||||
IOCORE_ENUM_FIELD, __VA_ARGS__ \
|
||||
) \
|
||||
FOREACH_ENUM_PARAM(TOML_ENUM_FIELD, __VA_ARGS__) \
|
||||
}; \
|
||||
auto val = tbl[fieldName].value<std::string>().value(); \
|
||||
for (const auto& [enum_val, str] : _enum_to_string) { \
|
||||
@ -100,68 +106,18 @@ void extract_from_toml_table(
|
||||
} \
|
||||
}
|
||||
|
||||
namespace IOCore::Toml {
|
||||
|
||||
struct TomlException : public Exception {
|
||||
|
||||
TomlException()
|
||||
: Exception("TOML Serialization/Deseralization Exception")
|
||||
{
|
||||
}
|
||||
explicit TomlException(const std::string& message) : Exception(message)
|
||||
{
|
||||
}
|
||||
~TomlException() override = default;
|
||||
};
|
||||
|
||||
struct Table : public toml::table {
|
||||
Table() = default;
|
||||
Table(const toml::table& tbl) : toml::table(tbl) {}
|
||||
Table(const Table& tbl) : toml::table(tbl) {}
|
||||
Table(Table&& tbl) noexcept : toml::table(std::move(tbl)) {}
|
||||
|
||||
template<typename T>
|
||||
Table(const T& obj)
|
||||
{
|
||||
to_toml_table(*this, obj);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
auto operator=(const T& obj) -> Table&
|
||||
{
|
||||
to_toml_table(*this, obj);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
auto operator=(T&& obj) -> Table&
|
||||
{
|
||||
to_toml_table(*this, obj);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
auto as() -> T
|
||||
{
|
||||
T retval;
|
||||
from_toml_table(*this, retval);
|
||||
return retval;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void add_to_toml_table(toml::table& tbl, const char* fieldName, const T& obj)
|
||||
inline void
|
||||
add_to_toml_table(toml::table& tbl, const char* fieldName, const T& obj)
|
||||
{
|
||||
tbl.insert_or_assign(fieldName, obj);
|
||||
}
|
||||
template<typename T>
|
||||
void extract_from_toml_table(
|
||||
const toml::table& tbl, const char* fieldName, T& output
|
||||
)
|
||||
inline void
|
||||
extract_from_toml_table(const toml::table& tbl, const char* fieldName, T& output)
|
||||
{
|
||||
if (!tbl.contains(fieldName)) {
|
||||
throw IOCore::Toml::TomlException(
|
||||
throw IOCore::TomlException(
|
||||
"Missing field " + std::string(fieldName)
|
||||
);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ add_executable(test-runner
|
||||
Exception.test.cpp
|
||||
Util.macros.test.cpp
|
||||
Util.toml.test.cpp
|
||||
TomlTable.test.cpp
|
||||
)
|
||||
|
||||
target_include_directories(test-runner PRIVATE
|
||||
|
63
tests/TomlTable.test.cpp
Normal file
63
tests/TomlTable.test.cpp
Normal file
@ -0,0 +1,63 @@
|
||||
/* Util.toml.test.cpp
|
||||
* Copyright © 2024 Saul D. Beniquez
|
||||
* License: Mozilla Public License v. 2.0
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||
* v.2.0. If a copy of the MPL was not distributed with this file, You can
|
||||
* obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
#include "test-utils/common.hpp"
|
||||
|
||||
#include "../include/TomlTable.hpp"
|
||||
#include "../include/util/toml.hpp"
|
||||
|
||||
enum Colors { Red, Green, Blue };
|
||||
|
||||
IOCORE_TOML_ENUM(Colors, Red, Green, Blue);
|
||||
// IOCORE_TOML_ENUM(Colors, { Red, "Red" }, { Green, "Green" }, { Blue, "Blue"
|
||||
// });
|
||||
|
||||
using IOCore::TomlTable;
|
||||
|
||||
BEGIN_TEST_SUITE("IOCore.TomlTable")
|
||||
{
|
||||
struct SimpleStruct {
|
||||
int field1;
|
||||
int field2;
|
||||
|
||||
IOCORE_TOML_SERIALIZABLE(SimpleStruct, field1, field2);
|
||||
};
|
||||
|
||||
struct ComplexStruct {
|
||||
int field1;
|
||||
int field2;
|
||||
Colors foreground;
|
||||
|
||||
IOCORE_TOML_SERIALIZABLE(
|
||||
ComplexStruct, field1, field2, foreground
|
||||
);
|
||||
};
|
||||
|
||||
TEST_CASE("Toml::Table class construction and basic operators")
|
||||
{
|
||||
auto data = ComplexStruct{ 11, 22, Blue };
|
||||
TomlTable table = data;
|
||||
auto newdest = table.as<ComplexStruct>();
|
||||
|
||||
CHECK(table.size() == 3);
|
||||
|
||||
CHECK(table["field1"].value<int>() == 11);
|
||||
CHECK(table["field2"].value<int>() == 22);
|
||||
CHECK(table["foreground"].value<std::string>() == "Blue");
|
||||
|
||||
CHECK(newdest.field1 == data.field1);
|
||||
CHECK(newdest.field2 == data.field2);
|
||||
CHECK(newdest.foreground == data.foreground);
|
||||
}
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
// vim: set foldmethod=syntax foldminlines=10 textwidth=80 ts=8 sts=0 sw=8 noexpandtab ft=cpp.doxygen :
|
@ -22,22 +22,20 @@ enum Colors { Red, Green, Blue };
|
||||
|
||||
BEGIN_TEST_SUITE("Util.Macros")
|
||||
{
|
||||
TEST_CASE("IOCORE_FOREACH_PARAM Macro works")
|
||||
TEST_CASE("FOREACH_PARAM Macro works")
|
||||
{
|
||||
std::stringstream buffer;
|
||||
int field1 = 10;
|
||||
int field2 = 20;
|
||||
|
||||
IOCORE_FOREACH_PARAM(PRINT_MACRO, field1, field2);
|
||||
FOREACH_PARAM(PRINT_MACRO, field1, field2);
|
||||
REQUIRE(buffer.str() == "field1: 10, field2: 20, ");
|
||||
}
|
||||
|
||||
TEST_CASE("IOCORE_FOREACH_ENUM_PARAM Macro works")
|
||||
TEST_CASE("FOREACH_ENUM_PARAM Macro works")
|
||||
{
|
||||
std::pair<Colors, const std::string> color_pairs[] = {
|
||||
IOCORE_FOREACH_ENUM_PARAM(
|
||||
IOCORE_ENUM_FIELD, Red, Green, Blue
|
||||
)
|
||||
FOREACH_ENUM_PARAM(TOML_ENUM_FIELD, Red, Green, Blue)
|
||||
};
|
||||
|
||||
CHECK(std::size(color_pairs) == 3);
|
||||
|
@ -11,13 +11,11 @@
|
||||
|
||||
#include "test-utils/common.hpp"
|
||||
|
||||
#include "../include/TomlTable.hpp"
|
||||
#include "../include/util/toml.hpp"
|
||||
|
||||
enum Colors { Red, Green, Blue };
|
||||
|
||||
IOCORE_TOML_ENUM(Colors, Red, Green, Blue);
|
||||
// IOCORE_TOML_ENUM(Colors, { Red, "Red" }, { Green, "Green" }, { Blue, "Blue"
|
||||
// });
|
||||
|
||||
BEGIN_TEST_SUITE("Util.Toml")
|
||||
{
|
||||
@ -25,13 +23,6 @@ BEGIN_TEST_SUITE("Util.Toml")
|
||||
int field1;
|
||||
int field2;
|
||||
|
||||
// friend void
|
||||
// to_toml_table(toml::table& tbl, const SimpleStruct& obj)
|
||||
//{
|
||||
// IOCORE_TOML_TO(field1);
|
||||
// IOCORE_TOML_TO(field2);
|
||||
// }
|
||||
|
||||
IOCORE_TOML_SERIALIZABLE(SimpleStruct, field1, field2);
|
||||
};
|
||||
|
||||
@ -39,6 +30,7 @@ BEGIN_TEST_SUITE("Util.Toml")
|
||||
int field1;
|
||||
int field2;
|
||||
Colors foreground;
|
||||
|
||||
IOCORE_TOML_SERIALIZABLE(
|
||||
ComplexStruct, field1, field2, foreground
|
||||
);
|
||||
@ -46,7 +38,6 @@ BEGIN_TEST_SUITE("Util.Toml")
|
||||
|
||||
TEST_CASE("IOCORE_TOML_TO Macro works")
|
||||
{
|
||||
|
||||
toml::table table;
|
||||
SimpleStruct data;
|
||||
|
||||
@ -55,7 +46,6 @@ BEGIN_TEST_SUITE("Util.Toml")
|
||||
}
|
||||
TEST_CASE("IOCORE_TOML_SERIALIZABLE Macro works")
|
||||
{
|
||||
|
||||
toml::table table;
|
||||
ComplexStruct data = { 11, 22, Green };
|
||||
ComplexStruct newdest;
|
||||
@ -69,22 +59,6 @@ BEGIN_TEST_SUITE("Util.Toml")
|
||||
CHECK(table["field2"].value<int>() == 22);
|
||||
CHECK(table["foreground"].value<std::string>() == "Green");
|
||||
|
||||
CHECK(newdest.field1 == data.field1);
|
||||
CHECK(newdest.field2 == data.field2);
|
||||
CHECK(newdest.foreground == data.foreground);
|
||||
}
|
||||
TEST_CASE("Toml::Table class construction and basic operators")
|
||||
{
|
||||
auto data = ComplexStruct{ 11, 22, Blue };
|
||||
IOCore::Toml::Table table = data;
|
||||
auto newdest = table.as<ComplexStruct>();
|
||||
|
||||
CHECK(table.size() == 3);
|
||||
|
||||
CHECK(table["field1"].value<int>() == 11);
|
||||
CHECK(table["field2"].value<int>() == 22);
|
||||
CHECK(table["foreground"].value<std::string>() == "Blue");
|
||||
|
||||
CHECK(newdest.field1 == data.field1);
|
||||
CHECK(newdest.field2 == data.field2);
|
||||
CHECK(newdest.foreground == data.foreground);
|
||||
|
Loading…
Reference in New Issue
Block a user