#include "CConversionRegistry.h" #include "CAngle.h" #include "U_String.h" #include "U_General.h" #include "U_Angles.h" #include "U_Types.h" #include "sol/sol.hpp" template void ConvertFunc(CConversionRegistry& registry) //TODO unified conversion for vec, quat, mat, angles, color, colorint { if constexpr (std::is_same_v) { registry.registerConverter([](const From& value) -> To { return value; }); } else if constexpr (std::is_same_v && std::is_same_v) { registry.registerConverter([](const From& value) { return StringUtils::WstrToStr(value); }); } else if constexpr (std::is_same_v && std::is_same_v) { registry.registerConverter([](const From& value) { return StringUtils::StrToWstr(value); }); } else if constexpr (std::is_same_v || std::is_same_v) { registry.registerConverter([](const From& value) { //return StringUtils::StrToWstr(value); return StringUtils::ToStr(value); }); } else if constexpr (std::is_same_v || std::is_same_v) { registry.registerConverter([](const From& value) { return StringUtils::FromStr(value); }); } else if constexpr (IsSequentParseable()) { if constexpr (IsSequentParseable()) { registry.registerConverter([](const From& value) { To ret{}; for(size_t i = 0; i < To::length() && i < From::length(); i++) { ret[i] = value[i]; } return ret; }); } else if constexpr (!IsSequentParseable() && std::is_convertible_v) { registry.registerConverter([](const From& value) -> To { To ret{}; for(size_t i = 0; i < To::length(); i++) { ret[i] = value; } return ret; }); } else if constexpr (!IsSequentParseable() && std::is_same_v) { registry.registerConverter([](const From& value) -> To { To ret{}; for(size_t i = 0; i < To::length(); i++) { ret[i] = value.asRadians(); } return ret; }); } } else if constexpr (IsSequentParseable()) { if constexpr (IsSequentParseable()) { registry.registerConverter([](const From& value) { To ret{}; for(size_t i = 0; i < To::length() && i < From::length(); i++) { ret[i] = value[i]; } return ret; }); } else if constexpr (!IsSequentParseable() && std::is_convertible_v) { registry.registerConverter([](const From& value) -> To { return value[0]; }); } else if constexpr (!IsSequentParseable() && std::is_same_v) { registry.registerConverter([](const From& value) -> To { return CAngle::radians(value[0]); }); } } else if constexpr (std::is_same_v) { registry.registerConverter([](const From& value) -> To { return static_cast(value.asRadians()); }); } else if constexpr (std::is_same_v) { registry.registerConverter([](const From& value) -> To { return CAngle::radians(static_cast(value)); }); } else { if constexpr (std::is_convertible_v) { registry.registerConverter([](const From& value) -> To { return static_cast(value); }); } else { registry.registerConverter([](const From& value) -> To { return {}; }); } } //throw std::runtime_error("Unsupported conversion"); } template void RepeatedConversionInit(CConversionRegistry& registry) { ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); ConvertFunc(registry); } void CConversionRegistry::InitConversions(CConversionRegistry& registry) { RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); RepeatedConversionInit(registry); } #include "CEngine.h" #include "CCommandProcessor.h" #include "CLogger.h" template void PerformTest(const std::string& t1str) { T1 t1 = StringUtils::FromStr(t1str); std::wstringstream ss; ss << L"From " << StringUtils::StrToWstr(typeid(T1).name()) << L" to " << StringUtils::StrToWstr(typeid(T2).name()) << L" (" << StringUtils::ToStr(t1) << L") to ("; T2 val = CConversionRegistry::GetInstance()->convert(t1); ss << StringUtils::ToStr(val) << L")\n"; COMPONENT_CALL(CLogger, Out(ss.str())); } template void StartTest(const std::string& type2, const std::string& val) { if(type2 == "int8") { PerformTest(val); } else if(type2 == "bool") { PerformTest(val); } else if(type2 == "uint8") { PerformTest(val); } else if(type2 == "int16") { PerformTest(val); } else if(type2 == "uint16") { PerformTest(val); } else if(type2 == "int32") { PerformTest(val); } else if(type2 == "uint32") { PerformTest(val); } else if(type2 == "int64") { PerformTest(val); } else if(type2 == "uint64") { PerformTest(val); } else if(type2 == "float") { PerformTest(val); } else if(type2 == "double") { PerformTest(val); } else if(type2 == "angle") { PerformTest(val); } else if(type2 == "angles") { PerformTest(val); } else if(type2 == "quat") { PerformTest(val); } else if(type2 == "vec2") { PerformTest(val); } else if(type2 == "vec3") { PerformTest(val); } else if(type2 == "vec4") { PerformTest(val); } else if(type2 == "ivec2") { PerformTest(val); } else if(type2 == "ivec3") { PerformTest(val); } else if(type2 == "ivec4") { PerformTest(val); } else if(type2 == "string") { PerformTest(val); } else if(type2 == "wstring") { PerformTest(val); } else { COMPONENT_CALL(CLogger, Errln(L"Invalid second type")); } } void CConversionRegistry::SetTestCommand(const std::string& cmdname) const { auto proc = CEngine::GetInstance()->Components.GetComponentTyped(); proc->Commands.CreateCommand(cmdname, CCommand::CType::Server, CCommand::CmdRight::Client, []COMMAND_LAMBDA { if(args.size() < 3) { COMPONENT_CALL(CLogger, Errln(L"Not enough arguments")); return CMD_INC; } std::string type1; std::string type2; std::string val; type1 = StringUtils::WstrToStr(args[0]); type2 = StringUtils::WstrToStr(args[1]); val = StringUtils::WstrToStr(args[2]); if(type1 == "int8") { StartTest(type2, val); } else if(type1 == "bool") { StartTest(type2, val); } else if(type1 == "uint8") { StartTest(type2, val); } else if(type1 == "int16") { StartTest(type2, val); } else if(type1 == "uint16") { StartTest(type2, val); } else if(type1 == "int32") { StartTest(type2, val); } else if(type1 == "uint32") { StartTest(type2, val); } else if(type1 == "int64") { StartTest(type2, val); } else if(type1 == "uint64") { StartTest(type2, val); } else if(type1 == "float") { StartTest(type2, val); } else if(type1 == "double") { StartTest(type2, val); } else if(type1 == "angle") { StartTest(type2, val); } else if(type1 == "angles") { StartTest(type2, val); } else if(type1 == "quat") { StartTest(type2, val); } else if(type1 == "vec2") { StartTest(type2, val); } else if(type1 == "vec3") { StartTest(type2, val); } else if(type1 == "vec4") { StartTest(type2, val); } else if(type1 == "ivec2") { StartTest(type2, val); } else if(type1 == "ivec3") { StartTest(type2, val); } else if(type1 == "ivec4") { StartTest(type2, val); } else if(type1 == "string") { StartTest(type2, val); } else if(type1 == "wstring") { StartTest(type2, val); } else { COMPONENT_CALL(CLogger, Errln(L"Invalid first type")); return CMD_INC; } return CMD_OK; }); }