Stratax
0.2.0
Toggle main menu visibility
Loading...
Searching...
No Matches
DimensionValidation.hpp
1
#pragma once
2
3
#include <cstddef>
4
#include <limits>
5
6
#include <stratax/core/Exceptions.hpp>
7
8
namespace
stratax::core::validation {
9
20
inline
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
39
inline
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
58
template
<
typename
Ranked>
59
requires
requires
(
const
Ranked& object)
60
{
61
object
.rank();
62
}
63
const
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
80
inline
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
104
inline
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
}
include
stratax
core
validation
DimensionValidation.hpp
Generated by
1.17.0