Add GSL-style narrow_cast (#2567)

This commit is contained in:
cryptocode 2020-02-19 11:29:29 +01:00 committed by GitHub
commit 2859c22009
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 5 deletions

View file

@ -2,6 +2,7 @@
#include <nano/lib/locks.hpp>
#include <cassert>
#include <functional>
#include <mutex>
#include <vector>
@ -161,6 +162,15 @@ void transform_if (InputIt first, InputIt last, OutputIt dest, Pred pred, Func t
++first;
}
}
/** Safe narrowing cast which silences warnings and asserts on data loss in debug builds. This is optimized away. */
template <typename TARGET_TYPE, typename SOURCE_TYPE>
constexpr TARGET_TYPE narrow_cast (SOURCE_TYPE const & val)
{
auto res (static_cast<TARGET_TYPE> (val));
assert (val == static_cast<SOURCE_TYPE> (res));
return res;
}
}
void release_assert_internal (bool check, const char * check_expr, const char * file, unsigned int line);

View file

@ -31,8 +31,8 @@ void nano::election::confirm_once (nano::election_status_type type_a)
status.election_end = std::chrono::duration_cast<std::chrono::milliseconds> (std::chrono::system_clock::now ().time_since_epoch ());
status.election_duration = std::chrono::duration_cast<std::chrono::milliseconds> (std::chrono::steady_clock::now () - election_start);
status.confirmation_request_count = confirmation_request_count;
status.block_count = blocks.size ();
status.voter_count = last_votes.size ();
status.block_count = nano::narrow_cast<decltype (status.block_count)> (blocks.size ());
status.voter_count = nano::narrow_cast<decltype (status.voter_count)> (last_votes.size ());
status.type = type_a;
auto status_l (status);
auto node_l (node.shared ());
@ -57,8 +57,8 @@ void nano::election::stop ()
status.election_end = std::chrono::duration_cast<std::chrono::milliseconds> (std::chrono::system_clock::now ().time_since_epoch ());
status.election_duration = std::chrono::duration_cast<std::chrono::milliseconds> (std::chrono::steady_clock::now () - election_start);
status.confirmation_request_count = confirmation_request_count;
status.block_count = blocks.size ();
status.voter_count = last_votes.size ();
status.block_count = nano::narrow_cast<decltype (status.block_count)> (blocks.size ());
status.voter_count = nano::narrow_cast<decltype (status.voter_count)> (last_votes.size ());
status.type = nano::election_status_type::stopped;
}
}

View file

@ -680,7 +680,7 @@ nano::telemetry_data nano::local_telemetry_data (nano::ledger_cache const & ledg
telemetry_data.uptime = std::chrono::duration_cast<std::chrono::seconds> (std::chrono::steady_clock::now () - statup_time_a).count ();
telemetry_data.unchecked_count = ledger_cache_a.unchecked_count;
telemetry_data.genesis_block = network_params_a.ledger.genesis_hash;
telemetry_data.peer_count = network_a.size ();
telemetry_data.peer_count = nano::narrow_cast<decltype (telemetry_data.peer_count)> (network_a.size ());
telemetry_data.account_count = ledger_cache_a.account_count;
telemetry_data.major_version = nano::get_major_node_version ();
telemetry_data.minor_version = nano::get_minor_node_version ();