Просмотр исходного кода

Added foreach implementation from Jason Kinzer.

Lasse Öörni 13 лет назад
Родитель
Сommit
5be828da83
3 измененных файлов с 104 добавлено и 0 удалено
  1. 1 0
      Docs/Urho3D.dox
  2. 102 0
      Engine/Container/ForEach.h
  3. 1 0
      Readme.txt

+ 1 - 0
Docs/Urho3D.dox

@@ -80,6 +80,7 @@ Urho3D uses the following third-party libraries:
 Contributions and bugfixes from:
 
 - Colin Barrett
+- Jason Kinzer
 - Miika Santala
 - Magic.Lixin
 - skaiware

+ 102 - 0
Engine/Container/ForEach.h

@@ -0,0 +1,102 @@
+#pragma once
+
+#include "Vector.h"
+
+namespace Urho3D {
+
+template<typename T>
+struct false_wrapper {
+    false_wrapper(const T& value) : value(value) { }
+    operator bool() const { return false; }
+    T value;
+};
+
+template<typename T>
+false_wrapper<T> make_false_wrapper(const T& value) {
+    return false_wrapper<T>(value);
+}
+
+// vector support functions
+
+template <class T>
+Urho3D::RandomAccessIterator<T> Begin(Urho3D::Vector<T> &v) {
+    return v.Begin();
+}
+template <class T>
+Urho3D::RandomAccessIterator<T> Begin(Urho3D::Vector<T> *v) {
+    return v->Begin();
+}
+
+template <class T>
+Urho3D::RandomAccessConstIterator<T> Begin(const Urho3D::Vector<T> &v) {
+    return v.Begin();
+}
+template <class T>
+Urho3D::RandomAccessConstIterator<T> Begin(const Urho3D::Vector<T> *v) {
+    return v->Begin();
+}
+
+template <class T>
+Urho3D::RandomAccessIterator<T> End(Urho3D::Vector<T> &v) {
+    return v.End();
+}
+template <class T>
+Urho3D::RandomAccessIterator<T> End(Urho3D::Vector<T> *v) {
+    return v->End();
+}
+
+template <class T>
+Urho3D::RandomAccessConstIterator<T> End(const Urho3D::Vector<T> &v) {
+    return v.End();
+}
+template <class T>
+Urho3D::RandomAccessConstIterator<T> End(const Urho3D::Vector<T> *v) {
+    return v->End();
+}
+
+// podvector support functions
+
+template <class T>
+Urho3D::RandomAccessIterator<T> Begin(Urho3D::PODVector<T> &v) {
+    return v.Begin();
+}
+template <class T>
+Urho3D::RandomAccessIterator<T> Begin(Urho3D::PODVector<T> *v) {
+    return v->Begin();
+}
+
+template <class T>
+Urho3D::RandomAccessConstIterator<T> Begin(const Urho3D::PODVector<T> &v) {
+    return v.Begin();
+}
+template <class T>
+Urho3D::RandomAccessConstIterator<T> Begin(const Urho3D::PODVector<T> *v) {
+    return v->Begin();
+}
+
+template <class T>
+Urho3D::RandomAccessIterator<T> End(Urho3D::PODVector<T> &v) {
+    return v.End();
+}
+template <class T>
+Urho3D::RandomAccessIterator<T> End(Urho3D::PODVector<T> *v) {
+    return v->End();
+}
+
+template <class T>
+Urho3D::RandomAccessConstIterator<T> End(const Urho3D::PODVector<T> &v) {
+    return v.End();
+}
+template <class T>
+Urho3D::RandomAccessConstIterator<T> End(const Urho3D::PODVector<T> *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)

+ 1 - 0
Readme.txt

@@ -53,6 +53,7 @@ Urho3D uses the following third-party libraries:
 
 Contributions and bugfixes from:
 - Colin Barrett
+- Jason Kinzer
 - Miika Santala
 - Magic.Lixin
 - skaiware