ForEach.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #pragma once
  2. #include "Vector.h"
  3. namespace Urho3D {
  4. template<typename T>
  5. struct false_wrapper {
  6. false_wrapper(const T& value) : value(value) { }
  7. operator bool() const { return false; }
  8. T value;
  9. };
  10. template<typename T>
  11. false_wrapper<T> make_false_wrapper(const T& value) {
  12. return false_wrapper<T>(value);
  13. }
  14. // vector support functions
  15. template <class T>
  16. Urho3D::RandomAccessIterator<T> Begin(Urho3D::Vector<T> &v) {
  17. return v.Begin();
  18. }
  19. template <class T>
  20. Urho3D::RandomAccessIterator<T> Begin(Urho3D::Vector<T> *v) {
  21. return v->Begin();
  22. }
  23. template <class T>
  24. Urho3D::RandomAccessConstIterator<T> Begin(const Urho3D::Vector<T> &v) {
  25. return v.Begin();
  26. }
  27. template <class T>
  28. Urho3D::RandomAccessConstIterator<T> Begin(const Urho3D::Vector<T> *v) {
  29. return v->Begin();
  30. }
  31. template <class T>
  32. Urho3D::RandomAccessIterator<T> End(Urho3D::Vector<T> &v) {
  33. return v.End();
  34. }
  35. template <class T>
  36. Urho3D::RandomAccessIterator<T> End(Urho3D::Vector<T> *v) {
  37. return v->End();
  38. }
  39. template <class T>
  40. Urho3D::RandomAccessConstIterator<T> End(const Urho3D::Vector<T> &v) {
  41. return v.End();
  42. }
  43. template <class T>
  44. Urho3D::RandomAccessConstIterator<T> End(const Urho3D::Vector<T> *v) {
  45. return v->End();
  46. }
  47. // podvector support functions
  48. template <class T>
  49. Urho3D::RandomAccessIterator<T> Begin(Urho3D::PODVector<T> &v) {
  50. return v.Begin();
  51. }
  52. template <class T>
  53. Urho3D::RandomAccessIterator<T> Begin(Urho3D::PODVector<T> *v) {
  54. return v->Begin();
  55. }
  56. template <class T>
  57. Urho3D::RandomAccessConstIterator<T> Begin(const Urho3D::PODVector<T> &v) {
  58. return v.Begin();
  59. }
  60. template <class T>
  61. Urho3D::RandomAccessConstIterator<T> Begin(const Urho3D::PODVector<T> *v) {
  62. return v->Begin();
  63. }
  64. template <class T>
  65. Urho3D::RandomAccessIterator<T> End(Urho3D::PODVector<T> &v) {
  66. return v.End();
  67. }
  68. template <class T>
  69. Urho3D::RandomAccessIterator<T> End(Urho3D::PODVector<T> *v) {
  70. return v->End();
  71. }
  72. template <class T>
  73. Urho3D::RandomAccessConstIterator<T> End(const Urho3D::PODVector<T> &v) {
  74. return v.End();
  75. }
  76. template <class T>
  77. Urho3D::RandomAccessConstIterator<T> End(const Urho3D::PODVector<T> *v) {
  78. return v->End();
  79. }
  80. } // namespace Urho3D
  81. #define foreach(VAL, VALS) \
  82. if (const auto& _foreach_begin = Urho3D::make_false_wrapper(Urho3D::Begin(VALS))) { } else \
  83. if (const auto& _foreach_end = Urho3D::make_false_wrapper(Urho3D::End(VALS))) { } else \
  84. for (auto it = _foreach_begin.value; it != _foreach_end.value; ++it) \
  85. if (bool _foreach_flag = false) { } else \
  86. for (VAL = *it; !_foreach_flag; _foreach_flag = true)
  87. #define foreachv(ITER, VAL, VALS) \
  88. if (const auto& _foreach_begin = Urho3D::make_false_wrapper(Urho3D::Begin(VALS))) { } else \
  89. if (const auto& _foreach_end = Urho3D::make_false_wrapper(Urho3D::End(VALS))) { } else \
  90. if (int ITER = 0) { } else \
  91. for (auto it = _foreach_begin.value; it != _foreach_end.value; ++it) \
  92. if (bool _foreach_flag = false) { } else \
  93. for (VAL = *it; !_foreach_flag; ITER++, _foreach_flag = true)