diff options
Diffstat (limited to 'ink_stroke_modeler/internal/validation.h')
-rw-r--r-- | ink_stroke_modeler/internal/validation.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/ink_stroke_modeler/internal/validation.h b/ink_stroke_modeler/internal/validation.h new file mode 100644 index 0000000..e01aa1a --- /dev/null +++ b/ink_stroke_modeler/internal/validation.h @@ -0,0 +1,48 @@ +#ifndef INK_STROKE_MODELER_INTERNAL_VALIDATION_H_ +#define INK_STROKE_MODELER_INTERNAL_VALIDATION_H_ + +#include "absl/status/status.h" +#include "absl/strings/string_view.h" +#include "absl/strings/substitute.h" + +template <typename T> +absl::Status ValidateIsFiniteNumber(T value, absl::string_view label) { + if (std::isnan(value)) { + return absl::InvalidArgumentError(absl::Substitute("$0 is NaN", label)); + } + if (std::isinf(value)) { + return absl::InvalidArgumentError( + absl::Substitute("$0 is infinite", label)); + } + return absl::OkStatus(); +} + +template <typename T> +absl::Status ValidateGreaterThanZero(T value, absl::string_view label) { + if (absl::Status status = ValidateIsFiniteNumber(value, label); + !status.ok()) { + return status; + } + if (value <= 0) { + return absl::InvalidArgumentError(absl::Substitute( + "$0 must be greater than zero. Actual value: $1", label, value)); + } + return absl::OkStatus(); +} + +template <typename T> +absl::Status ValidateGreaterThanOrEqualToZero(T value, + absl::string_view label) { + if (absl::Status status = ValidateIsFiniteNumber(value, label); + !status.ok()) { + return status; + } + if (value < 0) { + return absl::InvalidArgumentError(absl::Substitute( + "$0 must be greater than or equal to zero. Actual value: $1", label, + value)); + } + return absl::OkStatus(); +} + +#endif // INK_STROKE_MODELER_INTERNAL_VALIDATION_H_ |