Stratax 0.2.0
Loading...
Searching...
No Matches
DimensionValidation.hpp
1#pragma once
2
3#include <cstddef>
4#include <limits>
5
6#include <stratax/core/Exceptions.hpp>
7
8namespace stratax::core::validation {
9
20inline std::size_t nonnegative_size(std::ptrdiff_t value, const char* message)
21{
22 if (value < 0)
23 {
24 throw Exceptions::DimensionError(message);
25 }
26
27 return static_cast<std::size_t>(value);
28}
29
39inline void require_rank(std::size_t actual, std::size_t expected, const char* message)
40{
41 if (actual != expected)
42 {
43 throw Exceptions::DimensionError(message);
44 }
45}
46
58template<typename Ranked>
59requires requires(const Ranked& object)
60{
61 object.rank();
62}
63const Ranked& require_rank(const Ranked& object, std::size_t expected, const char* message)
64{
65 require_rank(object.rank(), expected, message);
66 return object;
67}
68
80inline std::size_t checked_multiply(
81 std::size_t lhs,
82 std::size_t rhs,
83 const char* message)
84{
85 if (rhs != 0 && lhs > std::numeric_limits<std::size_t>::max() / rhs)
86 {
87 throw Exceptions::DimensionError(message);
88 }
89
90 return lhs * rhs;
91}
92
104inline std::size_t checked_add(
105 std::size_t lhs,
106 std::size_t rhs,
107 const char* message)
108{
109 if (lhs > std::numeric_limits<std::size_t>::max() - rhs)
110 {
111 throw Exceptions::DimensionError(message);
112 }
113
114 return lhs + rhs;
115}
116
117}