1*4d7e907cSAndroid Build Coastguard Worker /* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Worker #pragma once 18*4d7e907cSAndroid Build Coastguard Worker 19*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::bluetooth::audio { 20*4d7e907cSAndroid Build Coastguard Worker 21*4d7e907cSAndroid Build Coastguard Worker class A2dpBits { 22*4d7e907cSAndroid Build Coastguard Worker const uint8_t* cdata_; 23*4d7e907cSAndroid Build Coastguard Worker uint8_t* data_; 24*4d7e907cSAndroid Build Coastguard Worker 25*4d7e907cSAndroid Build Coastguard Worker public: A2dpBits(const std::vector<uint8_t> & vector)26*4d7e907cSAndroid Build Coastguard Worker A2dpBits(const std::vector<uint8_t>& vector) 27*4d7e907cSAndroid Build Coastguard Worker : cdata_(vector.data()), data_(nullptr) {} 28*4d7e907cSAndroid Build Coastguard Worker A2dpBits(std::vector<uint8_t> & vector)29*4d7e907cSAndroid Build Coastguard Worker A2dpBits(std::vector<uint8_t>& vector) 30*4d7e907cSAndroid Build Coastguard Worker : cdata_(vector.data()), data_(vector.data()) {} 31*4d7e907cSAndroid Build Coastguard Worker 32*4d7e907cSAndroid Build Coastguard Worker struct Range { 33*4d7e907cSAndroid Build Coastguard Worker const int first, len; RangeRange34*4d7e907cSAndroid Build Coastguard Worker constexpr Range(int first, int last) 35*4d7e907cSAndroid Build Coastguard Worker : first(first), len(last - first + 1) {} RangeRange36*4d7e907cSAndroid Build Coastguard Worker constexpr Range(int index) : first(index), len(1) {} 37*4d7e907cSAndroid Build Coastguard Worker }; 38*4d7e907cSAndroid Build Coastguard Worker get(int bit)39*4d7e907cSAndroid Build Coastguard Worker constexpr bool get(int bit) const { 40*4d7e907cSAndroid Build Coastguard Worker return (cdata_[bit >> 3] >> (7 - (bit & 7))) & 1; 41*4d7e907cSAndroid Build Coastguard Worker } 42*4d7e907cSAndroid Build Coastguard Worker get(const Range & range)43*4d7e907cSAndroid Build Coastguard Worker constexpr unsigned get(const Range& range) const { 44*4d7e907cSAndroid Build Coastguard Worker unsigned v(0); 45*4d7e907cSAndroid Build Coastguard Worker for (int i = 0; i < range.len; i++) 46*4d7e907cSAndroid Build Coastguard Worker v |= get(range.first + i) << ((range.len - 1) - i); 47*4d7e907cSAndroid Build Coastguard Worker return v; 48*4d7e907cSAndroid Build Coastguard Worker } 49*4d7e907cSAndroid Build Coastguard Worker 50*4d7e907cSAndroid Build Coastguard Worker constexpr void set(int bit, int value = 1) { 51*4d7e907cSAndroid Build Coastguard Worker uint8_t m = 1 << (7 - (bit & 7)); 52*4d7e907cSAndroid Build Coastguard Worker if (value) 53*4d7e907cSAndroid Build Coastguard Worker data_[bit >> 3] |= m; 54*4d7e907cSAndroid Build Coastguard Worker else 55*4d7e907cSAndroid Build Coastguard Worker data_[bit >> 3] &= ~m; 56*4d7e907cSAndroid Build Coastguard Worker } 57*4d7e907cSAndroid Build Coastguard Worker set(const Range & range,int value)58*4d7e907cSAndroid Build Coastguard Worker constexpr void set(const Range& range, int value) { 59*4d7e907cSAndroid Build Coastguard Worker for (int i = 0; i < range.len; i++) 60*4d7e907cSAndroid Build Coastguard Worker set(range.first + i, (value >> ((range.len - 1) - i)) & 1); 61*4d7e907cSAndroid Build Coastguard Worker } 62*4d7e907cSAndroid Build Coastguard Worker find_active_bit(const Range & range)63*4d7e907cSAndroid Build Coastguard Worker constexpr int find_active_bit(const Range& range) const { 64*4d7e907cSAndroid Build Coastguard Worker unsigned v = get(range); 65*4d7e907cSAndroid Build Coastguard Worker int i = 0; 66*4d7e907cSAndroid Build Coastguard Worker for (; i < range.len && ((v >> i) & 1) == 0; i++) 67*4d7e907cSAndroid Build Coastguard Worker ; 68*4d7e907cSAndroid Build Coastguard Worker return i < range.len && (v ^ (1 << i)) == 0 69*4d7e907cSAndroid Build Coastguard Worker ? range.first + (range.len - 1) - i 70*4d7e907cSAndroid Build Coastguard Worker : -1; 71*4d7e907cSAndroid Build Coastguard Worker } 72*4d7e907cSAndroid Build Coastguard Worker }; 73*4d7e907cSAndroid Build Coastguard Worker 74*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl::android::hardware::bluetooth::audio 75