/* * Copyright 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "iterator.h" #include #include "packet.h" namespace bluetooth { Iterator::Iterator(std::shared_ptr packet, size_t i) { packet_ = packet; index_ = i; CHECK_GE(index_, packet->packet_start_index_); CHECK_LE(index_, packet->packet_end_index_); } Iterator::Iterator(const Iterator& itr) { *this = itr; } Iterator Iterator::operator+(size_t offset) { auto itr(*this); return itr += offset; } Iterator& Iterator::operator+=(size_t offset) { size_t new_offset = index_ + offset; index_ = new_offset > packet_->packet_end_index_ ? packet_->packet_end_index_ : new_offset; return *this; } Iterator Iterator::operator++(int) { auto itr(*this); index_++; if (index_ > packet_->packet_end_index_) index_ = packet_->packet_end_index_; return itr; } Iterator& Iterator::operator++() { index_++; if (index_ > packet_->packet_end_index_) index_ = packet_->packet_end_index_; return *this; } Iterator Iterator::operator-(size_t offset) { auto itr(*this); return itr -= offset; } int Iterator::operator-(const Iterator& itr) { return index_ - itr.index_; } Iterator& Iterator::operator-=(size_t offset) { index_ = (index_ < offset || index_ - offset < packet_->packet_start_index_) ? packet_->packet_start_index_ : index_ - offset; return *this; } Iterator Iterator::operator--(int) { auto itr(*this); if (index_ != packet_->packet_start_index_) index_--; return itr; } Iterator& Iterator::operator--() { if (index_ != packet_->packet_start_index_) index_--; return *this; } Iterator& Iterator::operator=(const Iterator& itr) { packet_ = itr.packet_; index_ = itr.index_; return *this; } bool Iterator::operator==(const Iterator& itr) const { return ((packet_ == itr.packet_) && (index_ == itr.index_)); } bool Iterator::operator!=(const Iterator& itr) const { return !(*this == itr); } bool Iterator::operator<(const Iterator& itr) const { return ((packet_ == itr.packet_) && (index_ < itr.index_)); } bool Iterator::operator>(const Iterator& itr) const { return ((packet_ == itr.packet_) && (index_ > itr.index_)); } bool Iterator::operator<=(const Iterator& itr) const { return ((packet_ == itr.packet_) && (index_ <= itr.index_)); } bool Iterator::operator>=(const Iterator& itr) const { return ((packet_ == itr.packet_) && (index_ >= itr.index_)); } uint8_t Iterator::operator*() const { CHECK_NE(index_, packet_->packet_end_index_); return packet_->get_at_index(index_); } } // namespace bluetooth