/* * 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. */ #pragma once #include #include namespace bluetooth { // Forward declare Packet class class Packet; // Iterator is a custom iterator class for Packets. class Iterator : public std::iterator { public: Iterator(std::shared_ptr packet, size_t i); Iterator(const Iterator& itr); // All addition and subtraction operators are bounded from 0 to the length of // the packet. Iterator operator+(size_t offset); Iterator& operator+=(size_t offset); Iterator operator++(int); Iterator& operator++(); Iterator operator-(size_t offset); int operator-(const Iterator& itr); Iterator& operator-=(size_t offset); Iterator operator--(int); Iterator& operator--(); Iterator& operator=(const Iterator& itr); bool operator!=(const Iterator& itr) const; bool operator==(const Iterator& itr) const; bool operator<(const Iterator& itr) const; bool operator>(const Iterator& itr) const; bool operator<=(const Iterator& itr) const; bool operator>=(const Iterator& itr) const; uint8_t operator*() const; template FixedWidthIntegerType extract() { static_assert(std::is_integral::value, "Iterator::extract requires an integral type."); FixedWidthIntegerType extracted_value = 0; for (size_t i = 0; i < sizeof(FixedWidthIntegerType); i++) { extracted_value |= static_cast(**this) << i * 8; (*this)++; } return extracted_value; } // Extract in Little Endian Format template FixedWidthIntegerType extractBE() { static_assert(std::is_integral::value, "Iterator::extract requires an integral type."); FixedWidthIntegerType extracted_value = 0; for (size_t i = 0; i < sizeof(FixedWidthIntegerType); i++) { extracted_value |= static_cast(**this) << (sizeof(FixedWidthIntegerType) - 1 - i) * 8; (*this)++; } return extracted_value; } uint8_t extract8() { return extract(); } uint16_t extract16() { return extract(); } uint32_t extract32() { return extract(); } uint64_t extract64() { return extract(); } private: std::shared_ptr packet_; size_t index_; }; // Iterator } // namespace bluetooth