Rename internal macros; Move TomlTable to its own file

This commit is contained in:
S David 2024-07-29 01:20:48 -04:00
parent 1346b33c74
commit 3fa87439d5
7 changed files with 194 additions and 149 deletions

55
include/TomlTable.hpp Normal file
View 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 :

View File

@ -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 :

View File

@ -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)
);
}

View File

@ -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
View 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 :

View File

@ -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);

View File

@ -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);