#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;elseret = (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->isref() ? v->value.value : v;incruse();}cpps_value::cpps_value(void* v){tt = CPPS_TUSERDATA;value.p = 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(cpps_classvar_quato* f){tt = CPPS_TQUOTECLASSVAR;value.quato = 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 _WIN32cpps_value::cpps_value(const unsigned __int64 i){tt = CPPS_TUINTEGER;value.uinteger = i;}#elsecpps_value::cpps_value(const long long unsigned int i){tt = CPPS_TUINTEGER;value.uinteger = i;}#endifcpps_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);if (this == &v) return *this;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(){cpps_cppsclassvar* _pclassvar = (cpps_cppsclassvar*)real().value.domain;if (tt == CPPS_TCLASSVAR || tt == CPPS_TSTRING || tt == CPPS_TLAMBDAFUNCTION || tt == CPPS_TTUPLE)_pclassvar->decruse();}void cpps_value::decruse() const{cpps_cppsclassvar* _pclassvar = (cpps_cppsclassvar*)real().value.domain;if (tt == CPPS_TCLASSVAR || tt == CPPS_TSTRING || tt == CPPS_TLAMBDAFUNCTION || tt == CPPS_TTUPLE)_pclassvar->decruse();}void cpps_value::incruse(){cpps_cppsclassvar* _pclassvar = (cpps_cppsclassvar*)real().value.domain;if (tt == CPPS_TCLASSVAR || tt == CPPS_TSTRING || tt == CPPS_TLAMBDAFUNCTION || tt == CPPS_TTUPLE)_pclassvar->incruse();}void cpps_value::incruse()const{cpps_cppsclassvar* _pclassvar = (cpps_cppsclassvar*)real().value.domain;if (tt == CPPS_TCLASSVAR || tt == CPPS_TSTRING || tt == CPPS_TLAMBDAFUNCTION || tt == CPPS_TTUPLE)_pclassvar->incruse();}bool cpps_value::isdomain() const{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(){if (isref()) return *this;return cpps_value(this);}bool cpps_value::_iskindof(cpps_cppsclass* _cls, cpps_cppsclassvar* _clsvar) const{return _clsvar->getcppsclass() == _cls;}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;}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型