Procházet zdrojové kódy

Add xrange builtin function

Also update classes.xml in order to document xrange
est31 před 9 roky
rodič
revize
f81153eb69

+ 43 - 0
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).
 			</description>
 		</method>
+		<method name="xrange">
+			<return type="Object">
+			</return>
+			<argument index="0" name="..." type="Variant">
+			</argument>
+			<description>
+			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).
+			</description>
+		</method>
 		<method name="load">
 			<return type="Resource">
 			</return>
@@ -27597,6 +27606,40 @@ This method controls whether the position between two cached points is interpola
 	<constants>
 	</constants>
 </class>
+<class name="RangeIterator" inherits="Reference" category="Core">
+	<brief_description>
+	</brief_description>
+	<description>
+	</description>
+	<methods>
+		<method name="is_finished">
+			<return type="bool">
+			</return>
+			<description>
+			</description>
+		</method>
+		<method name="to_array">
+			<return type="Array">
+			</return>
+			<description>
+			</description>
+		</method>
+		<method name="set_range">
+			<return type="Object">
+			</return>
+			<argument index="0" name="arg1" type="var">
+			</argument>
+			<argument index="1" name="arg2" type="var" default="NULL">
+			</argument>
+			<argument index="2" name="arg3" type="var" default="NULL">
+			</argument>
+			<description>
+			</description>
+		</method>
+	</methods>
+	<constants>
+	</constants>
+</class>
 <class name="RawArray" category="Built-In Types">
 	<brief_description>
 	Raw byte array.

+ 83 - 0
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<RangeIterator> itr = Ref<RangeIterator>( 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<RangeIterator> itr = Ref<RangeIterator>( 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<RangeIterator> itr = Ref<RangeIterator>( 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"));

+ 1 - 0
modules/gdscript/gd_functions.h

@@ -92,6 +92,7 @@ public:
 		VAR_TO_BYTES,
 		BYTES_TO_VAR,
 		GEN_RANGE,
+		GEN_XRANGE,
 		RESOURCE_LOAD,
 		INST2DICT,
 		DICT2INST,