diff options
author | Juan Linietsky <reduzio@gmail.com> | 2017-01-11 20:09:45 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2017-01-11 20:10:23 -0300 |
commit | bfef8de1bc4f7a7b9617a7b181881129033a0b0e (patch) | |
tree | 929ea1b48bc8d3cc1cfbd4146bdc7a5237e79404 /core | |
parent | 41821ba11ddd843d737ba5d40fabaabf1e393b9c (diff) |
More efficient iteration syntax, and range() is converted behind the scenes to it.
Diffstat (limited to 'core')
-rw-r--r-- | core/variant_op.cpp | 89 |
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 |