stdex
Additional custom or not Standard C++ covered algorithms
Loading...
Searching...
No Matches
math.hpp
1/*
2 SPDX-License-Identifier: MIT
3 Copyright © 2023 Amebis
4*/
5
6#pragma once
7
8#include "compat.hpp"
9#include "system.hpp"
10#include <stdexcept>
11
12namespace stdex
13{
22 inline size_t mul(size_t a, size_t b)
23 {
24#if _MSC_VER >= 1300
25 SIZE_T result;
26 if (SUCCEEDED(SIZETMult(a, b, &result)))
27 return result;
28#elif defined(_MSC_VER)
29 if (a == 0)
30 return 0;
31 if (b <= SIZE_MAX / a)
32 return a * b;
33#else
34 size_t result;
35 if (!__builtin_mul_overflow(a, b, &result))
36 return result;
37#endif
38 throw std::invalid_argument("multiply overflow");
39 }
40
49 inline size_t add(size_t a, size_t b)
50 {
51#if _MSC_VER >= 1300
52 SIZE_T result;
53 if (SUCCEEDED(SIZETAdd(a, b, &result)))
54 return result;
55#elif defined(_MSC_VER)
56 if (a <= SIZE_MAX - b)
57 return a + b;
58#else
59 size_t result;
60 if (!__builtin_add_overflow(a, b, &result))
61 return result;
62#endif
63 throw std::invalid_argument("add overflow");
64 }
65
66
75 inline uint32_t rol(_In_ uint32_t value, _In_ int bits)
76 {
77#ifdef _WIN32
78 return _rotl(value, bits);
79#else
80 return (value << bits) | (value >> (32 - bits));
81#endif
82 }
83}