aboutsummaryrefslogtreecommitdiff
path: root/ink_stroke_modeler/internal/validation.h
diff options
context:
space:
mode:
Diffstat (limited to 'ink_stroke_modeler/internal/validation.h')
-rw-r--r--ink_stroke_modeler/internal/validation.h48
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_