finalise interface & documentation

Signed-off-by: Folling <mail@folling.io>
This commit is contained in:
folling 2023-11-06 13:14:39 +01:00 committed by Folling
parent c5157bd849
commit 52580a4382
Signed by: folling
SSH key fingerprint: SHA256:S9qEx5WCFFLK49tE/LKnKuJYM5sw+++Dn6qJbbyxnCY
56 changed files with 2074 additions and 780 deletions

View file

@ -2,194 +2,81 @@
#include <initializer_list>
#include <utility>
#include <variant>
#include <catch2/catch_test_macros.hpp>
#include <ikarus/objects/blueprint.h>
#include <ikarus/objects/entity.h>
#include <cppbase/templates.hpp>
#include <ikarus/scopes/blueprint_scope.h>
#include <ikarus/scopes/entity_scope.h>
#include <ikarus/scopes/property_scope.h>
IkarusBlueprintScope ikarus_blueprint_scope_create() {
return IkarusBlueprintScope{._dummy = 0};
}
#include <scopes/object_scope.hpp>
IkarusObjectScope ikarus_blueprint_scope_to_object_scope(IkarusBlueprintScope scope) {
IkarusObjectScopeData data{};
data._blueprint = scope;
return IkarusObjectScope{._type = IkarusObjectScopeType_Blueprint, ._data = data};
}
IkarusPropertyScope ikarus_property_scope_create_blueprint(IkarusBlueprint blueprint) {
IkarusPropertyScopeData data{};
data._blueprint = blueprint;
return IkarusPropertyScope{._type = IkarusPropertyScopeType_Blueprint, ._data = data};
}
IkarusPropertyScope ikarus_property_scope_create_entity(IkarusEntity entity) {
IkarusPropertyScopeData data{};
data._entity = entity;
return IkarusPropertyScope{._type = IkarusPropertyScopeType_Entity, ._data = data};
}
IkarusObjectScope ikarus_property_scope_to_object_scope(IkarusPropertyScope scope) {
IkarusObjectScopeData data{};
data._property = scope;
return IkarusObjectScope{._type = IkarusObjectScopeType_Property, ._data = data};
}
IkarusPropertyScopeType ikarus_property_scope_get_type(IkarusPropertyScope scope) {
return scope._type;
}
void ikarus_property_scope_visit(
IkarusPropertyScope scope, void(blueprint)(IkarusBlueprint, void *), void(entity)(IkarusEntity, void *), void * data
) {
switch (scope._type) {
case IkarusPropertyScopeType_Blueprint: blueprint(scope._data._blueprint, data); break;
case IkarusPropertyScopeType_Entity: entity(scope._data._entity, data); break;
}
}
IkarusEntityScope ikarus_entity_scope_create() {
return IkarusEntityScope{._dummy = 0};
}
IkarusObjectScope ikarus_entity_scope_to_object_scope(IkarusEntityScope scope) {
IkarusObjectScopeData data{};
data._entity = scope;
return IkarusObjectScope{._type = IkarusObjectScopeType_Entity, ._data = data};
}
IkarusObjectScopeType ikarus_object_scope_get_type(IkarusObjectScope scope) {
return scope._type;
IkarusObjectScopeType ikarus_object_scope_get_type(IkarusObjectScope * scope) {
return std::visit(
cppbase::overloaded{
[]([[maybe_unused]] IkarusBlueprintScope const& scope) { return IkarusObjectScopeType_Blueprint; },
[]([[maybe_unused]] IkarusPropertyScope const& scope) { return IkarusObjectScopeType_Property; },
[]([[maybe_unused]] IkarusEntityScope const& scope) { return IkarusObjectScopeType_Entity; }},
scope->data
);
}
void ikarus_object_scope_visit(
IkarusObjectScope scope,
void(blueprint)(IkarusBlueprintScope, void *),
void(property)(IkarusPropertyScope, void *),
void(entity)(IkarusEntityScope, void *),
IkarusObjectScope * scope,
void(blueprint_visitor)(IkarusBlueprintScope *, void *),
void(property_visitor)(IkarusPropertyScope *, void *),
void(entity_visitor)(IkarusEntityScope *, void *),
void * data
) {
switch (scope._type) {
case IkarusObjectScopeType_Blueprint: {
if (blueprint != nullptr) {
blueprint(scope._data._blueprint, data);
}
break;
}
case IkarusObjectScopeType_Property: {
if (property != nullptr) {
property(scope._data._property, data);
}
break;
}
case IkarusObjectScopeType_Entity: {
if (entity != nullptr) {
entity(scope._data._entity, data);
}
break;
}
}
std::visit(
cppbase::overloaded{
[blueprint_visitor, data](IkarusBlueprintScope& scope) { blueprint_visitor(&scope, data); },
[property_visitor, data](IkarusPropertyScope& scope) { property_visitor(&scope, data); },
[entity_visitor, data](IkarusEntityScope& scope) { entity_visitor(&scope, data); }},
scope->data
);
}
TEST_CASE("blueprint_object_scope_conversion", "[object_scope]") {
auto blueprint_scope = ikarus_blueprint_scope_create();
auto blueprint_object_scope = ikarus_blueprint_scope_to_object_scope(blueprint_scope);
REQUIRE(blueprint_object_scope._type == IkarusObjectScopeType_Blueprint);
}
TEST_CASE("property_scope_type", "[object_scope]") {
auto blueprint = IkarusBlueprint{};
auto entity = IkarusEntity{};
auto property_blueprint_scope = ikarus_property_scope_create_blueprint(blueprint);
auto property_entity_scope = ikarus_property_scope_create_entity(entity);
REQUIRE(ikarus_property_scope_get_type(property_blueprint_scope) == IkarusPropertyScopeType_Blueprint);
REQUIRE(ikarus_property_scope_get_type(property_entity_scope) == IkarusPropertyScopeType_Entity);
auto * blueprint_scope = ikarus_blueprint_scope_create();
auto * blueprint_object_scope = ikarus_blueprint_scope_to_object_scope(blueprint_scope);
REQUIRE(ikarus_object_scope_get_type(blueprint_object_scope) == IkarusObjectScopeType_Blueprint);
}
TEST_CASE("property_object_scope_conversion", "[object_scope]") {
auto blueprint = IkarusBlueprint{};
auto entity = IkarusEntity{};
auto * blueprint = ikarus_blueprint_create();
auto * entity = ikarus_entity_create();
auto property_blueprint_scope = ikarus_property_scope_create_blueprint(blueprint);
auto property_blueprint_object_scope = ikarus_property_scope_to_object_scope(property_blueprint_scope);
auto * property_blueprint_scope = ikarus_property_scope_create_blueprint(blueprint);
auto * property_blueprint_object_scope = ikarus_property_scope_to_object_scope(property_blueprint_scope);
REQUIRE(property_blueprint_object_scope._type == IkarusObjectScopeType_Property);
REQUIRE(ikarus_object_scope_get_type(property_blueprint_object_scope) == IkarusObjectScopeType_Property);
auto property_entity_scope = ikarus_property_scope_create_entity(entity);
auto property_entity_object_scope = ikarus_property_scope_to_object_scope(property_entity_scope);
auto * property_entity_scope = ikarus_property_scope_create_entity(entity);
auto * property_entity_object_scope = ikarus_property_scope_to_object_scope(property_entity_scope);
REQUIRE(property_entity_object_scope._type == IkarusObjectScopeType_Property);
}
TEST_CASE("property_scope_visiting", "[object_scope]") {
auto blueprint = IkarusBlueprint{};
auto entity = IkarusEntity{};
auto property_blueprint_scope = ikarus_property_scope_create_blueprint(blueprint);
auto property_entity_scope = ikarus_property_scope_create_entity(entity);
int test = 0;
ikarus_property_scope_visit(
property_blueprint_scope,
[](IkarusBlueprint, void * data) { *reinterpret_cast<decltype(test) *>(data) = 1; },
[](IkarusEntity, void * data) { *reinterpret_cast<decltype(test) *>(data) = 2; },
&test
);
REQUIRE(test == 1);
ikarus_property_scope_visit(
property_entity_scope,
[](IkarusBlueprint, void * data) { *reinterpret_cast<decltype(test) *>(data) = 1; },
[](IkarusEntity, void * data) { *reinterpret_cast<decltype(test) *>(data) = 2; },
&test
);
REQUIRE(test == 2);
REQUIRE(ikarus_object_scope_get_type(property_entity_object_scope) == IkarusObjectScopeType_Property);
}
TEST_CASE("entity_object_scope_conversion", "[object_scope]") {
auto entity_scope = ikarus_entity_scope_create();
auto entity_object_scope = ikarus_entity_scope_to_object_scope(entity_scope);
REQUIRE(entity_object_scope._type == IkarusObjectScopeType_Entity);
}
TEST_CASE("object_scope_type_fetching", "[object_scope]") {
auto blueprint = IkarusBlueprint{};
auto blueprint_scope = ikarus_blueprint_scope_create();
auto property_scope = ikarus_property_scope_create_blueprint(blueprint);
auto entity_scope = ikarus_entity_scope_create();
auto blueprint_object_scope = ikarus_blueprint_scope_to_object_scope(blueprint_scope);
auto property_object_scope = ikarus_property_scope_to_object_scope(property_scope);
auto entity_object_scope = ikarus_entity_scope_to_object_scope(entity_scope);
REQUIRE(ikarus_object_scope_get_type(blueprint_object_scope) == IkarusObjectScopeType_Blueprint);
REQUIRE(ikarus_object_scope_get_type(property_object_scope) == IkarusObjectScopeType_Property);
auto * entity_scope = ikarus_entity_scope_create();
auto * entity_object_scope = ikarus_entity_scope_to_object_scope(entity_scope);
REQUIRE(ikarus_object_scope_get_type(entity_object_scope) == IkarusObjectScopeType_Entity);
}
TEST_CASE("object_scope_visiting", "[object_scope]") {
auto blueprint = IkarusBlueprint{};
auto * blueprint = ikarus_blueprint_create();
auto blueprint_scope = ikarus_blueprint_scope_create();
auto property_scope = ikarus_property_scope_create_blueprint(blueprint);
auto entity_scope = ikarus_entity_scope_create();
auto * blueprint_scope = ikarus_blueprint_scope_create();
auto * property_scope = ikarus_property_scope_create_blueprint(blueprint);
auto * entity_scope = ikarus_entity_scope_create();
auto blueprint_object_scope = ikarus_blueprint_scope_to_object_scope(blueprint_scope);
auto property_object_scope = ikarus_property_scope_to_object_scope(property_scope);
auto entity_object_scope = ikarus_entity_scope_to_object_scope(entity_scope);
auto * blueprint_object_scope = ikarus_blueprint_scope_to_object_scope(blueprint_scope);
auto * property_object_scope = ikarus_property_scope_to_object_scope(property_scope);
auto * entity_object_scope = ikarus_entity_scope_to_object_scope(entity_scope);
auto scopes = {
std::make_pair(blueprint_object_scope, 1),
@ -202,9 +89,9 @@ TEST_CASE("object_scope_visiting", "[object_scope]") {
ikarus_object_scope_visit(
scope,
[](IkarusBlueprintScope, void * data) { *reinterpret_cast<decltype(test) *>(data) = 1; },
[](IkarusPropertyScope, void * data) { *reinterpret_cast<decltype(test) *>(data) = 2; },
[](IkarusEntityScope, void * data) { *reinterpret_cast<decltype(test) *>(data) = 3; },
[](IkarusBlueprintScope *, void * data) { *static_cast<decltype(test) *>(data) = 1; },
[](IkarusPropertyScope *, void * data) { *static_cast<decltype(test) *>(data) = 2; },
[](IkarusEntityScope *, void * data) { *static_cast<decltype(test) *>(data) = 3; },
&test
);