zengine-old/engine/3rdparty/zlib/include/refl/detail/convert.inl

49 lines
1.4 KiB
Plaintext
Raw Normal View History

2024-04-25 21:45:41 +08:00
#pragma once
#include <string>
#include "convert.h"
namespace refl {
2024-06-25 20:26:46 +08:00
template <typename To, typename From>
inline bool Convert::ConvertTo(Any& to, const Any& from) {
if constexpr (std::is_same_v<To, std::string>) {
if constexpr (std::is_same_v<From, char>) {
std::construct_at(to.CastTo<To*>(), from.CastTo<From*>());
return true;
}
return false;
2024-04-25 21:45:41 +08:00
}
2024-06-25 20:26:46 +08:00
else if constexpr (std::is_arithmetic_v<To>) {
if constexpr (std::is_arithmetic_v<From>) {
*to.CastTo<To*>() = (To)*from.CastTo<From*>();
return true;
}
return false;
2024-06-14 22:24:52 +08:00
}
return false;
}
2024-06-25 20:26:46 +08:00
inline ConvertMap Convert::BuildClassMap()
2024-06-14 22:24:52 +08:00
{
2024-06-25 20:26:46 +08:00
ConvertMap classMap;
#define RegisterToFrom(To, From) classMap.emplace(std::make_pair(&TypeInfo<To>::StaticClass, &TypeInfo<From>::StaticClass), &Convert::ConvertTo<To, From>);\
classMap.emplace(std::make_pair(&TypeInfo<From>::StaticClass, &TypeInfo<To>::StaticClass), &Convert::ConvertTo<From, To>)
RegisterToFrom(int, uint32_t);
RegisterToFrom(int, uint16_t);
RegisterToFrom(int, float);
RegisterToFrom(int, double);
RegisterToFrom(float, uint32_t);
RegisterToFrom(float, double);
RegisterToFrom(std::string, char);
#undef RegisterToFrom
return classMap;
2024-06-14 22:24:52 +08:00
}
2024-06-25 20:26:46 +08:00
inline bool Convert::Construct(Any& to,const Any& from)
2024-04-25 21:45:41 +08:00
{
2024-06-25 20:26:46 +08:00
if (to.Construct(from))
2024-04-25 21:45:41 +08:00
return true;
2024-06-25 20:26:46 +08:00
auto it = ClassMap.find(std::make_pair(to.cls, from.cls));
if (it != ClassMap.end()) {
return it->second(to, from);
2024-04-25 21:45:41 +08:00
}
2024-06-25 20:26:46 +08:00
return false;
2024-04-25 21:45:41 +08:00
}
}