#pragma once #include "Vector.h" namespace Urho3D { template struct false_wrapper { false_wrapper(const T& value) : value(value) { } operator bool() const { return false; } T value; }; template false_wrapper make_false_wrapper(const T& value) { return false_wrapper(value); } // vector support functions template Urho3D::RandomAccessIterator Begin(Urho3D::Vector &v) { return v.Begin(); } template Urho3D::RandomAccessIterator Begin(Urho3D::Vector *v) { return v->Begin(); } template Urho3D::RandomAccessConstIterator Begin(const Urho3D::Vector &v) { return v.Begin(); } template Urho3D::RandomAccessConstIterator Begin(const Urho3D::Vector *v) { return v->Begin(); } template Urho3D::RandomAccessIterator End(Urho3D::Vector &v) { return v.End(); } template Urho3D::RandomAccessIterator End(Urho3D::Vector *v) { return v->End(); } template Urho3D::RandomAccessConstIterator End(const Urho3D::Vector &v) { return v.End(); } template Urho3D::RandomAccessConstIterator End(const Urho3D::Vector *v) { return v->End(); } // podvector support functions template Urho3D::RandomAccessIterator Begin(Urho3D::PODVector &v) { return v.Begin(); } template Urho3D::RandomAccessIterator Begin(Urho3D::PODVector *v) { return v->Begin(); } template Urho3D::RandomAccessConstIterator Begin(const Urho3D::PODVector &v) { return v.Begin(); } template Urho3D::RandomAccessConstIterator Begin(const Urho3D::PODVector *v) { return v->Begin(); } template Urho3D::RandomAccessIterator End(Urho3D::PODVector &v) { return v.End(); } template Urho3D::RandomAccessIterator End(Urho3D::PODVector *v) { return v->End(); } template Urho3D::RandomAccessConstIterator End(const Urho3D::PODVector &v) { return v.End(); } template Urho3D::RandomAccessConstIterator End(const Urho3D::PODVector *v) { return v->End(); } } // namespace Urho3D #define foreach(VAL, VALS) \ if (const auto& _foreach_begin = Urho3D::make_false_wrapper(Urho3D::Begin(VALS))) { } else \ if (const auto& _foreach_end = Urho3D::make_false_wrapper(Urho3D::End(VALS))) { } else \ for (auto it = _foreach_begin.value; it != _foreach_end.value; ++it) \ if (bool _foreach_flag = false) { } else \ for (VAL = *it; !_foreach_flag; _foreach_flag = true) #define foreachv(ITER, VAL, VALS) \ if (const auto& _foreach_begin = Urho3D::make_false_wrapper(Urho3D::Begin(VALS))) { } else \ if (const auto& _foreach_end = Urho3D::make_false_wrapper(Urho3D::End(VALS))) { } else \ if (int ITER = 0) { } else \ for (auto it = _foreach_begin.value; it != _foreach_end.value; ++it) \ if (bool _foreach_flag = false) { } else \ for (VAL = *it; !_foreach_flag; ITER++, _foreach_flag = true)