example1.md

September 18, 2024 ยท View on GitHub

ThorStream

Example-1 See doc/example1.cpp

    #include <iostream>
    #include <sstream>
    #include "ThorSerialize/Traits.h"
    #include "ThorSerialize/JsonThor.h"

    struct Shirt
    {
        int     red;
        int     green;
        int     blue;
    };    
    class TeamMember
    {
        std::string     name;
        int             score;
        int             damage;
        Shirt           team;
        public:
            TeamMember(std::string const& name, int score, int damage, Shirt const& team)
                : name(name)
                , score(score)
                , damage(damage)
                , team(team)
            {}
            // Define the trait as a friend to get accesses to private
            // Members.
            friend class ThorsAnvil::Serialize::Traits<TeamMember>;
    };

    // Declare the traits.
    // Specifying what members need to be serialized.
    ThorsAnvil_MakeTrait(Shirt, red, green, blue);
    ThorsAnvil_MakeTrait(TeamMember, name, score, damage, team);

    int main()
    {
        using ThorsAnvil::Serialize::jsonImporter;
        using ThorsAnvil::Serialize::jsonExporter;

        TeamMember          mark("mark", 10, 5, Shirt{255,0,0});
        // Use the export function to serialize
        std::cout << jsonExporter(mark) << "\n";

        TeamMember          john("Empty", 0, 0, Shirt{0,0,0});
        std::stringstream   input(R"({"name": "John","score": 13,"team":{"red": 0,"green": 0,"blue": 255, "black":25}})");
        input >> jsonImporter(john);
        std::cout << jsonExporter(john) << "\n";
    }

Build and run

    > g++ -std=c++20 example1.cpp -lThorSerialize -lThorsLogging
    > # Note on mac you may need to add -I/opt/homebrew/include -L/opt/homebrew/lib/ on Mac's with M1 chip.
    > ./a.out
    {
        "name": "mark",
        "score": 10,
        "damage": 5,
        "team":
        {
            "red": 255,
            "green": 0,
            "blue": 0
        }
    }
    {
        "name": "John",
        "score": 13,
        "damage": 0,
        "team":
        {
            "red": 0,
            "green": 0,
            "blue": 255
        }
    }