number_constraint.h 769 B

123456789101112131415161718192021222324252627282930313233343536
  1. #pragma once
  2. #include <cmath>
  3. #include <limits>
  4. #include <jvalidate/detail/number.h>
  5. #include <jvalidate/forward.h>
  6. namespace jvalidate::constraint {
  7. struct MaximumConstraint {
  8. double value;
  9. bool exclusive;
  10. bool operator()(double arg) const { return exclusive ? arg < value : arg <= value; }
  11. };
  12. struct MinimumConstraint {
  13. double value;
  14. bool exclusive;
  15. bool operator()(double arg) const { return exclusive ? arg > value : arg >= value; }
  16. };
  17. struct MultipleOfConstraint {
  18. double value;
  19. bool operator()(double arg) const {
  20. if (std::fabs(std::remainder(arg, value)) <= std::numeric_limits<double>::epsilon()) {
  21. return true;
  22. }
  23. double const div = arg / value;
  24. return std::isfinite(div) && detail::is_json_integer(div);
  25. }
  26. };
  27. }