dcsctp: Use c++17 structured bindings
As WebRTC now supports C++17, simplify the code of dcSCTP by binding
return values from std::pair or std::tuple to separate names.
Bug: webrtc:13220
Change-Id: Ie49154ff4c823e1528deaef7e372cbc550923bc2
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/246442
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Victor Boivie <boivie@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35773}
diff --git a/net/dcsctp/rx/reassembly_queue.cc b/net/dcsctp/rx/reassembly_queue.cc
index 36ade92..5791d68 100644
--- a/net/dcsctp/rx/reassembly_queue.cc
+++ b/net/dcsctp/rx/reassembly_queue.cc
@@ -175,9 +175,7 @@
// https://tools.ietf.org/html/rfc6525#section-5.2.2
// "Any queued TSNs (queued at step E2) MUST now be released and processed
// normally."
- for (auto& p : deferred_chunks) {
- const TSN& tsn = p.first;
- Data& data = p.second;
+ for (auto& [tsn, data] : deferred_chunks) {
queued_bytes_ -= data.size();
Add(tsn, std::move(data));
}
diff --git a/net/dcsctp/rx/traditional_reassembly_streams.cc b/net/dcsctp/rx/traditional_reassembly_streams.cc
index d004824..4ccc2e5 100644
--- a/net/dcsctp/rx/traditional_reassembly_streams.cc
+++ b/net/dcsctp/rx/traditional_reassembly_streams.cc
@@ -105,12 +105,12 @@
int TraditionalReassemblyStreams::UnorderedStream::Add(UnwrappedTSN tsn,
Data data) {
int queued_bytes = data.size();
- auto p = chunks_.emplace(tsn, std::move(data));
- if (!p.second /* !inserted */) {
+ auto [it, inserted] = chunks_.emplace(tsn, std::move(data));
+ if (!inserted) {
return 0;
}
- queued_bytes -= TryToAssembleMessage(p.first);
+ queued_bytes -= TryToAssembleMessage(it);
return queued_bytes;
}
@@ -225,8 +225,8 @@
int queued_bytes = data.size();
UnwrappedSSN ssn = ssn_unwrapper_.Unwrap(data.ssn);
- auto p = chunks_by_ssn_[ssn].emplace(tsn, std::move(data));
- if (!p.second /* !inserted */) {
+ auto [unused, inserted] = chunks_by_ssn_[ssn].emplace(tsn, std::move(data));
+ if (!inserted) {
return 0;
}
@@ -275,8 +275,8 @@
size_t bytes_removed = 0;
// The `skipped_streams` only cover ordered messages - need to
// iterate all unordered streams manually to remove those chunks.
- for (auto& entry : unordered_streams_) {
- bytes_removed += entry.second.EraseTo(new_cumulative_ack_tsn);
+ for (auto& [unused, stream] : unordered_streams_) {
+ bytes_removed += stream.EraseTo(new_cumulative_ack_tsn);
}
for (const auto& skipped_stream : skipped_streams) {
@@ -292,9 +292,7 @@
void TraditionalReassemblyStreams::ResetStreams(
rtc::ArrayView<const StreamID> stream_ids) {
if (stream_ids.empty()) {
- for (auto& entry : ordered_streams_) {
- const StreamID& stream_id = entry.first;
- OrderedStream& stream = entry.second;
+ for (auto& [stream_id, stream] : ordered_streams_) {
RTC_DLOG(LS_VERBOSE) << log_prefix_
<< "Resetting implicit stream_id=" << *stream_id;
stream.Reset();
@@ -314,14 +312,14 @@
HandoverReadinessStatus TraditionalReassemblyStreams::GetHandoverReadiness()
const {
HandoverReadinessStatus status;
- for (const auto& entry : ordered_streams_) {
- if (entry.second.has_unassembled_chunks()) {
+ for (const auto& [unused, stream] : ordered_streams_) {
+ if (stream.has_unassembled_chunks()) {
status.Add(HandoverUnreadinessReason::kOrderedStreamHasUnassembledChunks);
break;
}
}
- for (const auto& entry : unordered_streams_) {
- if (entry.second.has_unassembled_chunks()) {
+ for (const auto& [unused, stream] : unordered_streams_) {
+ if (stream.has_unassembled_chunks()) {
status.Add(
HandoverUnreadinessReason::kUnorderedStreamHasUnassembledChunks);
break;
@@ -332,15 +330,15 @@
void TraditionalReassemblyStreams::AddHandoverState(
DcSctpSocketHandoverState& state) {
- for (const auto& entry : ordered_streams_) {
+ for (const auto& [stream_id, stream] : ordered_streams_) {
DcSctpSocketHandoverState::OrderedStream state_stream;
- state_stream.id = entry.first.value();
- state_stream.next_ssn = entry.second.next_ssn().value();
+ state_stream.id = stream_id.value();
+ state_stream.next_ssn = stream.next_ssn().value();
state.rx.ordered_streams.push_back(std::move(state_stream));
}
- for (const auto& entry : unordered_streams_) {
+ for (const auto& [stream_id, unused] : unordered_streams_) {
DcSctpSocketHandoverState::UnorderedStream state_stream;
- state_stream.id = entry.first.value();
+ state_stream.id = stream_id.value();
state.rx.unordered_streams.push_back(std::move(state_stream));
}
}
diff --git a/net/dcsctp/socket/transmission_control_block.cc b/net/dcsctp/socket/transmission_control_block.cc
index 2e4e968..0fc0d4c 100644
--- a/net/dcsctp/socket/transmission_control_block.cc
+++ b/net/dcsctp/socket/transmission_control_block.cc
@@ -140,9 +140,7 @@
auto chunks =
retransmission_queue_.GetChunksToSend(now, builder.bytes_remaining());
- for (auto& elem : chunks) {
- TSN tsn = elem.first;
- Data data = std::move(elem.second);
+ for (auto& [tsn, data] : chunks) {
if (capabilities_.message_interleaving) {
builder.Add(IDataChunk(tsn, std::move(data), false));
} else {
diff --git a/net/dcsctp/tx/outstanding_data.cc b/net/dcsctp/tx/outstanding_data.cc
index dc998de..05277d0 100644
--- a/net/dcsctp/tx/outstanding_data.cc
+++ b/net/dcsctp/tx/outstanding_data.cc
@@ -74,14 +74,14 @@
size_t actual_outstanding_items = 0;
std::set<UnwrappedTSN> actual_to_be_retransmitted;
- for (const auto& elem : outstanding_data_) {
- if (elem.second.is_outstanding()) {
- actual_outstanding_bytes += GetSerializedChunkSize(elem.second.data());
+ for (const auto& [tsn, item] : outstanding_data_) {
+ if (item.is_outstanding()) {
+ actual_outstanding_bytes += GetSerializedChunkSize(item.data());
++actual_outstanding_items;
}
- if (elem.second.should_be_retransmitted()) {
- actual_to_be_retransmitted.insert(elem.first);
+ if (item.should_be_retransmitted()) {
+ actual_to_be_retransmitted.insert(tsn);
}
}
@@ -263,10 +263,7 @@
<< *tsn.Wrap();
}
- for (auto& elem : outstanding_data_) {
- UnwrappedTSN tsn = elem.first;
- Item& other = elem.second;
-
+ for (auto& [tsn, other] : outstanding_data_) {
if (!other.is_abandoned() &&
other.data().stream_id == item.data().stream_id &&
other.data().is_unordered == item.data().is_unordered &&
@@ -318,10 +315,7 @@
}
void OutstandingData::ExpireOutstandingChunks(TimeMs now) {
- for (const auto& elem : outstanding_data_) {
- UnwrappedTSN tsn = elem.first;
- const Item& item = elem.second;
-
+ for (const auto& [tsn, item] : outstanding_data_) {
// Chunks that are nacked can be expired. Care should be taken not to expire
// unacked (in-flight) chunks as they might have been received, but the SACK
// is either delayed or in-flight and may be received later.
@@ -378,9 +372,7 @@
}
void OutstandingData::NackAll() {
- for (auto& elem : outstanding_data_) {
- UnwrappedTSN tsn = elem.first;
- Item& item = elem.second;
+ for (auto& [tsn, item] : outstanding_data_) {
if (!item.is_acked()) {
NackItem(tsn, item, /*retransmit_now=*/true);
}
@@ -406,21 +398,21 @@
OutstandingData::GetChunkStatesForTesting() const {
std::vector<std::pair<TSN, State>> states;
states.emplace_back(last_cumulative_tsn_ack_.Wrap(), State::kAcked);
- for (const auto& elem : outstanding_data_) {
+ for (const auto& [tsn, item] : outstanding_data_) {
State state;
- if (elem.second.is_abandoned()) {
+ if (item.is_abandoned()) {
state = State::kAbandoned;
- } else if (elem.second.should_be_retransmitted()) {
+ } else if (item.should_be_retransmitted()) {
state = State::kToBeRetransmitted;
- } else if (elem.second.is_acked()) {
+ } else if (item.is_acked()) {
state = State::kAcked;
- } else if (elem.second.is_outstanding()) {
+ } else if (item.is_outstanding()) {
state = State::kInFlight;
} else {
state = State::kNacked;
}
- states.emplace_back(elem.first.Wrap(), state);
+ states.emplace_back(tsn.Wrap(), state);
}
return states;
}
@@ -438,10 +430,7 @@
std::map<StreamID, SSN> skipped_per_ordered_stream;
UnwrappedTSN new_cumulative_ack = last_cumulative_tsn_ack_;
- for (const auto& elem : outstanding_data_) {
- UnwrappedTSN tsn = elem.first;
- const Item& item = elem.second;
-
+ for (const auto& [tsn, item] : outstanding_data_) {
if ((tsn != new_cumulative_ack.next_value()) || !item.is_abandoned()) {
break;
}
@@ -454,8 +443,8 @@
std::vector<ForwardTsnChunk::SkippedStream> skipped_streams;
skipped_streams.reserve(skipped_per_ordered_stream.size());
- for (const auto& elem : skipped_per_ordered_stream) {
- skipped_streams.emplace_back(elem.first, elem.second);
+ for (const auto& [stream_id, ssn] : skipped_per_ordered_stream) {
+ skipped_streams.emplace_back(stream_id, ssn);
}
return ForwardTsnChunk(new_cumulative_ack.Wrap(), std::move(skipped_streams));
}
@@ -464,10 +453,7 @@
std::map<std::pair<IsUnordered, StreamID>, MID> skipped_per_stream;
UnwrappedTSN new_cumulative_ack = last_cumulative_tsn_ack_;
- for (const auto& elem : outstanding_data_) {
- UnwrappedTSN tsn = elem.first;
- const Item& item = elem.second;
-
+ for (const auto& [tsn, item] : outstanding_data_) {
if ((tsn != new_cumulative_ack.next_value()) || !item.is_abandoned()) {
break;
}
@@ -482,9 +468,7 @@
std::vector<IForwardTsnChunk::SkippedStream> skipped_streams;
skipped_streams.reserve(skipped_per_stream.size());
- for (const auto& elem : skipped_per_stream) {
- const std::pair<IsUnordered, StreamID>& stream = elem.first;
- MID message_id = elem.second;
+ for (const auto& [stream, message_id] : skipped_per_stream) {
skipped_streams.emplace_back(stream.first, stream.second, message_id);
}
diff --git a/net/dcsctp/tx/rr_send_queue.cc b/net/dcsctp/tx/rr_send_queue.cc
index 21744cc..a20ccb2 100644
--- a/net/dcsctp/tx/rr_send_queue.cc
+++ b/net/dcsctp/tx/rr_send_queue.cc
@@ -76,8 +76,8 @@
bool RRSendQueue::IsConsistent() const {
size_t total_buffered_amount = 0;
- for (const auto& stream_entry : streams_) {
- total_buffered_amount += stream_entry.second.buffered_amount().value();
+ for (const auto& [unused, stream] : streams_) {
+ total_buffered_amount += stream.buffered_amount().value();
}
if (previous_message_has_ended_) {
@@ -391,9 +391,8 @@
bool RRSendQueue::CanResetStreams() const {
// Streams can be reset if those streams that are paused don't have any
// messages that are partially sent.
- for (auto& stream : streams_) {
- if (stream.second.is_paused() &&
- stream.second.has_partially_sent_message()) {
+ for (auto& [unused, stream] : streams_) {
+ if (stream.is_paused() && stream.has_partially_sent_message()) {
return false;
}
}
@@ -401,17 +400,17 @@
}
void RRSendQueue::CommitResetStreams() {
- for (auto& stream_entry : streams_) {
- if (stream_entry.second.is_paused()) {
- stream_entry.second.Reset();
+ for (auto& [unused, stream] : streams_) {
+ if (stream.is_paused()) {
+ stream.Reset();
}
}
RTC_DCHECK(IsConsistent());
}
void RRSendQueue::RollbackResetStreams() {
- for (auto& stream_entry : streams_) {
- stream_entry.second.Resume();
+ for (auto& [unused, stream] : streams_) {
+ stream.Resume();
}
RTC_DCHECK(IsConsistent());
}
@@ -419,8 +418,7 @@
void RRSendQueue::Reset() {
// Recalculate buffered amount, as partially sent messages may have been put
// fully back in the queue.
- for (auto& stream_entry : streams_) {
- OutgoingStream& stream = stream_entry.second;
+ for (auto& [unused, stream] : streams_) {
stream.Reset();
}
previous_message_has_ended_ = true;
@@ -471,10 +469,10 @@
}
void RRSendQueue::AddHandoverState(DcSctpSocketHandoverState& state) {
- for (const auto& entry : streams_) {
+ for (const auto& [stream_id, stream] : streams_) {
DcSctpSocketHandoverState::OutgoingStream state_stream;
- state_stream.id = entry.first.value();
- entry.second.AddHandoverState(state_stream);
+ state_stream.id = stream_id.value();
+ stream.AddHandoverState(state_stream);
state.tx.streams.push_back(std::move(state_stream));
}
}