Commit 354030be by Abseil Team Committed by Andy Getz

Export of internal Abseil changes

--
c207f164477b5c7f0cb1c5c8bfdc1430b457da17 by Martijn Vels <mvels@google.com>:

Add a 'node()' property to CordRepRingReader.

PiperOrigin-RevId: 366254778
GitOrigin-RevId: c207f164477b5c7f0cb1c5c8bfdc1430b457da17
Change-Id: I90478d151c2ab5d2ceed6de9fb4946a6a4b48f32
parent 2faed9dd
...@@ -78,6 +78,7 @@ TEST(CordRingReaderTest, Reset) { ...@@ -78,6 +78,7 @@ TEST(CordRingReaderTest, Reset) {
EXPECT_TRUE(static_cast<bool>(reader)); EXPECT_TRUE(static_cast<bool>(reader));
EXPECT_THAT(reader.ring(), Eq(ring)); EXPECT_THAT(reader.ring(), Eq(ring));
EXPECT_THAT(reader.index(), Eq(ring->head())); EXPECT_THAT(reader.index(), Eq(ring->head()));
EXPECT_THAT(reader.node(), Eq(ring->entry_child(ring->head())));
EXPECT_THAT(reader.length(), Eq(ring->length)); EXPECT_THAT(reader.length(), Eq(ring->length));
EXPECT_THAT(reader.consumed(), Eq(flats[0].length())); EXPECT_THAT(reader.consumed(), Eq(flats[0].length()));
EXPECT_THAT(reader.remaining(), Eq(ring->length - reader.consumed())); EXPECT_THAT(reader.remaining(), Eq(ring->length - reader.consumed()));
...@@ -99,11 +100,13 @@ TEST(CordRingReaderTest, Next) { ...@@ -99,11 +100,13 @@ TEST(CordRingReaderTest, Next) {
size_t consumed = reader.consumed(); size_t consumed = reader.consumed();
size_t remaining = reader.remaining(); size_t remaining = reader.remaining();
for (int i = 1; i < flats.size(); ++i) { for (int i = 1; i < flats.size(); ++i) {
CordRepRing::index_type index = ring->advance(head, i);
consumed += flats[i].length(); consumed += flats[i].length();
remaining -= flats[i].length(); remaining -= flats[i].length();
absl::string_view next = reader.Next(); absl::string_view next = reader.Next();
ASSERT_THAT(next, Eq(flats[i])); ASSERT_THAT(next, Eq(flats[i]));
ASSERT_THAT(reader.index(), Eq(ring->advance(head, i))); ASSERT_THAT(reader.index(), Eq(index));
ASSERT_THAT(reader.node(), Eq(ring->entry_child(index)));
ASSERT_THAT(reader.consumed(), Eq(consumed)); ASSERT_THAT(reader.consumed(), Eq(consumed));
ASSERT_THAT(reader.remaining(), Eq(remaining)); ASSERT_THAT(reader.remaining(), Eq(remaining));
} }
...@@ -125,13 +128,15 @@ TEST(CordRingReaderTest, SeekForward) { ...@@ -125,13 +128,15 @@ TEST(CordRingReaderTest, SeekForward) {
size_t consumed = 0; size_t consumed = 0;
size_t remaining = ring->length;; size_t remaining = ring->length;;
for (int i = 0; i < flats.size(); ++i) { for (int i = 0; i < flats.size(); ++i) {
CordRepRing::index_type index = ring->advance(head, i);
size_t offset = consumed; size_t offset = consumed;
consumed += flats[i].length(); consumed += flats[i].length();
remaining -= flats[i].length(); remaining -= flats[i].length();
for (int off = 0; off < flats[i].length(); ++off) { for (int off = 0; off < flats[i].length(); ++off) {
absl::string_view chunk = reader.Seek(offset + off); absl::string_view chunk = reader.Seek(offset + off);
ASSERT_THAT(chunk, Eq(flats[i].substr(off))); ASSERT_THAT(chunk, Eq(flats[i].substr(off)));
ASSERT_THAT(reader.index(), Eq(ring->advance(head, i))); ASSERT_THAT(reader.index(), Eq(index));
ASSERT_THAT(reader.node(), Eq(ring->entry_child(index)));
ASSERT_THAT(reader.consumed(), Eq(consumed)); ASSERT_THAT(reader.consumed(), Eq(consumed));
ASSERT_THAT(reader.remaining(), Eq(remaining)); ASSERT_THAT(reader.remaining(), Eq(remaining));
} }
...@@ -150,11 +155,13 @@ TEST(CordRingReaderTest, SeekBackward) { ...@@ -150,11 +155,13 @@ TEST(CordRingReaderTest, SeekBackward) {
size_t consumed = ring->length; size_t consumed = ring->length;
size_t remaining = 0; size_t remaining = 0;
for (int i = flats.size() - 1; i >= 0; --i) { for (int i = flats.size() - 1; i >= 0; --i) {
CordRepRing::index_type index = ring->advance(head, i);
size_t offset = consumed - flats[i].length(); size_t offset = consumed - flats[i].length();
for (int off = 0; off < flats[i].length(); ++off) { for (int off = 0; off < flats[i].length(); ++off) {
absl::string_view chunk = reader.Seek(offset + off); absl::string_view chunk = reader.Seek(offset + off);
ASSERT_THAT(chunk, Eq(flats[i].substr(off))); ASSERT_THAT(chunk, Eq(flats[i].substr(off)));
ASSERT_THAT(reader.index(), Eq(ring->advance(head, i))); ASSERT_THAT(reader.index(), Eq(index));
ASSERT_THAT(reader.node(), Eq(ring->entry_child(index)));
ASSERT_THAT(reader.consumed(), Eq(consumed)); ASSERT_THAT(reader.consumed(), Eq(consumed));
ASSERT_THAT(reader.remaining(), Eq(remaining)); ASSERT_THAT(reader.remaining(), Eq(remaining));
} }
......
...@@ -40,6 +40,10 @@ class CordRepRingReader { ...@@ -40,6 +40,10 @@ class CordRepRingReader {
// The returned value is undefined if this instance is empty. // The returned value is undefined if this instance is empty.
CordRepRing::index_type index() const { return index_; } CordRepRing::index_type index() const { return index_; }
// Returns the current node inside the ring buffer for this instance.
// The returned value is undefined if this instance is empty.
CordRep* node() const { return ring_->entry_child(index_); }
// Returns the length of the referenced ring buffer. // Returns the length of the referenced ring buffer.
// Requires the current instance to be non empty. // Requires the current instance to be non empty.
size_t length() const { size_t length() const {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment