From 2859c22009d3f91d3a33d66414f14e6c88b17b5c Mon Sep 17 00:00:00 2001 From: cryptocode Date: Wed, 19 Feb 2020 11:29:29 +0100 Subject: [PATCH] Add GSL-style narrow_cast (#2567) --- nano/lib/utility.hpp | 10 ++++++++++ nano/node/election.cpp | 8 ++++---- nano/node/telemetry.cpp | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/nano/lib/utility.hpp b/nano/lib/utility.hpp index 4b66d3feb..debec4689 100644 --- a/nano/lib/utility.hpp +++ b/nano/lib/utility.hpp @@ -2,6 +2,7 @@ #include +#include #include #include #include @@ -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 +constexpr TARGET_TYPE narrow_cast (SOURCE_TYPE const & val) +{ + auto res (static_cast (val)); + assert (val == static_cast (res)); + return res; +} } void release_assert_internal (bool check, const char * check_expr, const char * file, unsigned int line); diff --git a/nano/node/election.cpp b/nano/node/election.cpp index 3e816159f..4f6131a5f 100644 --- a/nano/node/election.cpp +++ b/nano/node/election.cpp @@ -31,8 +31,8 @@ void nano::election::confirm_once (nano::election_status_type type_a) status.election_end = std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()); status.election_duration = std::chrono::duration_cast (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 (blocks.size ()); + status.voter_count = nano::narrow_cast (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::system_clock::now ().time_since_epoch ()); status.election_duration = std::chrono::duration_cast (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 (blocks.size ()); + status.voter_count = nano::narrow_cast (last_votes.size ()); status.type = nano::election_status_type::stopped; } } diff --git a/nano/node/telemetry.cpp b/nano/node/telemetry.cpp index 18a68d431..508d34811 100644 --- a/nano/node/telemetry.cpp +++ b/nano/node/telemetry.cpp @@ -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::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 (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 ();