algorithm 768 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. // -*-c++-*-
  2. // vim: set ft=cpp:
  3. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  4. file Copyright.txt or https://cmake.org/licensing for details. */
  5. #ifndef cm_algorithm
  6. #define cm_algorithm
  7. #include <algorithm> // IWYU pragma: export
  8. #include <cassert>
  9. namespace cm {
  10. #if __cplusplus >= 201703L || defined(_MSVC_LANG) && _MSVC_LANG >= 201703L
  11. using std::clamp;
  12. #else
  13. template <typename T>
  14. T const& clamp(T const& v, T const& lo, T const& hi)
  15. {
  16. assert(!(hi < lo));
  17. return (v < lo) ? lo : (hi < v) ? hi : v;
  18. }
  19. template <typename T, typename Comp>
  20. T const& clamp(T const& v, T const& lo, T const& hi, Comp comp)
  21. {
  22. assert(!comp(hi, lo));
  23. return comp(v, lo) ? lo : comp(hi, v) ? hi : v;
  24. }
  25. #endif
  26. } // namespace cm
  27. #endif