Skip to content
Flecs v4.1
reflection/ser_std_vector

  • C++

    View on GitHub

    1#include <ser_std_vector.h>
    2#include <iostream>
    3#include <string>
    4#include <vector>
    5
    6// This example shows how to serialize a component with std::vectors
    7
    8struct VectorComponent {
    9 std::vector<int32_t> ints;
    10 std::vector<std::string> strings;
    11};
    12
    13// Reusable reflection support for std::vector
    14template <typename Elem, typename Vector = std::vector<Elem>>
    15flecs::opaque<Vector, Elem> std_vector_support(flecs::world& world) {
    17 .as_type(world.vector<Elem>())
    18
    19 // Forward elements of std::vector value to serializer
    20 .serialize([](const flecs::serializer *s, const Vector *data) {
    21 for (const auto& el : *data) {
    22 s->value(el);
    23 }
    24 return 0;
    25 })
    26
    27 // Return vector count
    28 .count([](const Vector *data) {
    29 return data->size();
    30 })
    31
    32 // Resize contents of vector
    33 .resize([](Vector *data, size_t size) {
    34 data->resize(size);
    35 })
    36
    37 // Ensure element exists, return pointer
    38 .ensure_element([](Vector *data, size_t elem) {
    39 if (data->size() <= elem) {
    40 data->resize(elem + 1);
    41 }
    42
    43 return &data->data()[elem];
    44 });
    45}
    46
    47int main(int, char *[]) {
    48 flecs::world ecs;
    49
    50 // Register reflection for std::string
    51 ecs.component<std::string>()
    52 .opaque(flecs::String) // Maps to string
    53 .serialize([](const flecs::serializer *s, const std::string *data) {
    54 const char *str = data->c_str();
    55 return s->value(flecs::String, &str); // Forward to serializer
    56 })
    57 .assign_string([](std::string* data, const char *value) {
    58 *data = value; // Assign new value to std::string
    59 });
    60
    61 // Register reflection for std::vector<int>
    62 ecs.component<std::vector<int>>()
    63 .opaque(std_vector_support<int>);
    64
    65 // Register reflection for std::vector<std::string>
    66 ecs.component<std::vector<std::string>>()
    67 .opaque(std_vector_support<std::string>);
    68
    69 // Register component with std::vector members
    70 ecs.component<VectorComponent>()
    71 .member<std::vector<int>>("ints")
    72 .member<std::vector<std::string>>("strings");
    73
    74 // Create value & serialize it to JSON
    75 VectorComponent v = {{1, 2, 3}, {"foo", "bar"}};
    76 std::cout << ecs.to_json(&v) << std::endl;
    77
    78 // Deserialize new values from JSON into value
    79 ecs.from_json(&v,
    80 "{\"ints\": [4, 5], \"strings\":[\"hello\", \"flecs\", \"reflection\"]}");
    81
    82 // Serialize again
    83 std::cout << ecs.to_json(&v) << std::endl;
    84
    85 // Output:
    86 // {"ints":[1, 2, 3], "strings":["foo", "bar"]}
    87 // {"ints":[4, 5], "strings":["hello", "flecs", "reflection"]}
    88}
    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 & as_type(flecs::id_t func)
    Set the type that describes the kind/structure of the opaque type.
    Definition opaque.hpp:47
    opaque & serialize(flecs::serialize< T > func)
    Set the serialize function.
    Definition opaque.hpp:53
    The world.
    Definition world.hpp:129