Files
BH-Python-Interpreter-2023/src/utils.cpp
2023-11-09 10:59:39 +08:00

96 lines
3.1 KiB
C++

#include "utils.h"
inline ZYM::int2048 Any2Int(const std::any &value) {
if (auto ptr = std::any_cast<ZYM::int2048>(&value))
return *ptr;
else if (auto ptr = std::any_cast<int>(&value))
return std::move(ZYM::int2048(*ptr));
else if (auto ptr = std::any_cast<double>(&value)) {
std::stringstream buf;
buf << std::fixed << std::setprecision(0) << *ptr;
std::string tmp;
buf >> tmp;
return std::move(ZYM::int2048(tmp));
} else if (auto ptr = std::any_cast<bool>(&value))
return std::move(ZYM::int2048((long long)(*ptr)));
else if (auto ptr = std::any_cast<std::string>(&value)) {
std::string str = *ptr;
size_t dot_position = str.find('.');
if (dot_position != std::string::npos) {
std::string integer_part = str.substr(0, dot_position);
str = integer_part;
}
return std::move(ZYM::int2048(str));
} else
throw FatalError("Any2Int2048: unknown type");
}
double Any2Float(const std::any &value) {
if (auto ptr = std::any_cast<double>(&value))
return *ptr;
else if (auto ptr = std::any_cast<ZYM::int2048>(&value)) {
double res = 0;
std::stringstream buf;
buf << *ptr;
std::string tmp;
buf >> tmp;
int p = 0;
if (tmp[0] == '-') p++;
for (; p < tmp.size(); p++) res = res * 10 + tmp[p] - '0';
if (tmp[0] == '-') res = -res;
return res;
} else if (auto ptr = std::any_cast<bool>(&value))
return (double)(*ptr);
else if (auto ptr = std::any_cast<std::string>(&value))
return std::stod(*ptr);
else
throw FatalError("Any2Float: unknown type");
}
std::string Any2String(const std::any &value) {
std::stringstream buf;
std::string res;
if (auto ptr = std::any_cast<double>(&value)) {
buf << std::setiosflags(std::ios::fixed) << std::setprecision(15) << *ptr;
} else if (auto ptr = std::any_cast<bool>(&value)) {
if (*ptr)
buf << "True";
else
buf << "False";
} else if (auto ptr = std::any_cast<ZYM::int2048>(&value))
buf << *ptr;
else if (auto ptr = std::any_cast<std::string>(&value))
buf << *ptr;
else
throw FatalError("Any2String: unknown type");
buf >> res;
return res;
}
bool Any2Bool(const std::any &value) {
if (auto ptr = std::any_cast<ZYM::int2048>(&value)) {
return (*ptr) != 0;
} else if (auto ptr = std::any_cast<double>(&value)) {
return (*ptr) != 0;
} else if (auto ptr = std::any_cast<bool>(&value)) {
return *ptr;
} else if (auto ptr = std::any_cast<std::string>(&value)) {
return (*ptr) != "";
} else
throw FatalError("Any2Bool: unknown type");
}
std::any DeQuate(std::any val, VariableContainer &Variables) {
if (auto ptr = std::any_cast<std::vector<std::any>>(&val)) {
for (int i = 0; i < ptr->size(); i++)
(*ptr)[i] = DeQuate((*ptr)[i], Variables);
return *ptr;
} else if (auto ptr = std::any_cast<RawVarible>(&val)) {
return Variables.ReadVariable(ptr->name);
} else if (std::any_cast<double>(&val) || std::any_cast<ZYM::int2048>(&val) ||
std::any_cast<bool>(&val) || std::any_cast<std::string>(&val) ||
std::any_cast<NoneType>(&val))
return val;
else
throw FatalError("DeQuate: unknown type");
}