From f81153eb6997c16318a5a7df5e982f013ebad37b Mon Sep 17 00:00:00 2001 From: est31 Date: Wed, 24 Feb 2016 02:21:56 +0100 Subject: [PATCH] Add xrange builtin function Also update classes.xml in order to document xrange --- doc/base/classes.xml | 43 ++++++++++++++++ modules/gdscript/gd_functions.cpp | 83 +++++++++++++++++++++++++++++++ modules/gdscript/gd_functions.h | 1 + 3 files changed, 127 insertions(+) diff --git a/doc/base/classes.xml b/doc/base/classes.xml index 258feadf206..12948d4489d 100644 --- a/doc/base/classes.xml +++ b/doc/base/classes.xml @@ -556,6 +556,15 @@ Return an array with the given range. Range can be 1 argument N (0 to N-1), two arguments (initial, final-1) or three arguments (initial,final-1,increment). + + + + + + + Return an iterator over the given range. Range can be 1 argument N (0 to N-1), two arguments (initial, final-1) or three arguments (initial,final-1,increment). + + @@ -27597,6 +27606,40 @@ This method controls whether the position between two cached points is interpola + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Raw byte array. diff --git a/modules/gdscript/gd_functions.cpp b/modules/gdscript/gd_functions.cpp index 9b7d8eeac4a..e5689d8865e 100644 --- a/modules/gdscript/gd_functions.cpp +++ b/modules/gdscript/gd_functions.cpp @@ -32,6 +32,7 @@ #include "reference.h" #include "gd_script.h" #include "func_ref.h" +#include "range_iterator.h" #include "os/os.h" #include "variant_parser.h" #include "io/marshalls.h" @@ -98,6 +99,7 @@ const char *GDFunctions::get_func_name(Function p_func) { "var2bytes", "bytes2var", "range", + "xrange", "load", "inst2dict", "dict2inst", @@ -815,6 +817,81 @@ void GDFunctions::call(Function p_func,const Variant **p_args,int p_arg_count,Va } break; } + } break; + case GEN_XRANGE: { + + switch(p_arg_count) { + case 0: { + r_error.error=Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; + r_error.argument=1; + } break; + case 1: { + + VALIDATE_ARG_NUM(0); + + int count=*p_args[0]; + + Ref itr = Ref( memnew(RangeIterator) ); + if (!*itr) { + ERR_EXPLAIN("Couldn't allocate iterator!"); + r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD; + ERR_FAIL(); + } + (*itr)->set_range(count); + r_ret=Variant(itr); + return; + } break; + case 2: { + + VALIDATE_ARG_NUM(0); + VALIDATE_ARG_NUM(1); + + int from=*p_args[0]; + int to=*p_args[1]; + + Ref itr = Ref( memnew(RangeIterator) ); + if (!*itr) { + ERR_EXPLAIN("Couldn't allocate iterator!"); + r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD; + ERR_FAIL(); + } + (*itr)->set_range(from, to); + r_ret=Variant(itr); + return; + } break; + case 3: { + + VALIDATE_ARG_NUM(0); + VALIDATE_ARG_NUM(1); + VALIDATE_ARG_NUM(2); + + int from=*p_args[0]; + int to=*p_args[1]; + int incr=*p_args[2]; + + if (incr==0) { + ERR_EXPLAIN("step argument is zero!"); + r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD; + ERR_FAIL(); + } + + Ref itr = Ref( memnew(RangeIterator) ); + if (!*itr) { + ERR_EXPLAIN("Couldn't allocate iterator!"); + r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD; + ERR_FAIL(); + } + (*itr)->set_range(from, to, incr); + r_ret=Variant(itr); + return; + } break; + default: { + + r_error.error=Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS; + r_error.argument=3; + } break; + } + } break; case RESOURCE_LOAD: { VALIDATE_ARG_COUNT(1); @@ -1433,6 +1510,12 @@ MethodInfo GDFunctions::get_info(Function p_func) { mi.return_val.type=Variant::ARRAY; return mi; } break; + case GEN_XRANGE: { + + MethodInfo mi("xrange",PropertyInfo(Variant::NIL,"...")); + mi.return_val.type=Variant::OBJECT; + return mi; + } break; case RESOURCE_LOAD: { MethodInfo mi("load",PropertyInfo(Variant::STRING,"path")); diff --git a/modules/gdscript/gd_functions.h b/modules/gdscript/gd_functions.h index 8c884725672..3a993cc0383 100644 --- a/modules/gdscript/gd_functions.h +++ b/modules/gdscript/gd_functions.h @@ -92,6 +92,7 @@ public: VAR_TO_BYTES, BYTES_TO_VAR, GEN_RANGE, + GEN_XRANGE, RESOURCE_LOAD, INST2DICT, DICT2INST,