File tree Expand file tree Collapse file tree 8 files changed +36
-27
lines changed
Expand file tree Collapse file tree 8 files changed +36
-27
lines changed Original file line number Diff line number Diff line change 11#include < nano/lib/balance_formatting.hpp>
22#include < nano/lib/numbers.hpp>
3+ #include < nano/lib/saturate.hpp>
34#include < nano/lib/numbers_templ.hpp>
45#include < nano/lib/ratios.hpp>
56#include < nano/secure/common.hpp>
Original file line number Diff line number Diff line change @@ -489,33 +489,6 @@ namespace difficulty
489489 uint64_t from_multiplier (double const , uint64_t const );
490490 double to_multiplier (uint64_t const , uint64_t const );
491491}
492-
493- /* *
494- * Add to or substract from a value without overflow
495- * TODO: C++26 replace with std::add_sat and std::sub_sat
496- */
497- template <typename T>
498- T add_sat (T const & value, T const & diff) noexcept
499- {
500- static_assert (std::numeric_limits<T>::is_specialized, " std::numeric_limits<T> must be specialized" );
501- return (value > std::numeric_limits<T>::max () - diff) ? std::numeric_limits<T>::max () : value + diff;
502- }
503- template <typename T>
504- T sub_sat (T const & value, T const & diff) noexcept
505- {
506- static_assert (std::numeric_limits<T>::is_specialized, " std::numeric_limits<T> must be specialized" );
507- return (value < std::numeric_limits<T>::min () + diff) ? std::numeric_limits<T>::min () : value - diff;
508- }
509- template <typename T>
510- T inc_sat (T const & value) noexcept
511- {
512- return add_sat (value, static_cast <T> (1 ));
513- }
514- template <typename T>
515- T dec_sat (T const & value) noexcept
516- {
517- return sub_sat (value, static_cast <T> (1 ));
518- }
519492}
520493
521494/*
Original file line number Diff line number Diff line change 1+ #pragma once
2+
3+ #include < limits>
4+
5+ namespace nano
6+ {
7+ // Saturating arithmetic — clamps at numeric limits instead of overflowing
8+ template <typename T>
9+ T add_sat (T const & value, T const & diff) noexcept
10+ {
11+ static_assert (std::numeric_limits<T>::is_specialized, " std::numeric_limits<T> must be specialized" );
12+ return (value > std::numeric_limits<T>::max () - diff) ? std::numeric_limits<T>::max () : value + diff;
13+ }
14+ template <typename T>
15+ T sub_sat (T const & value, T const & diff) noexcept
16+ {
17+ static_assert (std::numeric_limits<T>::is_specialized, " std::numeric_limits<T> must be specialized" );
18+ return (value < std::numeric_limits<T>::min () + diff) ? std::numeric_limits<T>::min () : value - diff;
19+ }
20+ template <typename T>
21+ T inc_sat (T const & value) noexcept
22+ {
23+ return add_sat (value, static_cast <T> (1 ));
24+ }
25+ template <typename T>
26+ T dec_sat (T const & value) noexcept
27+ {
28+ return sub_sat (value, static_cast <T> (1 ));
29+ }
30+ }
Original file line number Diff line number Diff line change 1+ #include < nano/lib/saturate.hpp>
12#include < nano/lib/stats.hpp>
23#include < nano/lib/thread_roles.hpp>
34#include < nano/lib/threading.hpp>
Original file line number Diff line number Diff line change 11#include < nano/lib/block_type.hpp>
2+ #include < nano/lib/saturate.hpp>
23#include < nano/lib/blockbuilders.hpp>
34#include < nano/lib/blocks.hpp>
45#include < nano/lib/config.hpp>
Original file line number Diff line number Diff line change 11#include < nano/lib/logging.hpp>
2+ #include < nano/lib/saturate.hpp>
23#include < nano/lib/stats.hpp>
34#include < nano/lib/thread_roles.hpp>
45#include < nano/lib/threading.hpp>
Original file line number Diff line number Diff line change 11#include < nano/lib/assert.hpp>
2+ #include < nano/lib/saturate.hpp>
23#include < nano/lib/interval.hpp>
34#include < nano/lib/logging.hpp>
45#include < nano/lib/numbers_templ.hpp>
Original file line number Diff line number Diff line change 11#pragma once
22
33#include < nano/lib/numbers.hpp>
4+ #include < nano/lib/saturate.hpp>
45#include < nano/lib/utility.hpp>
56#include < nano/store/transaction.hpp>
67
You can’t perform that action at this time.
0 commit comments