Loading system/gd/packet/iterator.cc +26 −8 Original line number Diff line number Diff line Loading @@ -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(); } } Loading Loading @@ -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; } Loading Loading @@ -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_) { Loading @@ -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>; Loading system/gd/packet/iterator.h +4 −1 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -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 Loading system/gd/packet/packet_view_unittest.cc +76 −1 Original line number Diff line number Diff line Loading @@ -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--) { Loading @@ -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: Loading Loading
system/gd/packet/iterator.cc +26 −8 Original line number Diff line number Diff line Loading @@ -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(); } } Loading Loading @@ -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; } Loading Loading @@ -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_) { Loading @@ -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>; Loading
system/gd/packet/iterator.h +4 −1 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -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 Loading
system/gd/packet/packet_view_unittest.cc +76 −1 Original line number Diff line number Diff line Loading @@ -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--) { Loading @@ -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: Loading