Skip to content

Commit 03db88d

Browse files
Abseil Teamcopybara-github
authored andcommitted
Introduce absl::Cord::Distance()
PiperOrigin-RevId: 745245070 Change-Id: Idb7d63170cfc4b83786de8c4de85a3ae07e9105a
1 parent bc78884 commit 03db88d

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

absl/strings/cord.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,13 @@ class Cord {
669669
// `it` must be dereferenceable.
670670
static absl::string_view ChunkRemaining(const CharIterator& it);
671671

672+
// Cord::Distance()
673+
//
674+
// Returns the distance between `first` and `last`, as if
675+
// `std::distance(first, last)` was called.
676+
static ptrdiff_t Distance(const CharIterator& first,
677+
const CharIterator& last);
678+
672679
// Cord::char_begin()
673680
//
674681
// Returns an iterator to the first character of the `Cord`.
@@ -1660,6 +1667,12 @@ inline absl::string_view Cord::ChunkRemaining(const CharIterator& it) {
16601667
return *it.chunk_iterator_;
16611668
}
16621669

1670+
inline ptrdiff_t Cord::Distance(const CharIterator& first,
1671+
const CharIterator& last) {
1672+
return static_cast<ptrdiff_t>(first.chunk_iterator_.bytes_remaining_ -
1673+
last.chunk_iterator_.bytes_remaining_);
1674+
}
1675+
16631676
inline Cord::CharIterator Cord::char_begin() const {
16641677
return CharIterator(this);
16651678
}

absl/strings/cord_test.cc

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2518,6 +2518,10 @@ static void VerifyCharIterator(const absl::Cord& cord) {
25182518
absl::Cord::CharRange range = cord.Chars();
25192519
EXPECT_EQ(range.begin() == range.end(), cord.empty());
25202520
EXPECT_EQ(range.begin() != range.end(), !cord.empty());
2521+
EXPECT_EQ(absl::Cord::Distance(range.begin(), range.end()),
2522+
static_cast<ptrdiff_t>(cord.size()));
2523+
EXPECT_EQ(absl::Cord::Distance(range.end(), range.begin()),
2524+
-static_cast<ptrdiff_t>(cord.size()));
25212525

25222526
size_t i = 0;
25232527
absl::Cord::CharIterator pre_iter = cord.char_begin();
@@ -2548,19 +2552,29 @@ static void VerifyCharIterator(const absl::Cord& cord) {
25482552
absl::Cord::CharIterator advance_iter = range.begin();
25492553
absl::Cord::Advance(&advance_iter, i);
25502554
EXPECT_EQ(pre_iter, advance_iter);
2555+
EXPECT_EQ(absl::Cord::Distance(range.begin(), advance_iter),
2556+
static_cast<ptrdiff_t>(i));
25512557

25522558
advance_iter = range.begin();
25532559
EXPECT_EQ(absl::Cord::AdvanceAndRead(&advance_iter, i), cord.Subcord(0, i));
25542560
EXPECT_EQ(pre_iter, advance_iter);
2561+
EXPECT_EQ(absl::Cord::Distance(range.begin(), advance_iter),
2562+
static_cast<ptrdiff_t>(i));
25552563

25562564
advance_iter = pre_iter;
25572565
absl::Cord::Advance(&advance_iter, cord.size() - i);
25582566
EXPECT_EQ(range.end(), advance_iter);
2567+
EXPECT_EQ(absl::Cord::Distance(range.begin(), advance_iter),
2568+
static_cast<ptrdiff_t>(cord.size()));
2569+
EXPECT_EQ(absl::Cord::Distance(advance_iter, range.end()), 0);
25592570

25602571
advance_iter = pre_iter;
25612572
EXPECT_EQ(absl::Cord::AdvanceAndRead(&advance_iter, cord.size() - i),
25622573
cord.Subcord(i, cord.size() - i));
25632574
EXPECT_EQ(range.end(), advance_iter);
2575+
EXPECT_EQ(absl::Cord::Distance(range.begin(), advance_iter),
2576+
static_cast<ptrdiff_t>(cord.size()));
2577+
EXPECT_EQ(absl::Cord::Distance(advance_iter, range.end()), 0);
25642578

25652579
++i;
25662580
++pre_iter;
@@ -2642,16 +2656,25 @@ TEST_P(CordTest, CharIteratorAdvanceAndRead) {
26422656

26432657
MaybeHarden(cord);
26442658

2659+
26452660
for (size_t chunk_size :
26462661
{kChunkSize1, kChunkSize2, kChunkSize3, kChunkSize4}) {
26472662
absl::Cord::CharIterator it = cord.char_begin();
2663+
size_t it_remaining = cord.size();
2664+
size_t it_advanced = 0;
26482665
size_t offset = 0;
26492666
while (offset < data.length()) {
2667+
EXPECT_EQ(absl::Cord::Distance(it, cord.char_end()), it_remaining);
2668+
EXPECT_EQ(absl::Cord::Distance(cord.char_begin(), it), it_advanced);
26502669
const size_t n = std::min<size_t>(data.length() - offset, chunk_size);
26512670
absl::Cord chunk = cord.AdvanceAndRead(&it, n);
26522671
ASSERT_EQ(chunk.size(), n);
26532672
ASSERT_EQ(chunk.Compare(data.substr(offset, n)), 0);
26542673
offset += n;
2674+
it_remaining -= n;
2675+
it_advanced += n;
2676+
EXPECT_EQ(absl::Cord::Distance(it, cord.char_end()), it_remaining);
2677+
EXPECT_EQ(absl::Cord::Distance(cord.char_begin(), it), it_advanced);
26552678
}
26562679
}
26572680
}

0 commit comments

Comments
 (0)