Implements toint function
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
5e02b6b389
commit
0446c1098b
|
@ -127,7 +127,7 @@ namespace Porygon::Parser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int CharToInt(char16_t c) {
|
static int CharToInt(char16_t c) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '0':
|
case '0':
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include "../Evaluator/EvaluationException.hpp"
|
#include "../Evaluator/EvaluationException.hpp"
|
||||||
#include "../Evaluator/EvalValues/EvalValue.hpp"
|
#include "../Evaluator/EvalValues/EvalValue.hpp"
|
||||||
|
#include "../Evaluator/EvalValues/NumericEvalValue.hpp"
|
||||||
#include "../Evaluator/EvalValues/NilEvalValue.hpp"
|
#include "../Evaluator/EvalValues/NilEvalValue.hpp"
|
||||||
#include "../Utilities/StringUtils.hpp"
|
#include "../Utilities/StringUtils.hpp"
|
||||||
#include "../Binder/BoundVariables/BoundVariable.hpp"
|
#include "../Binder/BoundVariables/BoundVariable.hpp"
|
||||||
|
@ -39,6 +40,12 @@ namespace Porygon::StandardLibraries{
|
||||||
return new Evaluation::NilEvalValue();
|
return new Evaluation::NilEvalValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Evaluation::EvalValue* _toInt(void*, Evaluation::EvalValue* parameters[], int parameterCount){
|
||||||
|
auto parameter = parameters[0]->EvaluateString();
|
||||||
|
auto parsed = Utilities::StringUtils::ParseInteger(parameter);
|
||||||
|
return new Evaluation::IntegerEvalValue(parsed);
|
||||||
|
}
|
||||||
|
|
||||||
static shared_ptr<GenericFunctionScriptType> GetFuncType(const shared_ptr<ScriptType>& result, const vector<vector<shared_ptr<ScriptType>>>& options){
|
static shared_ptr<GenericFunctionScriptType> GetFuncType(const shared_ptr<ScriptType>& result, const vector<vector<shared_ptr<ScriptType>>>& options){
|
||||||
auto funcType = make_shared<GenericFunctionScriptType>();
|
auto funcType = make_shared<GenericFunctionScriptType>();
|
||||||
for (const auto& o: options){
|
for (const auto& o: options){
|
||||||
|
@ -62,6 +69,11 @@ namespace Porygon::StandardLibraries{
|
||||||
return GetFuncType(make_shared<ScriptType>(TypeClass::Nil), {{make_shared<StringScriptType>(false, 0)}});
|
return GetFuncType(make_shared<ScriptType>(TypeClass::Nil), {{make_shared<StringScriptType>(false, 0)}});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static shared_ptr<GenericFunctionScriptType> GetToIntFuncType(){
|
||||||
|
return GetFuncType(make_shared<NumericScriptType>(true, false), {{make_shared<StringScriptType>(false, 0)}});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static shared_ptr<Evaluation::EvalValue> GetFuncEvalValue(
|
static shared_ptr<Evaluation::EvalValue> GetFuncEvalValue(
|
||||||
Evaluation::EvalValue* (*func)(void* obj, Evaluation::EvalValue* parameters[], int parameterCount),
|
Evaluation::EvalValue* (*func)(void* obj, Evaluation::EvalValue* parameters[], int parameterCount),
|
||||||
shared_ptr<GenericFunctionScriptType> type, size_t optionLength){
|
shared_ptr<GenericFunctionScriptType> type, size_t optionLength){
|
||||||
|
@ -97,6 +109,13 @@ namespace Porygon::StandardLibraries{
|
||||||
auto printFunc = BasicLibrary::GetFuncEvalValue(_print, printFuncType, 1);
|
auto printFunc = BasicLibrary::GetFuncEvalValue(_print, printFuncType, 1);
|
||||||
bound->insert({printLookup, new Binder::BoundVariable(printFuncType)});
|
bound->insert({printLookup, new Binder::BoundVariable(printFuncType)});
|
||||||
values->insert({printLookup, printFunc});
|
values->insert({printLookup, printFunc});
|
||||||
|
|
||||||
|
// Register toInt function
|
||||||
|
auto toIntFuncType = BasicLibrary::GetToIntFuncType();
|
||||||
|
auto toIntLookup = Utilities::HashedString::CreateLookup(u"toint");
|
||||||
|
auto toIntFunc = BasicLibrary::GetFuncEvalValue(_toInt, toIntFuncType, 1);
|
||||||
|
bound->insert({toIntLookup, new Binder::BoundVariable(toIntFuncType)});
|
||||||
|
values->insert({toIntLookup, toIntFunc});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,10 @@ namespace Porygon::Utilities{
|
||||||
return to_16.to_bytes(s);
|
return to_16.to_bytes(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int64_t ParseInteger(const std::u16string &s){
|
||||||
|
auto parsed = std::stol(FromUTF8(s));
|
||||||
|
return parsed;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,13 @@ TEST_CASE( "Print func works", "[integration]" ) {
|
||||||
delete script;
|
delete script;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "toint func works", "[integration]" ) {
|
||||||
|
Script* script = Script::Create(u"return toint('5846321')");
|
||||||
|
REQUIRE(!script->Diagnostics -> HasErrors());
|
||||||
|
auto result = script->Evaluate();
|
||||||
|
REQUIRE(result->EvaluateInteger() == 5846321);
|
||||||
|
delete script;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue