@@ -187,7 +187,7 @@ DiscreteTrajectory<Frame>::NewSegment() {
187
187
segment_by_left_endpoint_.end (), last_time, new_segment_sit);
188
188
}
189
189
190
- DCHECK_OK (ConsistencyStatus ());
190
+ CHECK_OK (ConsistencyStatus ());
191
191
return new_self;
192
192
}
193
193
@@ -205,7 +205,7 @@ DiscreteTrajectory<Frame>::DetachSegments(SegmentIterator const begin) {
205
205
/* to=*/ detached,
206
206
/* to_segments_begin=*/ detached.segments_ ->begin ());
207
207
208
- DCHECK_OK (ConsistencyStatus ());
208
+ CHECK_OK (ConsistencyStatus ());
209
209
return detached;
210
210
}
211
211
@@ -245,7 +245,7 @@ DiscreteTrajectory<Frame>::AttachSegments(DiscreteTrajectory trajectory) {
245
245
/* to=*/ *this ,
246
246
/* to_segments_begin=*/ end_before_splice);
247
247
248
- DCHECK_OK (ConsistencyStatus ());
248
+ CHECK_OK (ConsistencyStatus ());
249
249
return SegmentIterator (segments_.get (), end_before_splice);
250
250
}
251
251
@@ -270,7 +270,7 @@ void DiscreteTrajectory<Frame>::DeleteSegments(SegmentIterator& begin) {
270
270
// Make sure that the client doesn't try to use the invalid iterator.
271
271
begin = segments ().end ();
272
272
273
- DCHECK_OK (ConsistencyStatus ());
273
+ CHECK_OK (ConsistencyStatus ());
274
274
}
275
275
276
276
template <typename Frame>
@@ -300,7 +300,7 @@ void DiscreteTrajectory<Frame>::ForgetAfter(Instant const& t) {
300
300
segment_by_left_endpoint_.end ());
301
301
}
302
302
303
- DCHECK_OK (ConsistencyStatus ());
303
+ CHECK_OK (ConsistencyStatus ());
304
304
}
305
305
306
306
template <typename Frame>
@@ -342,7 +342,7 @@ void DiscreteTrajectory<Frame>::ForgetBefore(Instant const& t) {
342
342
sit);
343
343
}
344
344
345
- DCHECK_OK (ConsistencyStatus ());
345
+ CHECK_OK (ConsistencyStatus ());
346
346
}
347
347
348
348
template <typename Frame>
@@ -396,12 +396,18 @@ void DiscreteTrajectory<Frame>::Merge(DiscreteTrajectory<Frame> trajectory) {
396
396
// Merge corresponding segments.
397
397
sit_t ->Merge (std::move (*sit_s));
398
398
399
- // If the left endpoint has changed, remove its entry from the time-to-
400
- // segment map. Insert a new entry if the segment is not empty .
399
+ // If the left endpoint of |sit_t| has changed, remove its entry from the
400
+ // time-to- segment map, if any .
401
401
if (left_endpoint.has_value () &&
402
402
sit_t ->front ().time < left_endpoint.value ()) {
403
- segment_by_left_endpoint_.erase (left_endpoint.value ());
403
+ auto const it = segment_by_left_endpoint_.find (left_endpoint.value ());
404
+ if (it != segment_by_left_endpoint_.end () && it->second == sit_t ) {
405
+ segment_by_left_endpoint_.erase (left_endpoint.value ());
406
+ }
404
407
}
408
+ // Insert a new entry in the time-to-segment map if the segment is not
409
+ // empty. This entry will be overwritten by any future entry at the same
410
+ // time, thereby enforcing the invariants of the time-to-segment map.
405
411
if (!sit_t ->empty ()) {
406
412
segment_by_left_endpoint_.insert_or_assign (sit_t ->front ().time , sit_t );
407
413
}
@@ -431,7 +437,7 @@ void DiscreteTrajectory<Frame>::Merge(DiscreteTrajectory<Frame> trajectory) {
431
437
}
432
438
}
433
439
434
- DCHECK_OK (ConsistencyStatus ());
440
+ CHECK_OK (ConsistencyStatus ());
435
441
}
436
442
437
443
template <typename Frame>
@@ -726,6 +732,12 @@ absl::Status DiscreteTrajectory<Frame>::ConsistencyStatus() const {
726
732
" and " , DebugString (sit2->front ().time )));
727
733
}
728
734
}
735
+ if (sit1 != segments_->cend () && !sit1->empty ()) {
736
+ return absl::InternalError (
737
+ absl::StrCat (" Segment at time " , DebugString (sit1->front ().time ),
738
+ " missing in the time-to-segment map of size " ,
739
+ segment_by_left_endpoint_.size ()));
740
+ }
729
741
}
730
742
if (!segments_->empty ()) {
731
743
int i = 0 ;
0 commit comments