Emily Boudreaux ec13264050 feat(reflect-cpp): Switched from glaze -> reflect cpp
A bug was discovered in glaze which prevented valid toml output. We have
switched to toml++ and reflect-cpp. The interface has remained the same
so this should not break any code
2025-12-06 10:55:46 -05:00
2025-12-05 14:26:22 -05:00

img

libconfig

libconfig is the unified configuration module for SERiF and related projects

This has been broken out of the main serif project to allow for more modularity

Building

In order to build libconstants you need meson>=1.5.0. This can be installed with pip

pip install "meson>=1.5.0"

Then from the root libconstants directory it is as simple as

meson setup build --buildtype=release
meson compile -C build
meson test -C build

this will auto generate a pkg-config file for you so that linking other libraries to libconfig is easy.

Usage

libconfig makes use of glaze to provide compile time reflection and serialization/deserialization of configuration structs. This allows for config options to be defined in code and strongly typed.

#include "fourdst/config/config.h"
#include <string>

struct MyPhysicsOptions {
    int gravity = 10;
    float friction = 0.5f;
    bool enable_wind = false;
};

struct MyControlOptions {
    double time_step = 0.01;
    double max_time = 100.0;
};

struct MySimulationConfig {
    std::string name = "my_simulation";
    MyPhysicsOptions physics;
    MyControlOptions control;
};

int main() {
    fourdst::config::Config<MySimulationConfig> cfg;
    
    // You can save the default config to a file
    cfg.save("default_config.toml");
    
    // If you do not provide a name, glaze will use the struct's name
    cfg.save(); // saves to MySimulationConfig.toml
    
    // You can save the json schema for the config
    cfg.save_schema("."); // Here you must provide the directory to save to rather than a full file name
    
    // You can load a config from a file
    cfg.load("my_config.toml");
    
    // You can accesss the config values
    std::println("My Simulation Name: {}, My Simulation Gravity: {}", cfg->name, cfg->physics.gravity);
}

Example output TOML

[main]
name = "my_simulation"
[main.physics]
gravity = 10
friction = 0.5
enable_wind = false
[main.control]
time_step = 0.01
max_time = 100.0
Description
No description provided
Readme 1.5 MiB
Languages
C++ 61.6%
C 38.2%
Meson 0.2%