{"id":18793584,"url":"https://github.com/kfrlib/mirror","last_synced_at":"2025-12-29T02:30:15.511Z","repository":{"id":112868894,"uuid":"580713979","full_name":"kfrlib/mirror","owner":"kfrlib","description":"(micro) declarative reflection library in C++20","archived":false,"fork":false,"pushed_at":"2022-12-21T09:25:05.000Z","size":3,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-12-29T15:45:36.698Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kfrlib.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-21T09:03:00.000Z","updated_at":"2022-12-21T09:25:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"e240809e-34c3-421a-a450-6fa6a2bf9afc","html_url":"https://github.com/kfrlib/mirror","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kfrlib%2Fmirror","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kfrlib%2Fmirror/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kfrlib%2Fmirror/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kfrlib%2Fmirror/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kfrlib","download_url":"https://codeload.github.com/kfrlib/mirror/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239718425,"owners_count":19685725,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T21:25:54.670Z","updated_at":"2025-12-29T02:30:15.445Z","avatar_url":"https://github.com/kfrlib.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# (micro) reflection library for C++20\n\nUsage example:\n\n```c++\n#include \u003cmirror.hpp\u003e\n#include \u003ciostream\u003e\n\ntemplate \u003ctypename T\u003e\nstruct color_rgb {\n    T red{};\n    T green{};\n    T blue{};\n\n    // Reflection information in the class itself\n    static constexpr inline std::tuple reflection{\n        field{ \"red\", \u0026color_rgb::red },\n        field{ \"green\", \u0026color_rgb::green },\n        field{ \"blue\", \u0026color_rgb::blue },\n    };\n};\n\ntemplate \u003ctypename T\u003e\ncolor_rgb(T, T, T) -\u003e color_rgb\u003cT\u003e;\n\n// Reflection informatino for an external class\ntemplate \u003ctypename T1, typename T2\u003e\ninline constexpr const std::tuple mirror::reflection_of\u003cstd::pair\u003cT1, T2\u003e\u003e = {\n    field{ \"first\", \u0026std::pair\u003cT1, T2\u003e::first },\n    field{ \"second\", \u0026std::pair\u003cT1, T2\u003e::second },\n};\n\nint main() {\n    \n    std::cout \u003c\u003c std::endl \u003c\u003c \"reading struct fields:\" \u003c\u003c std::endl;\n    for_each_field(std::make_pair(\"answer\", 42), [](std::string_view name, auto value) {\n        std::cout \u003c\u003c name \u003c\u003c \"=\" \u003c\u003c value \u003c\u003c std::endl;\n    });\n    for_each_field(color_rgb{ 1.0, 0.0, 0.5 }, [](std::string_view name, auto value) {\n        std::cout \u003c\u003c name \u003c\u003c \"=\" \u003c\u003c value \u003c\u003c std::endl;\n    });\n\n}\n```\n\nAnother example with field attributes:\n\n```c++\n\n#include \u003cmirror.hpp\u003e\n#include \u003cbit\u003e\n#include \u003ciostream\u003e\n#include \u003ciomanip\u003e\n\nstruct attr_mask {\n    uint32_t mask;\n};\n\nstruct attr_json_name {\n    std::string_view json_name;\n};\n\nstruct color_rgba32 {\n    uint8_t red{};\n    uint8_t green{};\n    uint8_t blue{};\n    uint8_t alpha{};\n\n    // Reflection information with extra fields\n    static constexpr inline std::tuple reflection{\n        field{ \"red\", \u0026color_rgba32::red, attr_mask{ 0x000000FFu }, attr_json_name{ \"r\" } },\n        field{ \"green\", \u0026color_rgba32::green, attr_mask{ 0x0000FF00u }, attr_json_name{ \"g\" } },\n        field{ \"blue\", \u0026color_rgba32::blue, attr_mask{ 0x00FF0000u }, attr_json_name{ \"b\" } },\n        field{ \"alpha\", \u0026color_rgba32::alpha, attr_mask{ 0xFF000000u }, attr_json_name{ \"a\" } },\n    };\n};\n\nconstexpr auto print_field = [](std::string_view name, auto value) {\n    std::cout \u003c\u003c name \u003c\u003c \"=\";\n    if constexpr (std::is_integral_v\u003cdecltype(value)\u003e)\n        std::cout.operator\u003c\u003c(value).operator\u003c\u003c(std::endl); // avoid printing uint8_t as character\n    else\n        std::cout \u003c\u003c value \u003c\u003c std::endl;\n};\n\nint main() {\n\n    color_rgba32 c;\n    uint32_t input = 0xFFCC80EE;\n    for_each_field(c, [input](std::string_view name, uint8_t\u0026 value, const attr_mask\u0026 mask) {\n        value = (input \u0026 mask.mask) \u003e\u003e std::countr_zero(mask.mask);\n    });\n    for_each_field(c, print_field);\n\n    std::cout \u003c\u003c std::endl \u003c\u003c \"enumerating struct fields:\" \u003c\u003c std::endl;\n    for_each_field\u003ccolor_rgba32\u003e(\n        [](std::string_view name, const field\u003ccolor_rgba32, uint8_t, attr_mask, attr_json_name\u003e\u0026 field) {\n            std::cout \u003c\u003c name \u003c\u003c \" (mask: \" \u003c\u003c std::hex \u003c\u003c std::setw(8) \u003c\u003c std::setfill('0') \u003c\u003c field.mask\n                      \u003c\u003c std::dec \u003c\u003c \", json: \" \u003c\u003c field.json_name \u003c\u003c \")\" \u003c\u003c std::endl;\n        });\n\n}\n```\n\n## License\n\nMIT","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkfrlib%2Fmirror","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkfrlib%2Fmirror","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkfrlib%2Fmirror/lists"}