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 "sal.hpp"
9#include "system.hpp"
10#include <stdexcept>
11
12namespace stdex
13{
14 inline size_t mul(size_t a, size_t b)
15 {
16#if _MSC_VER >= 1300
17 SIZE_T result;
18 if (SUCCEEDED(SIZETMult(a, b, &result)))
19 return result;
20#elif defined(_MSC_VER)
21 if (a == 0)
22 return 0;
23 if (b <= SIZE_MAX / a)
24 return a * b;
25#else
26 size_t result;
27 if (!__builtin_mul_overflow(a, b, &result))
28 return result;
29#endif
30 throw std::invalid_argument("multiply overflow");
31 }
32
33 inline size_t add(size_t a, size_t b)
34 {
35#if _MSC_VER >= 1300
36 SIZE_T result;
37 if (SUCCEEDED(SIZETAdd(a, b, &result)))
38 return result;
39#elif defined(_MSC_VER)
40 if (a <= SIZE_MAX - b)
41 return a + b;
42#else
43 size_t result;
44 if (!__builtin_add_overflow(a, b, &result))
45 return result;
46#endif
47 throw std::invalid_argument("add overflow");
48 }
49}