• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "packet/bit_inserter.h"
18 
19 #include "os/log.h"
20 
21 namespace bluetooth {
22 namespace packet {
23 
BitInserter(std::vector<uint8_t> & vector)24 BitInserter::BitInserter(std::vector<uint8_t>& vector) : ByteInserter(vector) {}
25 
~BitInserter()26 BitInserter::~BitInserter() {
27   ASSERT(num_saved_bits_ == 0);
28 }
29 
insert_bits(uint8_t byte,size_t num_bits)30 void BitInserter::insert_bits(uint8_t byte, size_t num_bits) {
31   size_t total_bits = num_bits + num_saved_bits_;
32   uint16_t new_value = static_cast<uint8_t>(saved_bits_) | (static_cast<uint16_t>(byte) << num_saved_bits_);
33   if (total_bits >= 8) {
34     ByteInserter::insert_byte(static_cast<uint8_t>(new_value));
35     total_bits -= 8;
36     new_value = new_value >> 8;
37   }
38   num_saved_bits_ = total_bits;
39   uint8_t mask = static_cast<uint8_t>(0xff) >> (8 - num_saved_bits_);
40   saved_bits_ = static_cast<uint8_t>(new_value) & mask;
41 }
42 
insert_byte(uint8_t byte)43 void BitInserter::insert_byte(uint8_t byte) {
44   insert_bits(byte, 8);
45 }
46 
47 }  // namespace packet
48 }  // namespace bluetooth
49