Skip to content

Commit 66ff121

Browse files
author
Timothy Banks
committed
Migrate to std::variant
1 parent 10d6484 commit 66ff121

81 files changed

Lines changed: 1041 additions & 1531 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

libraries/chain/abi_serializer.cpp

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -661,30 +661,30 @@ namespace eosio { namespace chain {
661661

662662
auto& b = path.back();
663663

664-
EOS_ASSERT( b.contains<array_index_path_item>(), abi_exception, "trying to set array index without first pushing new array index item" );
664+
EOS_ASSERT( std::holds_alternative<array_index_path_item>(b), abi_exception, "trying to set array index without first pushing new array index item" );
665665

666-
b.get<array_index_path_item>().array_index = i;
666+
std::get<array_index_path_item>(b).array_index = i;
667667
}
668668

669669
void abi_traverse_context_with_path::hint_array_type_if_in_array() {
670-
if( path.size() == 0 || !path.back().contains<array_index_path_item>() )
670+
if( path.size() == 0 || !std::holds_alternative<array_index_path_item>(path.back()) )
671671
return;
672672

673-
path.back().get<array_index_path_item>().type_hint = array_type_path_root{};
673+
std::get<array_index_path_item>(path.back()).type_hint = array_type_path_root{};
674674
}
675675

676676
void abi_traverse_context_with_path::hint_struct_type_if_in_array( const map<type_name, struct_def>::const_iterator& itr ) {
677-
if( path.size() == 0 || !path.back().contains<array_index_path_item>() )
677+
if( path.size() == 0 || !std::holds_alternative<array_index_path_item>(path.back()) )
678678
return;
679679

680-
path.back().get<array_index_path_item>().type_hint = struct_type_path_root{ .struct_itr = itr };
680+
std::get<array_index_path_item>(path.back()).type_hint = struct_type_path_root{ .struct_itr = itr };
681681
}
682682

683683
void abi_traverse_context_with_path::hint_variant_type_if_in_array( const map<type_name, variant_def>::const_iterator& itr ) {
684-
if( path.size() == 0 || !path.back().contains<array_index_path_item>() )
684+
if( path.size() == 0 || !std::holds_alternative<array_index_path_item>(path.back()) )
685685
return;
686686

687-
path.back().get<array_index_path_item>().type_hint = variant_type_path_root{ .variant_itr = itr };
687+
std::get<array_index_path_item>(path.back()).type_hint = variant_type_path_root{ .variant_itr = itr };
688688
}
689689

690690
constexpr size_t const_strlen( const char* str )
@@ -804,13 +804,13 @@ namespace eosio { namespace chain {
804804

805805
void operator()( const array_index_path_item& item ) {
806806
const auto& th = item.type_hint;
807-
if( th.contains<struct_type_path_root>() ) {
808-
const auto& str = th.get<struct_type_path_root>().struct_itr->first;
807+
if( std::holds_alternative<struct_type_path_root>(th) ) {
808+
const auto& str = std::get<struct_type_path_root>(th).struct_itr->first;
809809
output_name( s, str, shorten_names );
810-
} else if( th.contains<variant_type_path_root>() ) {
811-
const auto& str = th.get<variant_type_path_root>().variant_itr->first;
810+
} else if( std::holds_alternative<variant_type_path_root>(th) ) {
811+
const auto& str = std::get<variant_type_path_root>(th).variant_itr->first;
812812
output_name( s, str, shorten_names );
813-
} else if( th.contains<array_type_path_root>() ) {
813+
} else if( std::holds_alternative<array_type_path_root>(th) ) {
814814
s << "ARRAY";
815815
} else {
816816
s << "UNKNOWN";
@@ -834,21 +834,21 @@ namespace eosio { namespace chain {
834834

835835
generate_path_string_visitor visitor(shorten_names, !full_path);
836836
if( full_path )
837-
root_of_path.visit( visitor );
837+
std::visit( visitor, root_of_path );
838838
for( size_t i = 0, n = path.size(); i < n; ++i ) {
839-
if( full_path && !path[i].contains<array_index_path_item>() )
839+
if( full_path && !std::holds_alternative<array_index_path_item>(path[i]) )
840840
visitor.add_dot();
841841

842-
path[i].visit( visitor );
842+
std::visit( visitor, path[i] );
843843

844844
}
845845

846846
if( !full_path ) {
847-
if( visitor.last_path_item.contains<empty_path_item>() ) {
848-
root_of_path.visit( visitor );
847+
if( std::holds_alternative<empty_path_item>(visitor.last_path_item) ) {
848+
std::visit( visitor, root_of_path );
849849
} else {
850850
path_item_type_visitor vis2(visitor.s, shorten_names);
851-
visitor.last_path_item.visit(vis2);
851+
std::visit(vis2, visitor.last_path_item);
852852
}
853853
}
854854

libraries/chain/apply_context.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ void apply_context::schedule_deferred_transaction( const uint128_t& sender_id, a
430430
"only the deferred_transaction_generation_context extension is currently supported for deferred transactions"
431431
);
432432

433-
const auto& context = itr->second.get<deferred_transaction_generation_context>();
433+
const auto& context = std::get<deferred_transaction_generation_context>(itr->second);
434434

435435
EOS_ASSERT( context.sender == receiver, ill_formed_deferred_transaction_generation_context,
436436
"deferred transaction generaction context contains mismatching sender",
@@ -826,16 +826,16 @@ int apply_context::get_context_free_data( uint32_t index, char* buffer, size_t b
826826
{
827827
const packed_transaction::prunable_data_type::prunable_data_t& data = trx_context.packed_trx.get_prunable_data().prunable_data;
828828
const bytes* cfd = nullptr;
829-
if( data.contains<packed_transaction::prunable_data_type::none>() ) {
830-
} else if( data.contains<packed_transaction::prunable_data_type::partial>() ) {
831-
if( index >= data.get<packed_transaction::prunable_data_type::partial>().context_free_segments.size() ) return -1;
829+
if( std::holds_alternative<packed_transaction::prunable_data_type::none>(data) ) {
830+
} else if( std::holds_alternative<packed_transaction::prunable_data_type::partial>(data) ) {
831+
if( index >= std::get<packed_transaction::prunable_data_type::partial>(data).context_free_segments.size() ) return -1;
832832

833833
cfd = trx_context.packed_trx.get_context_free_data(index);
834834
} else {
835835
const std::vector<bytes>& context_free_data =
836-
data.contains<packed_transaction::prunable_data_type::full_legacy>() ?
837-
data.get<packed_transaction::prunable_data_type::full_legacy>().context_free_segments :
838-
data.get<packed_transaction::prunable_data_type::full>().context_free_segments;
836+
std::holds_alternative<packed_transaction::prunable_data_type::full_legacy>(data) ?
837+
std::get<packed_transaction::prunable_data_type::full_legacy>(data).context_free_segments :
838+
std::get<packed_transaction::prunable_data_type::full>(data).context_free_segments;
839839
if( index >= context_free_data.size() ) return -1;
840840

841841
cfd = &context_free_data[index];

libraries/chain/block.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,25 @@ namespace eosio { namespace chain {
2323

2424
struct transaction_receipt_translator {
2525
bool legacy = true;
26-
fc::static_variant<transaction_id_type, packed_transaction> operator()(const transaction_id_type& tid) const {
26+
std::variant<transaction_id_type, packed_transaction> operator()(const transaction_id_type& tid) const {
2727
return tid;
2828
}
29-
fc::static_variant<transaction_id_type, packed_transaction> operator()(const packed_transaction_v0& ptrx) const {
29+
std::variant<transaction_id_type, packed_transaction> operator()(const packed_transaction_v0& ptrx) const {
3030
return packed_transaction(ptrx, legacy);
3131
}
32-
fc::static_variant<transaction_id_type, packed_transaction> operator()(packed_transaction_v0&& ptrx) const {
32+
std::variant<transaction_id_type, packed_transaction> operator()(packed_transaction_v0&& ptrx) const {
3333
return packed_transaction(std::move(ptrx), legacy);
3434
}
3535
};
3636

3737
transaction_receipt::transaction_receipt(const transaction_receipt_v0& other, bool legacy)
3838
: transaction_receipt_header(static_cast<const transaction_receipt_header&>(other)),
39-
trx( other.trx.visit(transaction_receipt_translator{legacy}))
39+
trx(std::visit(transaction_receipt_translator{legacy}, other.trx))
4040
{}
4141

4242
transaction_receipt::transaction_receipt(transaction_receipt_v0&& other, bool legacy)
4343
: transaction_receipt_header(std::move(static_cast<transaction_receipt_header&>(other))),
44-
trx( std::move(other.trx).visit(transaction_receipt_translator{legacy}))
44+
trx(std::visit(transaction_receipt_translator{legacy}, std::move(other.trx)))
4545
{}
4646

4747
static flat_multimap<uint16_t, block_extension> validate_and_extract_block_extensions(const extensions_type& block_extensions) {
@@ -118,7 +118,7 @@ namespace eosio { namespace chain {
118118

119119
std::size_t transaction_receipt::maximum_pruned_pack_size( packed_transaction::cf_compression_type segment_compression ) const {
120120
return fc::raw::pack_size(*static_cast<const transaction_receipt_header*>(this)) + 1 +
121-
trx.visit([&](const auto& obj){ return pruned_trx_receipt_packed_size(obj, segment_compression); });
121+
std::visit([&](const auto& obj){ return pruned_trx_receipt_packed_size(obj, segment_compression); }, trx);
122122
}
123123

124124
std::size_t signed_block::maximum_pruned_pack_size( packed_transaction::cf_compression_type segment_compression ) const {
@@ -143,12 +143,12 @@ namespace eosio { namespace chain {
143143
auto visitor = overloaded{
144144
[](const transaction_id_type &id) -> transaction_receipt_v0::trx_type { return id; },
145145
[](const packed_transaction &trx) -> transaction_receipt_v0::trx_type {
146-
const auto& legacy = trx.get_prunable_data().prunable_data.get<packed_transaction::prunable_data_type::full_legacy>();
146+
const auto& legacy = std::get<packed_transaction::prunable_data_type::full_legacy>(trx.get_prunable_data().prunable_data);
147147
return packed_transaction_v0(trx.get_packed_transaction(), legacy.signatures, legacy.packed_context_free_data, trx.get_compression());
148148
}};
149149

150150
for (const transaction_receipt &r : transactions){
151-
result.transactions.emplace_back(transaction_receipt_v0{r, r.trx.visit(visitor)});
151+
result.transactions.emplace_back(transaction_receipt_v0{r, std::visit(visitor, r.trx)});
152152
}
153153
return result;
154154
}

libraries/chain/block_header_state.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,13 @@ namespace eosio { namespace chain {
208208
legacy::producer_schedule_type downgraded_producers;
209209
downgraded_producers.version = new_producers->version;
210210
for (const auto &p : new_producers->producers) {
211-
p.authority.visit([&downgraded_producers, &p](const auto& auth){
211+
std::visit([&downgraded_producers, &p](const auto& auth)
212+
{
212213
EOS_ASSERT(auth.keys.size() == 1 && auth.keys.front().weight == auth.threshold, producer_schedule_exception, "multisig block signing present before enabled!");
213214
downgraded_producers.producers.emplace_back(legacy::producer_key{p.producer_name, auth.keys.front().key});
214-
});
215+
},
216+
p.authority
217+
);
215218
}
216219
h.new_producers = std::move(downgraded_producers);
217220
}
@@ -263,7 +266,7 @@ namespace eosio { namespace chain {
263266
EOS_ASSERT(wtmsig_enabled, producer_schedule_exception, "Block header producer_schedule_change_extension before activation of WTMsig Block Signatures" );
264267
EOS_ASSERT( !was_pending_promoted, producer_schedule_exception, "cannot set pending producer schedule in the same block in which pending was promoted to active" );
265268

266-
const auto& new_producer_schedule = exts.lower_bound(producer_schedule_change_extension::extension_id())->second.get<producer_schedule_change_extension>();
269+
const auto& new_producer_schedule = std::get<producer_schedule_change_extension>(exts.lower_bound(producer_schedule_change_extension::extension_id())->second);
267270

268271
EOS_ASSERT( new_producer_schedule.version == active_schedule.version + 1, producer_schedule_exception, "wrong producer schedule version specified" );
269272
EOS_ASSERT( prev_pending_schedule.schedule.producers.empty(), producer_schedule_exception,
@@ -276,7 +279,7 @@ namespace eosio { namespace chain {
276279
protocol_feature_activation_set_ptr new_activated_protocol_features;
277280
{ // handle protocol_feature_activation
278281
if( exts.count(protocol_feature_activation::extension_id() > 0) ) {
279-
const auto& new_protocol_features = exts.lower_bound(protocol_feature_activation::extension_id())->second.get<protocol_feature_activation>().protocol_features;
282+
const auto& new_protocol_features = std::get<protocol_feature_activation>(exts.lower_bound(protocol_feature_activation::extension_id())->second).protocol_features;
280283
validator( timestamp, prev_activated_protocol_features->protocol_features, new_protocol_features );
281284

282285
new_activated_protocol_features = std::make_shared<protocol_feature_activation_set>(
@@ -409,7 +412,7 @@ namespace eosio { namespace chain {
409412

410413
void block_header_state::verify_signee( )const {
411414

412-
size_t num_keys_in_authority = valid_block_signing_authority.visit([](const auto &a){ return a.keys.size(); });
415+
auto num_keys_in_authority = std::visit([](const auto &a){ return a.keys.size(); }, valid_block_signing_authority);
413416
EOS_ASSERT(1 + additional_signatures.size() <= num_keys_in_authority, wrong_signing_key,
414417
"number of block signatures (${num_block_signatures}) exceeds number of keys in block signing authority (${num_keys})",
415418
("num_block_signatures", 1 + additional_signatures.size())
@@ -449,7 +452,7 @@ namespace eosio { namespace chain {
449452
if( header_exts.count(protocol_feature_activation::extension_id()) == 0 )
450453
return no_activations;
451454

452-
return header_exts.lower_bound(protocol_feature_activation::extension_id())->second.get<protocol_feature_activation>().protocol_features;
455+
return std::get<protocol_feature_activation>(header_exts.lower_bound(protocol_feature_activation::extension_id())->second).protocol_features;
453456
}
454457

455458
block_header_state::block_header_state( legacy::snapshot_block_header_state_v2&& snapshot )

libraries/chain/block_log.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ namespace eosio { namespace chain {
3737
std::variant<genesis_state, chain_id_type> chain_context;
3838

3939
chain_id_type chain_id() const {
40-
return std::visit(overloaded{[](const chain_id_type& id) { return id; },
40+
return visit(overloaded{[](const chain_id_type& id) { return id; },
4141
[](const genesis_state& state) { return state.compute_chain_id(); }},
4242
chain_context);
4343
}
@@ -91,12 +91,12 @@ namespace eosio { namespace chain {
9191
if (version != initial_version) {
9292
ds.write(reinterpret_cast<const char*>(&first_block_num), sizeof(first_block_num));
9393

94-
std::visit(overloaded{[&ds](const chain_id_type& id) { ds << id; },
95-
[&ds](const genesis_state& state) {
96-
auto data = fc::raw::pack(state);
97-
ds.write(data.data(), data.size());
98-
}},
99-
chain_context);
94+
visit(overloaded{[&ds](const chain_id_type& id) { ds << id; },
95+
[&ds](const genesis_state& state) {
96+
auto data = fc::raw::pack(state);
97+
ds.write(data.data(), data.size());
98+
}},
99+
chain_context);
100100

101101
auto totem = block_log::npos;
102102
ds.write(reinterpret_cast<const char*>(&totem), sizeof(totem));
@@ -192,7 +192,7 @@ namespace eosio { namespace chain {
192192

193193
template <typename Stream>
194194
void unpack(Stream& ds, log_entry& entry) {
195-
std::visit(
195+
visit(
196196
overloaded{[&ds](signed_block_v0& v) { fc::raw::unpack(ds, v); },
197197
[&ds](log_entry_v4& v) { unpack(ds, v); }},
198198
entry);
@@ -297,7 +297,7 @@ namespace eosio { namespace chain {
297297
chain_id_type chain_id() const { return preamble.chain_id(); }
298298

299299
fc::optional<genesis_state> get_genesis_state() const {
300-
return std::visit(overloaded{[](const chain_id_type&) { return fc::optional<genesis_state>{}; },
300+
return visit(overloaded{[](const chain_id_type&) { return fc::optional<genesis_state>{}; },
301301
[](const genesis_state& state) { return fc::optional<genesis_state>{state}; }},
302302
preamble.chain_context);
303303
}
@@ -988,7 +988,7 @@ namespace eosio { namespace chain {
988988

989989
size_t num_trx_pruned = 0;
990990
for (auto& trx : entry.block.transactions) {
991-
num_trx_pruned += trx.trx.visit(pruner);
991+
num_trx_pruned += visit(pruner);
992992
}
993993
strm.skip(offset_to_block_start(version));
994994
entry.block.pack(strm, entry.meta.compression);

libraries/chain/block_state.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace eosio { namespace chain {
2222
auto exts = b->validate_and_extract_extensions();
2323

2424
if ( exts.count(additional_sigs_eid) > 0 ) {
25-
auto& additional_sigs = exts.lower_bound(additional_sigs_eid)->second.get<additional_block_signatures_extension>();
25+
auto& additional_sigs = std::get<additional_block_signatures_extension>(exts.lower_bound(additional_sigs_eid)->second);
2626

2727
return std::move(additional_sigs.signatures);
2828
}

0 commit comments

Comments
 (0)