number_constraint.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #pragma once
  2. #include <cmath>
  3. #include <iostream>
  4. #include <jvalidate/adapter.h>
  5. #include <jvalidate/constraint/constraint.h>
  6. #include <jvalidate/detail/number.h>
  7. #include <jvalidate/forward.h>
  8. #include <limits>
  9. namespace jvalidate::constraint {
  10. class MaximumConstraint : public SimpleConstraint<MaximumConstraint> {
  11. public:
  12. double value;
  13. bool exclusive;
  14. public:
  15. MaximumConstraint(double value, bool exclusive) : value(value), exclusive(exclusive) {}
  16. bool operator()(double arg) const { return exclusive ? arg < value : arg <= value; }
  17. };
  18. class MinimumConstraint : public SimpleConstraint<MinimumConstraint> {
  19. public:
  20. double value;
  21. bool exclusive;
  22. public:
  23. MinimumConstraint(double value, bool exclusive) : value(value), exclusive(exclusive) {}
  24. bool operator()(double arg) const { return exclusive ? arg > value : arg >= value; }
  25. };
  26. class MultipleOfConstraint : public SimpleConstraint<MultipleOfConstraint> {
  27. public:
  28. double value;
  29. public:
  30. MultipleOfConstraint(double value) : value(value) {}
  31. bool operator()(double arg) const {
  32. if (std::fabs(std::remainder(arg, value)) <= std::numeric_limits<double>::epsilon()) {
  33. return true;
  34. }
  35. double const div = arg / value;
  36. return std::isfinite(div) && detail::is_json_integer(div);
  37. }
  38. };
  39. }