Skip to content
Flecs v4.1
reflection/ser_std_optional

  • C++

    View on GitHub

    1#include <ser_std_optional.h>
    2#include <iostream>
    3#include <optional>
    4
    5template <typename T>
    6flecs::opaque<std::optional<T>, T> std_optional_support(flecs::world &world) {
    8 .as_type(world.vector<T>())
    9 .serialize([](const flecs::serializer *s, const std::optional<T> *data) {
    10 if (*data) {
    11 s->value(**data);
    12 }
    13 return 0;
    14 })
    15 .count(
    16 [](const std::optional<T> *data) -> size_t { return *data ? 1 : 0; })
    17 .resize([](std::optional<T> *data, size_t size) {
    18 switch (size) {
    19 case 0:
    20 *data = std::nullopt;
    21 break;
    22 case 1:
    23 if (!data->has_value()) {
    24 *data = T();
    25 }
    26 break;
    27 default:
    28 assert(false);
    29 }
    30 })
    31 .ensure_element([](std::optional<T> *data, size_t) {
    32 if (!data->has_value()) {
    33 *data = T();
    34 }
    35 return &data->value();
    36 });
    37}
    38
    39int main(int, char *[]) {
    40 flecs::world ecs;
    41
    42 // Register reflection for std::optional<int>
    43 ecs.component<std::optional<int>>()
    44 .opaque(std_optional_support<int>);
    45
    46 std::optional<int> empty = std::nullopt;
    47 std::cout << ecs.to_json(&empty) << std::endl;
    48
    49 std::optional<int> full = 1;
    50 std::cout << ecs.to_json(&full) << std::endl;
    51
    52 std::optional<int> o;
    53 ecs.from_json(&o, "[2]");
    54 std::cout << ecs.to_json(&o) << std::endl;
    55
    56 // Output:
    57 // []
    58 // [1]
    59 // [2]
    60}
    component & opaque(const Func &type_support)
    Register an opaque type interface.
    Definition component.inl:8
    const char * from_json(flecs::entity_t tid, void *value, const char *json, flecs::from_json_desc_t *desc=nullptr)
    Deserialize a value from JSON.
    Definition world.hpp:42
    flecs::string to_json(flecs::entity_t tid, const void *value) const
    Serialize an untyped value to JSON.
    Definition world.hpp:12
    ecs_serializer_t serializer
    Serializer object, used for serializing opaque types.
    Definition opaque.hpp:19
    flecs::entity vector(flecs::entity_t elem_id)
    Create a vector type.
    Definition impl.hpp:132
    flecs::component< T > component(Args &&... args) const
    Find or register a component.
    Definition impl.hpp:11
    int(*) value(const struct ecs_serializer_t *ser, ecs_entity_t type, const void *value)
    Serialize value.
    Definition meta.h:350
    Type-safe interface for opaque types.
    Definition opaque.hpp:39
    opaque & serialize(flecs::serialize< T > func)
    Set the serialize function.
    Definition opaque.hpp:53
    The world.
    Definition world.hpp:129