#pragma once #include #include "convert.h" namespace refl { template inline bool Convert::ConvertTo(Any& to, const Any& from) { if constexpr (std::is_same_v) { if constexpr (std::is_same_v) { std::construct_at(to.CastTo(), from.CastTo()); return true; } return false; } else if constexpr (std::is_arithmetic_v) { if constexpr (std::is_arithmetic_v) { *to.CastTo() = (To)*from.CastTo(); return true; } return false; } return false; } inline ConvertMap Convert::BuildClassMap() { ConvertMap classMap; #define RegisterToFrom(To, From) classMap.emplace(std::make_pair(&TypeInfo::StaticClass, &TypeInfo::StaticClass), &Convert::ConvertTo);\ classMap.emplace(std::make_pair(&TypeInfo::StaticClass, &TypeInfo::StaticClass), &Convert::ConvertTo) 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; } inline bool Convert::Construct(Any& to,const Any& from) { if (to.Construct(from)) return true; auto it = ClassMap.find(std::make_pair(to.cls, from.cls)); if (it != ClassMap.end()) { return it->second(to, from); } return false; } }