implement IkarusPropertySource and switch to cppbase::overloaded
Signed-off-by: Folling <mail@folling.io>
This commit is contained in:
parent
ab250c00ae
commit
7be1675180
10 changed files with 90 additions and 50 deletions
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include <objects/object.hpp>
|
#include <objects/object.hpp>
|
||||||
|
|
||||||
struct IkarusBlueprint final : IkarusObject {
|
struct IkarusBlueprint : IkarusObject {
|
||||||
IkarusBlueprint(struct IkarusProject * project, IkarusId id);
|
IkarusBlueprint(struct IkarusProject * project, IkarusId id);
|
||||||
|
|
||||||
IkarusBlueprint(IkarusBlueprint const&) = default;
|
IkarusBlueprint(IkarusBlueprint const&) = default;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include <objects/object.hpp>
|
#include <objects/object.hpp>
|
||||||
|
|
||||||
struct IkarusEntity final : IkarusObject {
|
struct IkarusEntity : IkarusObject {
|
||||||
inline IkarusEntity(struct IkarusProject * project, IkarusId id):
|
inline IkarusEntity(struct IkarusProject * project, IkarusId id):
|
||||||
IkarusObject{project, id} {}
|
IkarusObject{project, id} {}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
#include "property_source.hpp"
|
||||||
|
|
||||||
|
#include <boost/functional/overloaded_function.hpp>
|
||||||
|
|
||||||
|
#include <objects/blueprint.hpp>
|
||||||
|
|
||||||
|
IkarusPropertySource::IkarusPropertySource(Data data):
|
||||||
|
data{data} {}
|
||||||
|
|
||||||
|
IkarusPropertySource * ikarus_property_source_create_blueprint(IkarusBlueprint * blueprint) {
|
||||||
|
return new IkarusPropertySource{blueprint};
|
||||||
|
}
|
||||||
|
|
||||||
|
IkarusPropertySource * ikarus_property_source_create_entity(IkarusEntity * entity) {
|
||||||
|
return new IkarusPropertySource{entity};
|
||||||
|
}
|
||||||
|
|
||||||
|
void ikarus_property_source_visit(
|
||||||
|
struct IkarusPropertySource * property_source,
|
||||||
|
void (*blueprint_visitor)(struct IkarusBlueprint *, void *),
|
||||||
|
void (*entity_visitor)(struct IkarusEntity *, void *),
|
||||||
|
void * user_data
|
||||||
|
) {
|
||||||
|
boost::variant2::visit(
|
||||||
|
boost::make_overloaded_function(
|
||||||
|
[blueprint_visitor, user_data](IkarusBlueprint * blueprint) { blueprint_visitor(blueprint, user_data); },
|
||||||
|
[entity_visitor, user_data](IkarusEntity * entity) { entity_visitor(entity, user_data); }
|
||||||
|
),
|
||||||
|
property_source->data
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ikarus_property_source_visit_const(
|
||||||
|
struct IkarusPropertySource const * property_source,
|
||||||
|
void (*blueprint_visitor)(struct IkarusBlueprint const *, void *),
|
||||||
|
void (*entity_visitor)(struct IkarusEntity const *, void *),
|
||||||
|
void * user_data
|
||||||
|
) {
|
||||||
|
boost::variant2::visit(
|
||||||
|
boost::make_overloaded_function(
|
||||||
|
[blueprint_visitor, user_data](IkarusBlueprint const * blueprint) { blueprint_visitor(blueprint, user_data); },
|
||||||
|
[entity_visitor, user_data](IkarusEntity const * entity) { entity_visitor(entity, user_data); }
|
||||||
|
),
|
||||||
|
property_source->data
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -1,16 +1,15 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <variant>
|
#include <boost/variant2.hpp>
|
||||||
|
|
||||||
#include <ikarus/objects/properties/property_source.h>
|
#include <ikarus/objects/properties/property_source.h>
|
||||||
|
|
||||||
struct IkarusPropertySource {
|
struct IkarusPropertySource {
|
||||||
public:
|
public:
|
||||||
using Data = std::variant<IkarusBlueprint *, IkarusEntity *>;
|
using Data = boost::variant2::variant<IkarusBlueprint *, IkarusEntity *>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
inline explicit IkarusPropertySource(Data data):
|
explicit IkarusPropertySource(Data data);
|
||||||
_data{data} {}
|
|
||||||
|
|
||||||
IkarusPropertySource(IkarusPropertySource const&) = default;
|
IkarusPropertySource(IkarusPropertySource const&) = default;
|
||||||
IkarusPropertySource(IkarusPropertySource&&) = default;
|
IkarusPropertySource(IkarusPropertySource&&) = default;
|
||||||
|
|
@ -18,13 +17,8 @@ public:
|
||||||
IkarusPropertySource& operator=(IkarusPropertySource const&) = default;
|
IkarusPropertySource& operator=(IkarusPropertySource const&) = default;
|
||||||
IkarusPropertySource& operator=(IkarusPropertySource&&) = default;
|
IkarusPropertySource& operator=(IkarusPropertySource&&) = default;
|
||||||
|
|
||||||
~IkarusPropertySource() = default;
|
virtual ~IkarusPropertySource() = default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] inline Data const& get_data() const {
|
Data data;
|
||||||
return _data;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::variant<IkarusBlueprint *, IkarusEntity *> _data;
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include <objects/properties/property.hpp>
|
#include <objects/properties/property.hpp>
|
||||||
|
|
||||||
struct IkarusToggleProperty final : IkarusProperty {
|
struct IkarusToggleProperty : IkarusProperty {
|
||||||
public:
|
public:
|
||||||
IkarusToggleProperty(struct IkarusProject * project, IkarusId id);
|
IkarusToggleProperty(struct IkarusProject * project, IkarusId id);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,9 @@
|
||||||
|
|
||||||
#include <values/value.hpp>
|
#include <values/value.hpp>
|
||||||
|
|
||||||
struct IkarusNumberValue final : IkarusValue {
|
struct IkarusNumberValue : IkarusValue {
|
||||||
public:
|
public:
|
||||||
using data_type = double;
|
using DataType = double;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit IkarusNumberValue();
|
explicit IkarusNumberValue();
|
||||||
|
|
@ -21,6 +21,6 @@ public:
|
||||||
~IkarusNumberValue() override = default;
|
~IkarusNumberValue() override = default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
boost::variant2::variant<boost::variant2::monostate, boost::container::small_vector<data_type, SMALL_VEC_VALUE_SIZE>> data{
|
boost::variant2::variant<boost::variant2::monostate, boost::container::small_vector<DataType, SMALL_VEC_VALUE_SIZE>> data{
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,9 @@
|
||||||
|
|
||||||
#include <values/value.hpp>
|
#include <values/value.hpp>
|
||||||
|
|
||||||
struct IkarusTextValue final : IkarusValue {
|
struct IkarusTextValue : IkarusValue {
|
||||||
public:
|
public:
|
||||||
using data_type = std::string;
|
using DataType = std::string;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit IkarusTextValue();
|
explicit IkarusTextValue();
|
||||||
|
|
@ -20,6 +20,6 @@ public:
|
||||||
~IkarusTextValue() override = default;
|
~IkarusTextValue() override = default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
boost::variant2::variant<boost::variant2::monostate, boost::container::small_vector<data_type, SMALL_VEC_VALUE_SIZE>> data{
|
boost::variant2::variant<boost::variant2::monostate, boost::container::small_vector<DataType, SMALL_VEC_VALUE_SIZE>> data{
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,9 @@
|
||||||
|
|
||||||
#include <values/value.hpp>
|
#include <values/value.hpp>
|
||||||
|
|
||||||
struct IkarusToggleValue final : IkarusValue {
|
struct IkarusToggleValue : IkarusValue {
|
||||||
public:
|
public:
|
||||||
using data_type = bool;
|
using DataType = bool;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit IkarusToggleValue();
|
explicit IkarusToggleValue();
|
||||||
|
|
@ -20,6 +20,6 @@ public:
|
||||||
~IkarusToggleValue() override = default;
|
~IkarusToggleValue() override = default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
boost::variant2::variant<boost::variant2::monostate, boost::container::small_vector<data_type, SMALL_VEC_VALUE_SIZE>> data{
|
boost::variant2::variant<boost::variant2::monostate, boost::container::small_vector<DataType, SMALL_VEC_VALUE_SIZE>> data{
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,10 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <boost/container/small_vector.hpp>
|
#include <boost/container/small_vector.hpp>
|
||||||
#include <boost/functional/overloaded_function.hpp>
|
|
||||||
|
|
||||||
// required for header-only inclusion
|
// required for header-only inclusion
|
||||||
|
#include "cppbase/templates.hpp"
|
||||||
|
|
||||||
#include <boost/json/src.hpp>
|
#include <boost/json/src.hpp>
|
||||||
|
|
||||||
#include <ikarus/objects/properties/property_type.h>
|
#include <ikarus/objects/properties/property_type.h>
|
||||||
|
|
@ -43,7 +44,7 @@ cppbase::Result<IkarusValue *, IkarusValue::FromJsonError> IkarusValue::from_jso
|
||||||
ret->data = boost::variant2::monostate{};
|
ret->data = boost::variant2::monostate{};
|
||||||
} else {
|
} else {
|
||||||
auto res = boost::json::try_value_to<
|
auto res = boost::json::try_value_to<
|
||||||
boost::container::small_vector<typename T::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(*data);
|
boost::container::small_vector<typename T::DataType, IkarusValue::SMALL_VEC_VALUE_SIZE>>(*data);
|
||||||
|
|
||||||
if (res.has_error()) {
|
if (res.has_error()) {
|
||||||
return cppbase::err(FromJsonError{});
|
return cppbase::err(FromJsonError{});
|
||||||
|
|
@ -75,21 +76,21 @@ cppbase::Result<IkarusValue *, IkarusValue::FromJsonError> IkarusValue::from_jso
|
||||||
|
|
||||||
boost::json::value IkarusValue::to_json() const {
|
boost::json::value IkarusValue::to_json() const {
|
||||||
auto type = boost::variant2::visit(
|
auto type = boost::variant2::visit(
|
||||||
boost::make_overloaded_function(
|
cppbase::overloaded{
|
||||||
[]([[maybe_unused]] IkarusToggleValue const * value) { return IkarusPropertyType_Toggle; },
|
[]([[maybe_unused]] IkarusToggleValue const * value) { return IkarusPropertyType_Toggle; },
|
||||||
[]([[maybe_unused]] IkarusNumberValue const * value) { return IkarusPropertyType_Number; },
|
[]([[maybe_unused]] IkarusNumberValue const * value) { return IkarusPropertyType_Number; },
|
||||||
[]([[maybe_unused]] IkarusTextValue const * value) { return IkarusPropertyType_Text; }
|
[]([[maybe_unused]] IkarusTextValue const * value) { return IkarusPropertyType_Text; }
|
||||||
),
|
},
|
||||||
data
|
data
|
||||||
);
|
);
|
||||||
|
|
||||||
auto data_json = boost::variant2::visit(
|
auto data_json = boost::variant2::visit(
|
||||||
[]<typename T>(T const * value) -> boost::json::value {
|
[]<typename T>(T const * value) -> boost::json::value {
|
||||||
return boost::variant2::visit(
|
return boost::variant2::visit(
|
||||||
boost::make_overloaded_function(
|
cppbase::overloaded{
|
||||||
[]([[maybe_unused]] boost::variant2::monostate const& data) -> boost::json::value { return nullptr; },
|
[]([[maybe_unused]] boost::variant2::monostate const& data) -> boost::json::value { return nullptr; },
|
||||||
[](auto const& data) -> boost::json::value { return boost::json::value_from(data); }
|
[](auto const& data) -> boost::json::value { return boost::json::value_from(data); }
|
||||||
),
|
},
|
||||||
value->data
|
value->data
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
@ -110,11 +111,11 @@ void ikarus_value_visit(
|
||||||
void * data
|
void * data
|
||||||
) {
|
) {
|
||||||
boost::variant2::visit(
|
boost::variant2::visit(
|
||||||
boost::make_overloaded_function(
|
cppbase::overloaded{
|
||||||
[toggle_visitor, data](IkarusToggleValue * toggle_value) { toggle_visitor(toggle_value, data); },
|
[toggle_visitor, data](IkarusToggleValue * toggle_value) { toggle_visitor(toggle_value, data); },
|
||||||
[number_visitor, data](IkarusNumberValue * number_value) { number_visitor(number_value, data); },
|
[number_visitor, data](IkarusNumberValue * number_value) { number_visitor(number_value, data); },
|
||||||
[text_visitor, data](IkarusTextValue * text_value) { text_visitor(text_value, data); }
|
[text_visitor, data](IkarusTextValue * text_value) { text_visitor(text_value, data); }
|
||||||
),
|
},
|
||||||
value->data
|
value->data
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -127,11 +128,11 @@ void ikarus_value_visit_const(
|
||||||
void * data
|
void * data
|
||||||
) {
|
) {
|
||||||
boost::variant2::visit(
|
boost::variant2::visit(
|
||||||
boost::make_overloaded_function(
|
cppbase::overloaded{
|
||||||
[toggle_visitor, data](IkarusToggleValue const * toggle_value) { toggle_visitor(toggle_value, data); },
|
[toggle_visitor, data](IkarusToggleValue const * toggle_value) { toggle_visitor(toggle_value, data); },
|
||||||
[number_visitor, data](IkarusNumberValue const * number_value) { number_visitor(number_value, data); },
|
[number_visitor, data](IkarusNumberValue const * number_value) { number_visitor(number_value, data); },
|
||||||
[text_visitor, data](IkarusTextValue const * text_value) { text_visitor(text_value, data); }
|
[text_visitor, data](IkarusTextValue const * text_value) { text_visitor(text_value, data); }
|
||||||
),
|
},
|
||||||
value->data
|
value->data
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,15 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <concepts>
|
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
|
|
||||||
#include <boost/bind/bind.hpp>
|
#include <cppbase/templates.hpp>
|
||||||
|
|
||||||
#include <boost/container/small_vector.hpp>
|
#include <boost/container/small_vector.hpp>
|
||||||
#include <boost/functional/overloaded_function.hpp>
|
|
||||||
|
|
||||||
template<typename V>
|
template<typename V>
|
||||||
typename V::data_type const * ikarus_value_base_get(V * value, size_t idx) {
|
typename V::DataType const * ikarus_value_base_get(V * value, size_t idx) {
|
||||||
if (auto * data =
|
if (auto * data =
|
||||||
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
boost::variant2::get_if<boost::container::small_vector<typename V::DataType, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
||||||
&value->data
|
&value->data
|
||||||
);
|
);
|
||||||
data != nullptr) {
|
data != nullptr) {
|
||||||
|
|
@ -23,7 +22,7 @@ typename V::data_type const * ikarus_value_base_get(V * value, size_t idx) {
|
||||||
template<typename V>
|
template<typename V>
|
||||||
size_t ikarus_value_base_get_size(V const * value) {
|
size_t ikarus_value_base_get_size(V const * value) {
|
||||||
if (auto * data =
|
if (auto * data =
|
||||||
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
boost::variant2::get_if<boost::container::small_vector<typename V::DataType, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
||||||
&value->data
|
&value->data
|
||||||
);
|
);
|
||||||
data != nullptr) {
|
data != nullptr) {
|
||||||
|
|
@ -34,9 +33,9 @@ size_t ikarus_value_base_get_size(V const * value) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename V>
|
template<typename V>
|
||||||
void ikarus_value_base_set(V * value, size_t idx, typename V::data_type new_data) {
|
void ikarus_value_base_set(V * value, size_t idx, typename V::DataType new_data) {
|
||||||
if (auto * data =
|
if (auto * data =
|
||||||
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
boost::variant2::get_if<boost::container::small_vector<typename V::DataType, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
||||||
&value->data
|
&value->data
|
||||||
);
|
);
|
||||||
data != nullptr) {
|
data != nullptr) {
|
||||||
|
|
@ -47,7 +46,7 @@ void ikarus_value_base_set(V * value, size_t idx, typename V::data_type new_data
|
||||||
template<typename V>
|
template<typename V>
|
||||||
void ikarus_value_base_remove(V * value, size_t idx) {
|
void ikarus_value_base_remove(V * value, size_t idx) {
|
||||||
if (auto * data =
|
if (auto * data =
|
||||||
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
boost::variant2::get_if<boost::container::small_vector<typename V::DataType, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
||||||
&value->data
|
&value->data
|
||||||
);
|
);
|
||||||
data != nullptr) {
|
data != nullptr) {
|
||||||
|
|
@ -56,9 +55,9 @@ void ikarus_value_base_remove(V * value, size_t idx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename V>
|
template<typename V>
|
||||||
void ikarus_value_base_insert(V * value, size_t idx, typename V::data_type new_data) {
|
void ikarus_value_base_insert(V * value, size_t idx, typename V::DataType new_data) {
|
||||||
if (auto * data =
|
if (auto * data =
|
||||||
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
boost::variant2::get_if<boost::container::small_vector<typename V::DataType, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
||||||
&value->data
|
&value->data
|
||||||
);
|
);
|
||||||
data != nullptr) {
|
data != nullptr) {
|
||||||
|
|
@ -69,7 +68,7 @@ void ikarus_value_base_insert(V * value, size_t idx, typename V::data_type new_d
|
||||||
template<typename V>
|
template<typename V>
|
||||||
void ikarus_value_base_clear(V * value) {
|
void ikarus_value_base_clear(V * value) {
|
||||||
if (auto * data =
|
if (auto * data =
|
||||||
boost::variant2::get_if<boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
boost::variant2::get_if<boost::container::small_vector<typename V::DataType, IkarusValue::SMALL_VEC_VALUE_SIZE>>(
|
||||||
&value->data
|
&value->data
|
||||||
);
|
);
|
||||||
data != nullptr) {
|
data != nullptr) {
|
||||||
|
|
@ -87,16 +86,16 @@ void ikarus_value_base_set_undefined(V * value, bool undefined) {
|
||||||
if (undefined) {
|
if (undefined) {
|
||||||
value->data = boost::variant2::monostate{};
|
value->data = boost::variant2::monostate{};
|
||||||
} else {
|
} else {
|
||||||
value->data = boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE>{};
|
value->data = boost::container::small_vector<typename V::DataType, IkarusValue::SMALL_VEC_VALUE_SIZE>{};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename V, std::invocable<typename V::data_type> F>
|
template<typename V, std::invocable<typename V::DataType> F>
|
||||||
char const * ikarus_value_base_to_string(V const * value, F transformer) {
|
char const * ikarus_value_base_to_string(V const * value, F transformer) {
|
||||||
return boost::variant2::visit(
|
return boost::variant2::visit(
|
||||||
boost::make_overloaded_function(
|
cppbase::overloaded {
|
||||||
[](boost::variant2::monostate const&) -> char const * { return nullptr; },
|
[](boost::variant2::monostate const&) -> char const * { return nullptr; },
|
||||||
[&transformer](boost::container::small_vector<typename V::data_type, IkarusValue::SMALL_VEC_VALUE_SIZE> const& data
|
[&transformer](auto const& data
|
||||||
) -> char const * {
|
) -> char const * {
|
||||||
auto buffer = fmt::memory_buffer{};
|
auto buffer = fmt::memory_buffer{};
|
||||||
|
|
||||||
|
|
@ -108,7 +107,7 @@ char const * ikarus_value_base_to_string(V const * value, F transformer) {
|
||||||
|
|
||||||
return buffer.data();
|
return buffer.data();
|
||||||
}
|
}
|
||||||
),
|
},
|
||||||
value->data
|
value->data
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue