Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

78 строки
2.3 KiB

  1. #pragma once
  2. #include <functional>
  3. #define proc auto
  4. #ifdef _DEBUG
  5. # define if_debug if constexpr (true)
  6. #else
  7. # define if_debug if constexpr (false)
  8. #endif
  9. #ifdef _MSC_VER
  10. # define debug_break() if_debug __debugbreak()
  11. # define if_windows if constexpr (true)
  12. # define if_linux if constexpr (false)
  13. #else
  14. # define debug_break() if_debug raise(SIGTRAP)
  15. # define if_windows if constexpr (false)
  16. # define if_linux if constexpr (true)
  17. #endif
  18. #define TOKENPASTE(x, y) x ## y
  19. #define TOKENPASTE2(x, y) TOKENPASTE(x, y)
  20. /**
  21. * Defer *
  22. */
  23. template<typename F>
  24. class defer_finalizer {
  25. F f;
  26. bool moved;
  27. public:
  28. template<typename T>
  29. defer_finalizer(T && f_) : f(std::forward<T>(f_)), moved(false) { }
  30. defer_finalizer(const defer_finalizer &) = delete;
  31. defer_finalizer(defer_finalizer && other) : f(std::move(other.f)), moved(other.moved) {
  32. other.moved = true;
  33. }
  34. ~defer_finalizer() {
  35. if (!moved) f();
  36. }
  37. };
  38. struct {
  39. template<typename F>
  40. defer_finalizer<F> operator<<(F && f) {
  41. return defer_finalizer<F>(std::forward<F>(f));
  42. }
  43. } deferrer;
  44. #define defer auto TOKENPASTE2(__deferred_lambda_call, __COUNTER__) = deferrer << [&]
  45. /**
  46. * fluid-let *
  47. */
  48. #define fluid_let(var, val) \
  49. if (0) \
  50. TOKENPASTE2(finished,__LINE__): ; \
  51. else \
  52. for (auto TOKENPASTE2(fluid_let_, __LINE__) = var;;) \
  53. for(var = val;;) \
  54. if (1) { \
  55. goto TOKENPASTE2(body,__LINE__); \
  56. } \
  57. else \
  58. while (1) \
  59. if (1) { \
  60. var = TOKENPASTE2(fluid_let_, __LINE__); \
  61. goto TOKENPASTE2(finished, __LINE__); \
  62. } \
  63. else TOKENPASTE2(body,__LINE__):