Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b91b8c51 authored by Myles Watson's avatar Myles Watson Committed by android-build-merger
Browse files

Merge "PDL: Fix Iterator assignment and add Subrange" am: e8dcf0c1 am:...

Merge "PDL: Fix Iterator assignment and add Subrange" am: e8dcf0c1 am: a58075ca am: f3ca581c am: 51491278
am: c37ec0e1

Change-Id: Ia6e3460aa3ca3deff38d3d838111abdaade32148
parents 2e809c14 c37ec0e1
Loading
Loading
Loading
Loading
+26 −8
Original line number Diff line number Diff line
@@ -25,9 +25,10 @@ template <bool little_endian>
Iterator<little_endian>::Iterator(std::forward_list<View> data, size_t offset) {
  data_ = data;
  index_ = offset;
  length_ = 0;
  begin_ = 0;
  end_ = 0;
  for (auto& view : data) {
    length_ += view.size();
    end_ += view.size();
  }
}

@@ -93,9 +94,10 @@ Iterator<little_endian>& Iterator<little_endian>::operator--() {

template <bool little_endian>
Iterator<little_endian>& Iterator<little_endian>::operator=(const Iterator<little_endian>& itr) {
  data_ = itr.data_;
  index_ = itr.index_;

  this->data_ = itr.data_;
  this->begin_ = itr.begin_;
  this->end_ = itr.end_;
  this->index_ = itr.index_;
  return *this;
}

@@ -131,7 +133,7 @@ bool Iterator<little_endian>::operator>=(const Iterator<little_endian>& itr) con

template <bool little_endian>
uint8_t Iterator<little_endian>::operator*() const {
  ASSERT_LOG(index_ < length_, "Index %zu out of bounds: %zu", index_, length_);
  ASSERT_LOG(index_ < end_ && !(begin_ > index_), "Index %zu out of bounds: [%zu,%zu)", index_, begin_, end_);
  size_t index = index_;

  for (auto view : data_) {
@@ -146,13 +148,29 @@ uint8_t Iterator<little_endian>::operator*() const {

template <bool little_endian>
size_t Iterator<little_endian>::NumBytesRemaining() const {
  if (length_ > index_) {
    return length_ - index_;
  if (end_ > index_ && !(begin_ > index_)) {
    return end_ - index_;
  } else {
    return 0;
  }
}

template <bool little_endian>
Iterator<little_endian> Iterator<little_endian>::Subrange(size_t index, size_t length) const {
  Iterator<little_endian> to_return(*this);
  if (to_return.NumBytesRemaining() > index) {
    to_return.index_ = to_return.index_ + index;
    to_return.begin_ = to_return.index_;
    if (to_return.NumBytesRemaining() >= length) {
      to_return.end_ = to_return.index_ + length;
    }
  } else {
    to_return.end_ = 0;
  }

  return to_return;
}

// Explicit instantiations for both types of Iterators.
template class Iterator<true>;
template class Iterator<false>;
+4 −1
Original line number Diff line number Diff line
@@ -60,6 +60,8 @@ class Iterator : public std::iterator<std::random_access_iterator_tag, uint8_t>

  size_t NumBytesRemaining() const;

  Iterator Subrange(size_t index, size_t length) const;

  // Get the next sizeof(FixedWidthPODType) bytes and return the filled type
  template <typename FixedWidthPODType>
  FixedWidthPODType extract() {
@@ -77,7 +79,8 @@ class Iterator : public std::iterator<std::random_access_iterator_tag, uint8_t>
 private:
  std::forward_list<View> data_;
  size_t index_;
  size_t length_;
  size_t begin_;
  size_t end_;
};

}  // namespace packet
+76 −1
Original line number Diff line number Diff line
@@ -273,7 +273,7 @@ TYPED_TEST(PacketViewTest, arrayOperatorTest) {
  ASSERT_EQ(0x1f, (*(this->packet))[working_index]);
}

TYPED_TEST(PacketViewTest, numBytesRemainingTest) {
TYPED_TEST(IteratorTest, numBytesRemainingTest) {
  auto all = this->packet->begin();
  size_t remaining = all.NumBytesRemaining();
  for (size_t n = remaining; n > 0; n--) {
@@ -288,6 +288,81 @@ TYPED_TEST(PacketViewTest, numBytesRemainingTest) {
  ASSERT_DEATH(*(all++), "");
}

TYPED_TEST(IteratorTest, subrangeTest) {
  auto empty = this->packet->begin().Subrange(0, 0);
  ASSERT_EQ(static_cast<size_t>(0), empty.NumBytesRemaining());
  ASSERT_DEATH(*empty, "");

  empty = this->packet->begin().Subrange(this->packet->size(), 1);
  ASSERT_EQ(static_cast<size_t>(0), empty.NumBytesRemaining());
  ASSERT_DEATH(*empty, "");

  auto all = this->packet->begin();
  auto fullrange = all.Subrange(0, all.NumBytesRemaining());
  ASSERT_EQ(all.NumBytesRemaining(), fullrange.NumBytesRemaining());
  ASSERT_EQ(*(all + 1), 1);

  fullrange = all.Subrange(0, all.NumBytesRemaining() + 1);
  ASSERT_EQ(all.NumBytesRemaining(), fullrange.NumBytesRemaining());
  ASSERT_EQ(*(all + 1), 1);

  fullrange = all.Subrange(0, all.NumBytesRemaining() + 10);
  ASSERT_EQ(all.NumBytesRemaining(), fullrange.NumBytesRemaining());
  ASSERT_EQ(*(all + 1), 1);

  auto subrange = all.Subrange(0, 1);
  ASSERT_EQ(1, subrange.NumBytesRemaining());
  ASSERT_EQ(*(subrange), 0);

  subrange = this->packet->begin().Subrange(0, 4);
  ASSERT_EQ(4, subrange.NumBytesRemaining());
  ASSERT_EQ(*(subrange + 1), 1);

  subrange = all.Subrange(0, 3);
  ASSERT_EQ(3, subrange.NumBytesRemaining());
  ASSERT_EQ(*(subrange + 1), 1);

  subrange = all.Subrange(0, all.NumBytesRemaining() - 1);
  ASSERT_EQ(all.NumBytesRemaining() - 1, subrange.NumBytesRemaining());
  ASSERT_EQ(*(subrange + 1), 1);

  subrange = all.Subrange(0, all.NumBytesRemaining() - 2);
  ASSERT_EQ(all.NumBytesRemaining() - 2, subrange.NumBytesRemaining());
  ASSERT_EQ(*(subrange + 1), 1);

  subrange = all.Subrange(1, all.NumBytesRemaining());
  ASSERT_EQ(all.NumBytesRemaining() - 1, subrange.NumBytesRemaining());
  ASSERT_EQ(*subrange, 1);

  subrange = all.Subrange(2, all.NumBytesRemaining());
  ASSERT_EQ(all.NumBytesRemaining() - 2, subrange.NumBytesRemaining());
  ASSERT_EQ(*subrange, 2);

  subrange = all.Subrange(1, all.NumBytesRemaining() - 1);
  ASSERT_EQ(all.NumBytesRemaining() - 1, subrange.NumBytesRemaining());
  ASSERT_EQ(*subrange, 1);

  subrange = all.Subrange(2, all.NumBytesRemaining() - 2);
  ASSERT_EQ(all.NumBytesRemaining() - 2, subrange.NumBytesRemaining());
  ASSERT_EQ(*subrange, 2);

  subrange = all.Subrange(1, 1);
  ASSERT_EQ(1, subrange.NumBytesRemaining());
  ASSERT_EQ(*(subrange), 1);

  subrange = all.Subrange(1, 2);
  ASSERT_EQ(2, subrange.NumBytesRemaining());
  ASSERT_EQ(*(subrange), 1);

  subrange = all.Subrange(2, 1);
  ASSERT_EQ(1, subrange.NumBytesRemaining());
  ASSERT_EQ(*(subrange), 2);

  subrange = this->packet->begin().Subrange(this->packet->size() - 1, 2);
  ASSERT_EQ(static_cast<size_t>(1), subrange.NumBytesRemaining());
  ASSERT_EQ(*(subrange), this->packet->size() - 1);
}

using SubviewTestParam = std::pair<size_t, size_t>;
class SubviewBaseTest : public ::testing::TestWithParam<SubviewTestParam> {
 public: