13 Star 69 Fork 22

johnsonyl/cpps

Create your Gitee Account
Explore and code with more than 14 million developers,Free private repositories !:)
Sign up
文件
Clone or Download
cpps_value.cpp 18.44 KB
Copy Edit Raw Blame History
johnsonyl authored 2023-12-04 16:55 +08:00 . 增加一些常用接口
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
#include "cpps/cpps.h"
namespace cpps
{
object doclassfunction(C* c, object domain, object func);
bool cpps_to_bool(const cpps_value& src)
{
const cpps_value& obj = src.real();
bool ret = 0;
if (obj.tt == CPPS_TNUMBER)
{
ret = obj.value.number;
}
if (obj.tt == CPPS_TBOOLEAN)
{
ret = obj.value.b;
}
else if (obj.tt == CPPS_TINTEGER)
{
ret = obj.value.integer;
}
else if (obj.tt == CPPS_TUINTEGER)
{
ret = obj.value.uinteger;
}
else if (obj.tt == CPPS_TSTRING)
{
std::string* tmpStr = cpps_get_string(obj);
ret = tmpStr->size();
}
else {
ret = obj.tt != CPPS_TNIL;
}
return ret;
}
cpps_number cpps_to_number(const cpps_value& src)
{
const cpps_value& obj = src.real();
cpps_number ret = 0;
if (obj.tt == CPPS_TNUMBER)
{
ret = obj.value.number;
}
else if (obj.tt == CPPS_TINTEGER)
{
ret = cpps_integer2number(obj.value.integer);
}
else if (obj.tt == CPPS_TUINTEGER)
{
ret = cpps_integer2number(obj.value.uinteger);
}
else if (obj.tt == CPPS_TSTRING)
{
std::string* tmpStr = cpps_get_string(obj);
cpps_str2d(tmpStr->c_str(), &ret);
}
return ret;
}
cpps_integer cpps_to_integer(const cpps_value& src)
{
const cpps_value& obj = src.real();
cpps_integer ret = 0;
if (obj.tt == CPPS_TNUMBER)
{
ret = cpps_number2integer(obj.value.number);
}
else if (obj.tt == CPPS_TINTEGER)
{
ret = obj.value.integer;
}
else if (obj.tt == CPPS_TUINTEGER)
{
ret = obj.value.integer;
}
else if (obj.tt == CPPS_TSTRING)
{
std::string* tmpStr = cpps_get_string(obj);
cpps_str2i64(tmpStr->c_str(), &ret);
}
return ret;
}
cpps_uinteger cpps_to_uinteger(const cpps_value& src)
{
const cpps_value& obj = src.real();
cpps_uinteger ret = 0;
if (obj.tt == CPPS_TUINTEGER)
ret = obj.value.uinteger;
else
ret = (cpps_uinteger)cpps_to_integer(src);
return ret;
}
std::string* cpps_get_string(const cpps_value& src)
{
const cpps_value& obj = src.real();
if (obj.tt == CPPS_TSTRING)
{
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)obj.value.domain;
cpps::string* tmpStr = (cpps::string*)cppsclassvar->getclsptr();
return &tmpStr->__str;
}
return NULL;
}
std::string cpps_to_string(const cpps_value& src)
{
const cpps_value& obj = src.real();
if (obj.tt == CPPS_TNUMBER)
{
return std::to_string( obj.value.number);
}
else if (obj.tt == CPPS_TINTEGER)
{
return std::to_string(obj.value.integer);
}
else if (obj.tt == CPPS_TUINTEGER)
{
return std::to_string(obj.value.uinteger);
}
else if (obj.tt == CPPS_TSTRING)
{
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)obj.value.domain;
cpps::string* tmpStr = (cpps::string*)cppsclassvar->getclsptr();
return tmpStr->__str;
}
else if (obj.tt == CPPS_TBOOLEAN)
{
return (obj.value.b == 0 ? "false" : "true");
}
return "";
}
cpps_vector* cpps_to_cpps_vector(const cpps_value& src)
{
const cpps_value& obj = src.real();
if (!obj.isdomain()) return NULL;
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)obj.value.domain;
cpps_vector* ret = (cpps_vector*)cppsclassvar->getclsptr();
return ret;
}
cpps_map* cpps_to_cpps_map(const cpps_value& src)
{
const cpps_value& obj = src.real();
if (!obj.isdomain()) return NULL;
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)obj.value.domain;
cpps_map* ret = (cpps_map*)cppsclassvar->getclsptr();
return ret;
}
cpps_set* cpps_to_cpps_set(const cpps_value& src)
{
const cpps_value& obj = src.real();
if (!obj.isdomain()) return NULL;
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)obj.value.domain;
cpps_set* ret = (cpps_set*)cppsclassvar->getclsptr();
return ret;
}
cpps::cpps_pair* cpps_to_cpps_pair(const cpps_value& src)
{
const cpps_value& obj = src.real();
if (!obj.isdomain()) return NULL;
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)obj.value.domain;
cpps_pair* ret = (cpps_pair*)cppsclassvar->getclsptr();
return ret;
}
cpps::cpps_domain* cpps_to_domain(const cpps_value& src)
{
const cpps_value& obj = src.real();
if (!obj.isdomain()) return NULL;
return obj.value.domain;
}
cpps_cppsclass* cpps_to_cpps_cppsclass(const cpps_value& src)
{
const cpps_value& obj = src.real();
if (!obj.isdomain()) return NULL;
cpps_cppsclass* cppsclassvar = (cpps_cppsclass*)obj.value.domain;
return cppsclassvar;
}
cpps::cpps_cppsclassvar* cpps_to_cpps_cppsclassvar(const cpps_value& src)
{
const cpps_value& obj = src.real();
if (!obj.isdomain()) return NULL;
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)obj.value.domain;
return cppsclassvar;
}
bool cpps_value::operator<(const cpps_value& right) const
{
if (tt == right.tt)
{
switch (tt)
{
case CPPS_TNUMBER: return value.number < right.value.number;
case CPPS_TINTEGER: return value.integer < right.value.integer;
case CPPS_TUINTEGER: return value.uinteger < right.value.uinteger;
case CPPS_TSTRING: {
std::string* tmpStr = cpps_get_string(*this);
std::string* tmpStr2 = cpps_get_string(right);
return (*(tmpStr)) < (*(tmpStr2));
}
case CPPS_TFUNCTION:
case CPPS_TLAMBDAFUNCTION:
{
return value.uinteger < right.value.uinteger;
}
case CPPS_TCLASSVAR: {
object left = object(*this);
cpps_cppsclassvar* cppsclassvar = cpps_to_cpps_cppsclassvar(*this);
cpps_cppsclass* cppsclass = cppsclassvar->getcppsclass();
C* c = cppsclass->getDefaultCState();
cpps_function* func = cppsclass->getoperator("<");
if (func) {
object right_object = object(right);
cpps_cppsclassvar* right_cppsclassvar = cpps_to_cpps_cppsclassvar(right);
cpps_cppsclass* right_cppsclass = right_cppsclassvar->getcppsclass();
if (right_cppsclass != cppsclass) return cppsclass < right_cppsclass;
object symbolfunc = cpps_value(func);
cpps::cpps_value ret;
if (func->getIsNeedC()) {
ret = doclassfunction(c, left, symbolfunc, cpps::object::create(c, c), right).getval();
}
else {
ret = doclassfunction(c, left, symbolfunc, right).getval();
}
return cpps_to_bool(ret);
}
}
default:
throw(cpps_error("unknow file", 0, 0, "< ... It can't be used as a key.type: %d", right.tt));
}
}
return tt < right.tt;
}
bool cpps_value::operator>(const cpps_value &right) const
{
if (tt == right.tt)
{
switch (tt)
{
case CPPS_TNUMBER: return value.number > right.value.number;
case CPPS_TINTEGER: return value.integer > right.value.integer;
case CPPS_TUINTEGER: return value.uinteger > right.value.uinteger;
case CPPS_TSTRING: {
std::string* tmpStr = cpps_get_string(*this);
std::string* tmpStr2 = cpps_get_string(right);
return (*(tmpStr)) > (*(tmpStr2));
}
case CPPS_TFUNCTION:
case CPPS_TLAMBDAFUNCTION:
{
return value.uinteger > right.value.uinteger;
}
case CPPS_TCLASSVAR: {
object left = object(*this);
cpps_cppsclassvar* cppsclassvar = cpps_to_cpps_cppsclassvar(*this);
cpps_cppsclass* cppsclass = cppsclassvar->getcppsclass();
C* c = cppsclass->getDefaultCState();
cpps_function* func = cppsclass->getoperator(">");
if (func) {
object right_object = object(right);
cpps_cppsclassvar* right_cppsclassvar = cpps_to_cpps_cppsclassvar(right);
cpps_cppsclass* right_cppsclass = right_cppsclassvar->getcppsclass();
if (right_cppsclass != cppsclass) return cppsclass > right_cppsclass;
object symbolfunc = cpps_value(func);
cpps::cpps_value ret;
if (func->getIsNeedC()) {
ret = doclassfunction(c, left, symbolfunc, cpps::object::create(c, c), right).getval();
}
else {
ret = doclassfunction(c, left, symbolfunc, right).getval();
}
return cpps_to_bool(ret);
}
}
default:
throw(cpps_error("unknow file", 0, 0, "> ... It can't be used as a key. type: %d", right.tt));
}
}
return tt > right.tt;
}
bool cpps_value::operator==(const cpps_value &right) const
{
if (tt == right.tt)
{
switch (tt)
{
case CPPS_TNUMBER: return value.number == right.value.number;
case CPPS_TINTEGER: return value.integer == right.value.integer;
case CPPS_TUINTEGER: return value.uinteger == right.value.uinteger;
case CPPS_TSTRING: {
std::string* tmpStr = cpps_get_string(*this);
std::string* tmpStr2 = cpps_get_string(right);
return (*(tmpStr)) == (*(tmpStr2));
}
case CPPS_TFUNCTION:
case CPPS_TLAMBDAFUNCTION:
{
return value.uinteger == right.value.uinteger;
}
case CPPS_TCLASSVAR: {
object left = object(*this);
cpps_cppsclassvar* cppsclassvar = cpps_to_cpps_cppsclassvar(*this);
cpps_cppsclass* cppsclass = cppsclassvar->getcppsclass();
C* c = cppsclass->getDefaultCState();
cpps_function* func = cppsclass->getoperator("==");
if (func) {
object right_object = object(right);
cpps_cppsclassvar* right_cppsclassvar = cpps_to_cpps_cppsclassvar(right);
cpps_cppsclass* right_cppsclass = right_cppsclassvar->getcppsclass();
if (right_cppsclass != cppsclass) return cppsclass == right_cppsclass;
if (right_cppsclassvar == cppsclassvar) return true; //ͬһָ
object symbolfunc = cpps_value(func);
cpps::cpps_value ret;
if (func->getIsNeedC()) {
ret = doclassfunction(c, left, symbolfunc, cpps::object::create(c, c), right).getval();
}
else {
ret = doclassfunction(c, left, symbolfunc, right).getval();
}
return cpps_to_bool(ret);
}
}
default:
throw(cpps_error("unknow file", 0, 0, "== ... It can't be used as a key. type: %d", right.tt));
}
}
return false;
}
void cpps_value::_initstring(C* c, const char* s) {
std::string* str = NULL;
newclass<std::string>(c, &str, this);
str->append(s);
}
void cpps_value::_initstring(C* c, const std::string& s) {
std::string* str = NULL;
newclass<std::string>(c, &str, this);
str->append(s);
}
cpps_value::cpps_value(C* c, const char* s)
{
_initstring(c, s);
}
cpps_value::cpps_value(C* c, const std::string& s)
{
_initstring(c, s);
}
cpps_value::cpps_value(C* c, const std::string&& s)
{
_initstring(c, s);
}
cpps_value::cpps_value(cpps_value* v)
{
tt = CPPS_TREF;
value.value = v;
}
cpps_value::cpps_value(cpps_cppsclassvar* d)
{
tt = CPPS_TCLASSVAR;
value.domain = (cpps_domain*)(d);
incruse();
}
cpps_value::cpps_value(cpps_cppsclass* d)
{
tt = CPPS_TCLASS;
value.domain = (cpps_domain*)(d);
}
cpps_value::cpps_value(cpps_domain* d)
{
tt = CPPS_TDOMAIN;
value.domain = d;
}
cpps_value::cpps_value(cpps_function* f)
{
tt = CPPS_TFUNCTION;
value.func = f;
}
cpps_value::cpps_value(const bool b)
{
tt = CPPS_TBOOLEAN;
value.b = b;
}
cpps_value::cpps_value(const cpps_integer i)
{
tt = CPPS_TINTEGER;
value.integer = i;
}
cpps_value::cpps_value(const cpps_number n)
{
tt = CPPS_TNUMBER;
value.number = n;
}
cpps_value::cpps_value()
{
tt = CPPS_TNIL;
value.integer = 0;
}
cpps_value::cpps_value(const cpps_value& v)
{
tt = v.tt;
value = v.value;
incruse();
}
#ifdef _WIN32
cpps_value::cpps_value(const unsigned __int64 i)
{
tt = CPPS_TUINTEGER;
value.uinteger = i;
}
#else
cpps_value::cpps_value(const long unsigned int i)
{
tt = CPPS_TUINTEGER;
value.uinteger = i;
}
#endif
cpps_value::cpps_value(char& strv)
{
tt = CPPS_TSTRINGV;
value.strv = &strv;
}
cpps_value::~cpps_value()
{
decruse();
tt = CPPS_TNIL;
value.integer = 0;
}
bool cpps_value::operator<=(const cpps_value right) const
{
if (tt == right.tt)
{
switch (tt)
{
case CPPS_TNUMBER: return value.number <= right.value.number;
case CPPS_TINTEGER: return value.integer <= right.value.integer;
case CPPS_TUINTEGER: return value.uinteger <= right.value.uinteger;
case CPPS_TSTRING: {
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)value.domain;
std::string* tmpStr = (std::string*)cppsclassvar->getclsptr();
cpps_cppsclassvar* cppsclassvar2 = (cpps_cppsclassvar*)right.value.domain;
std::string* tmpStr2 = (std::string*)cppsclassvar2->getclsptr();
return (*(tmpStr)) <= (*(tmpStr2));
}
case CPPS_TFUNCTION:
case CPPS_TLAMBDAFUNCTION:
{
return value.uinteger <= right.value.uinteger;
}
case CPPS_TCLASSVAR: {
object left = object(*this);
cpps_cppsclassvar* cppsclassvar = cpps_to_cpps_cppsclassvar(*this);
cpps_cppsclass* cppsclass = cppsclassvar->getcppsclass();
C* c = cppsclass->getDefaultCState();
cpps_function* func = cppsclass->getoperator("<=");
if (func) {
object right_object = object(right);
cpps_cppsclassvar* right_cppsclassvar = cpps_to_cpps_cppsclassvar(right);
cpps_cppsclass* right_cppsclass = right_cppsclassvar->getcppsclass();
if (right_cppsclass != cppsclass) return cppsclass <= right_cppsclass;
object symbolfunc = cpps_value(func);
cpps::cpps_value ret;
if (func->getIsNeedC()) {
ret = doclassfunction(c, left, symbolfunc, cpps::object::create(c, c), right).getval();
}
else {
ret = doclassfunction(c, left, symbolfunc, right).getval();
}
return cpps_to_bool(ret);
}
}
default:
throw(cpps_error("unknow file", 0, 0, "<= ... It can't be used as a key.type: %d", right.tt));
}
}
return tt <= right.tt;
}
cpps::cpps_value& cpps_value::operator=(const cpps_value& v)
{
// Ըֵ
assert(this != &v);
v.incruse();
decruse();
tt = v.tt;
value = v.value;
return *this;
}
bool cpps_value::operator>=(const cpps_value right) const
{
if (tt == right.tt)
{
switch (tt)
{
case CPPS_TNUMBER: return value.number >= right.value.number;
case CPPS_TINTEGER: return value.integer >= right.value.integer;
case CPPS_TUINTEGER: return value.uinteger >= right.value.uinteger;
case CPPS_TSTRING: {
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)value.domain;
std::string* tmpStr = (std::string*)cppsclassvar->getclsptr();
cpps_cppsclassvar* cppsclassvar2 = (cpps_cppsclassvar*)right.value.domain;
std::string* tmpStr2 = (std::string*)cppsclassvar2->getclsptr();
return (*(tmpStr)) >= (*(tmpStr2));
}
case CPPS_TFUNCTION:
case CPPS_TLAMBDAFUNCTION:
{
return value.uinteger >= right.value.uinteger;
}
case CPPS_TCLASSVAR: {
object left = object(*this);
cpps_cppsclassvar* cppsclassvar = cpps_to_cpps_cppsclassvar(*this);
cpps_cppsclass* cppsclass = cppsclassvar->getcppsclass();
C* c = cppsclass->getDefaultCState();
cpps_function* func = cppsclass->getoperator(">=");
if (func) {
object right_object = object(right);
cpps_cppsclassvar* right_cppsclassvar = cpps_to_cpps_cppsclassvar(right);
cpps_cppsclass* right_cppsclass = right_cppsclassvar->getcppsclass();
if (right_cppsclass != cppsclass) return cppsclass >= right_cppsclass;
object symbolfunc = cpps_value(func);
cpps::cpps_value ret;
if (func->getIsNeedC()) {
ret = doclassfunction(c, left, symbolfunc, cpps::object::create(c, c), right).getval();
}
else {
ret = doclassfunction(c, left, symbolfunc, right).getval();
}
return cpps_to_bool(ret);
}
}
default:
throw(cpps_error("unknow file", 0, 0, ">= ... It can't be used as a key.type: %d", right.tt));
}
}
return tt >= right.tt;
}
void cpps_value::decruse()
{
if (tt == CPPS_TINTEGER) return;
if (tt == CPPS_TUINTEGER) return;
if (tt == CPPS_TNIL) return;
if (tt == CPPS_TCLASSVAR || tt == CPPS_TSTRING || tt == CPPS_TLAMBDAFUNCTION || tt == CPPS_TTUPLE)
value.domain->decruse();
}
void cpps_value::decruse() const
{
if (tt == CPPS_TINTEGER) return;
if (tt == CPPS_TUINTEGER) return;
if (tt == CPPS_TNIL) return;
if (tt == CPPS_TCLASSVAR || tt == CPPS_TSTRING || tt == CPPS_TLAMBDAFUNCTION || tt == CPPS_TTUPLE)
value.domain->decruse();
}
void cpps_value::incruse()
{
if (tt == CPPS_TINTEGER) return;
if (tt == CPPS_TUINTEGER) return;
if (tt == CPPS_TNIL) return;
if (tt == CPPS_TCLASSVAR || tt == CPPS_TSTRING || tt == CPPS_TLAMBDAFUNCTION || tt == CPPS_TTUPLE)
value.domain->incruse();
}
void cpps_value::incruse()const
{
if (tt == CPPS_TINTEGER) return;
if (tt == CPPS_TUINTEGER) return;
if (tt == CPPS_TNIL) return;
if (tt == CPPS_TCLASSVAR || tt == CPPS_TSTRING || tt == CPPS_TLAMBDAFUNCTION || tt == CPPS_TTUPLE)
value.domain->incruse();
}
bool cpps_value::isdomain() const
{
if (tt == CPPS_TINTEGER) return false;
if (tt == CPPS_TUINTEGER) return false;
if (tt == CPPS_TNIL) return false;
return tt == CPPS_TDOMAIN || tt == CPPS_TCLASS || tt == CPPS_TCLASSVAR || tt == CPPS_TSTRING || tt == CPPS_TTUPLE;
}
bool cpps_value::isref() const
{
return tt == CPPS_TREF;
}
cpps_value cpps_value::ref()
{
return cpps_value(this);
}
const cpps::cpps_value& cpps_value::real() const
{
return isref() ? *value.value : *this;
}
cpps::cpps_value& cpps_value::real()
{
return isref() ? *value.value : *this;
}
size_t cpps_value::hash::operator()(const cpps_value& _Keyval) const
{
switch (_Keyval.tt)
{
case CPPS_TNUMBER: return std::hash<cpps_number>()(_Keyval.value.number);
case CPPS_TINTEGER: return std::hash<cpps_integer>()(_Keyval.value.integer);
case CPPS_TUINTEGER: return std::hash<cpps_uinteger>()(_Keyval.value.uinteger);
case CPPS_TSTRING: {
std::string* tmpStr = cpps_get_string(_Keyval);
return std::hash<std::string>()(*(tmpStr));
}
case CPPS_TFUNCTION:
case CPPS_TLAMBDAFUNCTION:
{
return std::hash<cpps_integer>()(_Keyval.value.integer);
}
case CPPS_TCLASSVAR: {
object left = object(_Keyval);
cpps_cppsclassvar* cppsclassvar = cpps_to_cpps_cppsclassvar(_Keyval);
cpps_cppsclass* cppsclass = cppsclassvar->getcppsclass();
C* c = cppsclass->getDefaultCState();
object hash_value = left["hash_value"];
if (hash_value.isfunction()) {
return (size_t)doclassfunction(c, left, hash_value).toint();
}
}
default:
throw(cpps_error("unknow file", 0, 0, "== ... It can't be used as a HashKey. type: %d", _Keyval.tt));
}
return _Keyval.tt;
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/cppscript/cpps.git
git@gitee.com:cppscript/cpps.git
cppscript
cpps
cpps
v1.0.2

Search