[ox/model] Add type name and version functions overload option
This commit is contained in:
parent
838187797a
commit
17cb40c0ec
4
deps/ox/src/ox/model/test/CMakeLists.txt
vendored
4
deps/ox/src/ox/model/test/CMakeLists.txt
vendored
@ -8,4 +8,6 @@ target_link_libraries(
|
||||
OxModel
|
||||
)
|
||||
|
||||
add_test("[ox/model] ModelTest Writer" ModelTest ModelValue)
|
||||
add_test("[ox/model] ModelTest ModelValue" ModelTest ModelValue)
|
||||
add_test("[ox/model] ModelTest getModelTypeName" ModelTest getModelTypeName)
|
||||
add_test("[ox/model] ModelTest getModelTypeVersion" ModelTest getModelTypeVersion)
|
||||
|
38
deps/ox/src/ox/model/test/tests.cpp
vendored
38
deps/ox/src/ox/model/test/tests.cpp
vendored
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2015 - 2022 gary@drinkingtea.net
|
||||
* Copyright 2015 - 2023 gary@drinkingtea.net
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
@ -12,6 +12,26 @@
|
||||
#include <ox/model/model.hpp>
|
||||
#include <ox/std/std.hpp>
|
||||
|
||||
struct TestType {
|
||||
static constexpr auto TypeName = "net.drinkingtea.model.test.TestType";
|
||||
static constexpr auto TypeVersion = 1;
|
||||
};
|
||||
|
||||
oxModelBegin(TestType)
|
||||
oxModelEnd()
|
||||
|
||||
struct TestType2 {
|
||||
};
|
||||
|
||||
template<typename Str = ox::StringView>
|
||||
constexpr auto getModelTypeName(TestType2*) noexcept {
|
||||
return "net.drinkingtea.model.test.TestType2";
|
||||
}
|
||||
|
||||
constexpr auto getModelTypeVersion(TestType2*) noexcept {
|
||||
return 2;
|
||||
}
|
||||
|
||||
std::map<ox::String, ox::Error(*)()> tests = {
|
||||
{
|
||||
{
|
||||
@ -27,6 +47,22 @@ std::map<ox::String, ox::Error(*)()> tests = {
|
||||
return ox::Error{};
|
||||
}
|
||||
},
|
||||
{
|
||||
"getModelTypeName",
|
||||
[] {
|
||||
oxAssert(ox::getModelTypeName<TestType>() == TestType::TypeName, "getModelTypeName call failed");
|
||||
oxAssert(ox::getModelTypeName<TestType2>() == ox::StringView("net.drinkingtea.model.test.TestType2"), "getModelTypeName call failed");
|
||||
return ox::Error{};
|
||||
}
|
||||
},
|
||||
{
|
||||
"getModelTypeVersion",
|
||||
[] {
|
||||
oxAssert(ox::getModelTypeVersion<TestType>() == TestType::TypeVersion, "getModelTypeVersion call failed");
|
||||
oxAssert(ox::getModelTypeVersion<TestType2>() == 2, "getModelTypeVersion call failed");
|
||||
return ox::Error{};
|
||||
}
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
|
38
deps/ox/src/ox/model/typenamecatcher.hpp
vendored
38
deps/ox/src/ox/model/typenamecatcher.hpp
vendored
@ -85,16 +85,6 @@ struct TypeInfoCatcher {
|
||||
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
constexpr int getModelTypeVersion() noexcept {
|
||||
std::allocator<T> a;
|
||||
auto t = a.allocate(1);
|
||||
TypeInfoCatcher nc;
|
||||
oxIgnoreError(model(&nc, t));
|
||||
a.deallocate(t, 1);
|
||||
return nc.version;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
constexpr int getModelTypeVersion(T *val) noexcept {
|
||||
TypeInfoCatcher nc;
|
||||
@ -102,6 +92,15 @@ constexpr int getModelTypeVersion(T *val) noexcept {
|
||||
return nc.version;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
constexpr int getModelTypeVersion() noexcept {
|
||||
std::allocator<T> a;
|
||||
const auto t = a.allocate(1);
|
||||
const auto out = getModelTypeVersion(t);
|
||||
a.deallocate(t, 1);
|
||||
return out;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
consteval int requireModelTypeVersion() noexcept {
|
||||
constexpr auto version = getModelTypeVersion<T>();
|
||||
@ -109,16 +108,6 @@ consteval int requireModelTypeVersion() noexcept {
|
||||
return version;
|
||||
}
|
||||
|
||||
template<typename T, typename Str = const char*>
|
||||
constexpr Str getModelTypeName() noexcept {
|
||||
std::allocator<T> a;
|
||||
auto t = a.allocate(1);
|
||||
TypeNameCatcher nc;
|
||||
oxIgnoreError(model(&nc, t));
|
||||
a.deallocate(t, 1);
|
||||
return nc.name;
|
||||
}
|
||||
|
||||
template<typename T, typename Str = const char*>
|
||||
constexpr Str getModelTypeName(T *val) noexcept {
|
||||
TypeNameCatcher nc;
|
||||
@ -126,6 +115,15 @@ constexpr Str getModelTypeName(T *val) noexcept {
|
||||
return nc.name;
|
||||
}
|
||||
|
||||
template<typename T, typename Str = const char*>
|
||||
constexpr Str getModelTypeName() noexcept {
|
||||
std::allocator<T> a;
|
||||
auto t = a.allocate(1);
|
||||
auto out = getModelTypeName(t);
|
||||
a.deallocate(t, 1);
|
||||
return out;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
consteval auto requireModelTypeName() noexcept {
|
||||
constexpr auto name = getModelTypeName<T>();
|
||||
|
Loading…
Reference in New Issue
Block a user