LiteLoaderBDS-1.16.40/LiteLoader/Kernel/DB/Any.cpp
2022-09-21 19:47:03 +08:00

234 lines
5.2 KiB
C++

#include <DB/Any.h>
namespace DB {
Any::Any() {
type = Type::Null;
value.boolean = false;
}
Any::Any(bool v) {
type = Type::Boolean;
value.boolean = v;
}
Any::Any(int64_t v) {
type = Type::Integer;
value.integer = v;
}
Any::Any(uint64_t v) {
type = Type::UInteger;
value.uinteger = v;
}
Any::Any(double v) {
type = Type::Floating;
value.floating = v;
}
Any::Any(const std::string& v) {
type = Type::String;
value.string = new std::string(v);
}
Any::Any(const char* v) {
type = Type::String;
value.string = new std::string(v);
}
Any::Any(char* v, size_t len) {
type = Type::String;
value.string = new std::string(v, len);
}
Any::Any(const Date& v) {
type = Type::Date;
value.date = new Date(v);
}
Any::Any(const Time& v) {
type = Type::Time;
value.time = new Time(v);
}
Any::Any(const DateTime& v) {
type = Type::DateTime;
value.datetime = new DateTime(v);
}
Any::Any(char v) {
type = Type::Integer;
value.integer = v;
}
Any::Any(unsigned char v) {
type = Type::UInteger;
value.uinteger = v;
}
Any::Any(short v) {
type = Type::Integer;
value.integer = v;
}
Any::Any(unsigned short v) {
type = Type::UInteger;
value.uinteger = v;
}
Any::Any(int v) {
type = Type::Integer;
value.integer = v;
}
Any::Any(unsigned int v) {
type = Type::UInteger;
value.uinteger = v;
}
Any::Any(long v) {
type = Type::Integer;
value.integer = v;
}
Any::Any(unsigned long v) {
type = Type::UInteger;
value.uinteger = v;
}
Any::Any(float v) {
type = Type::Floating;
value.floating = v;
}
Any::Any(const ByteArray& v) {
type = Type::Blob;
value.blob = new ByteArray(v);
}
Any::Any(const Any& v) {
*this = v;
}
Any& Any::operator=(const Any& v) {
if (this == &v)
return *this;
type = v.type;
value = v.value;
switch (type) {
case Type::String:
value.string = new std::string(*v.value.string);
break;
case Type::Date:
value.date = new Date(*v.value.date);
break;
case Type::Time:
value.time = new Time(*v.value.time);
break;
case Type::DateTime:
value.datetime = new DateTime(*v.value.datetime);
break;
case Type::Blob:
value.blob = new ByteArray(*v.value.blob);
break;
}
return *this;
}
Any::~Any() {
if (type == Type::String) {
delete value.string;
value.string = nullptr;
} else if (type == Type::Date) {
delete value.date;
value.date = nullptr;
} else if (type == Type::Time) {
delete value.time;
value.time = nullptr;
} else if (type == Type::DateTime) {
delete value.datetime;
value.datetime = nullptr;
} else if (type == Type::Blob) {
delete value.blob;
value.blob = nullptr;
}
}
bool Any::is_null() const {
return type == Type::Null;
}
bool Any::is_boolean() const {
return type == Type::Boolean;
}
bool Any::is_integer() const {
return type == Type::Integer || type == Type::UInteger;
}
bool Any::is_uinteger() const {
return type == Type::UInteger;
}
bool Any::is_floating() const {
return type == Type::Floating;
}
bool Any::is_string() const {
return type == Type::String;
}
bool Any::is_date() const {
return type == Type::Date;
}
bool Any::is_time() const {
return type == Type::Time;
}
bool Any::is_datetime() const {
return type == Type::DateTime;
}
bool Any::is_number() const {
return type == Type::Integer || type == Type::UInteger || type == Type::Floating;
}
bool Any::is_blob() const {
return type == Type::Blob;
}
std::string Any::type2str(Any::Type type) {
switch (type) {
case Type::Null:
return "null";
case Type::Boolean:
return "boolean";
case Type::Integer:
return "integer";
case Type::UInteger:
return "uinteger";
case Type::Floating:
return "floating";
case Type::String:
return "string";
case Type::Date:
return "date";
case Type::Time:
return "time";
case Type::DateTime:
return "datetime";
case Type::Blob:
return "blob";
default:
return "unknown";
}
}
Any Any::str2any(const std::string& str) {
if (str.empty())
return Any();
bool isInteger = true;
bool isFloating = false;
bool first = true;
for (auto& ch : str) {
if (first && ch == '-') {
first = false;
continue;
}
if (ch >= '0' && ch <= '9')
continue;
if (ch == '.') {
if (isFloating)
isFloating = false;
else {
isInteger = false;
isFloating = true;
}
continue;
}
}
if (isFloating)
return Any(std::stod(str));
else if (isInteger) {
auto floating = std::stod(str);
if (floating > ULLONG_MAX || floating < LLONG_MIN)
return Any(floating);
else if (floating > LLONG_MAX)
return Any(std::stoull(str));
return Any(std::stoll(str));
} else
return Any(str);
}
} // namespace DB