summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2017-01-11 20:09:45 -0300
committerJuan Linietsky <reduzio@gmail.com>2017-01-11 20:10:23 -0300
commitbfef8de1bc4f7a7b9617a7b181881129033a0b0e (patch)
tree929ea1b48bc8d3cc1cfbd4146bdc7a5237e79404 /core
parent41821ba11ddd843d737ba5d40fabaabf1e393b9c (diff)
More efficient iteration syntax, and range() is converted behind the scenes to it.
Diffstat (limited to 'core')
-rw-r--r--core/variant_op.cpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/core/variant_op.cpp b/core/variant_op.cpp
index 281d2e8192..3924d3af77 100644
--- a/core/variant_op.cpp
+++ b/core/variant_op.cpp
@@ -2934,6 +2934,38 @@ bool Variant::iter_init(Variant& r_iter,bool &valid) const {
valid=true;
switch(type) {
+ case INT: {
+ r_iter=0;
+ return _data._int>0;
+ } break;
+ case REAL: {
+ r_iter=0.0;
+ return _data._real>0.0;
+ } break;
+ case VECTOR2: {
+ real_t from = reinterpret_cast<const Vector2*>(_data._mem)->x;
+ real_t to = reinterpret_cast<const Vector2*>(_data._mem)->y;
+
+ r_iter=from;
+
+ return from < to;
+ } break;
+ case VECTOR3: {
+ real_t from = reinterpret_cast<const Vector3*>(_data._mem)->x;
+ real_t to = reinterpret_cast<const Vector3*>(_data._mem)->y;
+ real_t step = reinterpret_cast<const Vector3*>(_data._mem)->z;
+
+ r_iter=from;
+
+ if (from == to ) {
+ return false;
+ } else if (from < to) {
+ return step>0.0;
+ } else {
+ return step<0.0;
+ }
+ //return true;
+ } break;
case OBJECT: {
#ifdef DEBUG_ENABLED
@@ -3059,7 +3091,48 @@ bool Variant::iter_next(Variant& r_iter,bool &valid) const {
valid=true;
switch(type) {
+ case INT: {
+
+ int64_t idx = r_iter;
+ idx++;
+ if (idx >= _data._int)
+ return false;
+ r_iter = idx;
+ return true;
+ } break;
+ case REAL: {
+ double idx = r_iter;
+ idx+=1.0;
+ if (idx >= _data._real)
+ return false;
+ r_iter = idx;
+ return true;
+ } break;
+ case VECTOR2: {
+ real_t idx = r_iter;
+ idx+=1.0;
+ if (idx>=reinterpret_cast<const Vector2*>(_data._mem)->y)
+ return false;
+ r_iter=idx;
+ return true;
+ } break;
+ case VECTOR3: {
+ real_t to = reinterpret_cast<const Vector3*>(_data._mem)->y;
+ real_t step = reinterpret_cast<const Vector3*>(_data._mem)->z;
+
+ real_t idx = r_iter;
+ idx+=step;
+
+ if (step<0.0 && idx <= to)
+ return false;
+
+ if (step>0.0 && idx >= to)
+ return false;
+
+ r_iter=idx;
+ return true;
+ } break;
case OBJECT: {
#ifdef DEBUG_ENABLED
@@ -3204,6 +3277,22 @@ Variant Variant::iter_get(const Variant& r_iter,bool &r_valid) const {
r_valid=true;
switch(type) {
+ case INT: {
+
+ return r_iter;
+ } break;
+ case REAL: {
+
+ return r_iter;
+ } break;
+ case VECTOR2: {
+
+ return r_iter;
+ } break;
+ case VECTOR3: {
+
+ return r_iter;
+ } break;
case OBJECT: {
#ifdef DEBUG_ENABLED