Skip to content

Commit 55452dd

Browse files
committed
saturate extract
1 parent ee05a63 commit 55452dd

File tree

8 files changed

+36
-27
lines changed

8 files changed

+36
-27
lines changed

nano/core_test/numbers.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
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>

nano/lib/numbers.hpp

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff 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
/*

nano/lib/saturate.hpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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+
}

nano/node/backlog_scan.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
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>

nano/node/json_handler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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>

nano/node/pruning.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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>

nano/node/vote_rebroadcaster.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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>

nano/store/crawler.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
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

0 commit comments

Comments
 (0)