• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "softbus_bitmap.h"
17 #include <stddef.h>
18 
19 #define UINT32_BITNUM 32
20 
SoftbusBitmapSet(uint32_t * bitmap,const uint8_t pos)21 void SoftbusBitmapSet(uint32_t *bitmap, const uint8_t pos)
22 {
23     if (bitmap == NULL || pos >= UINT32_BITNUM) {
24         return;
25     }
26     *bitmap |= 1U << pos;
27 }
28 
SoftbusBitmapClr(uint32_t * bitmap,const uint8_t pos)29 void SoftbusBitmapClr(uint32_t *bitmap, const uint8_t pos)
30 {
31     if (bitmap == NULL || pos >= UINT32_BITNUM) {
32         return;
33     }
34     *bitmap &= ~(1U << pos);
35 }
36 
SoftbusBitmapSetBits(uint32_t * bitmap,const uint8_t start,const uint8_t nums)37 void SoftbusBitmapSetBits(uint32_t *bitmap, const uint8_t start, const uint8_t nums)
38 {
39     if (bitmap == NULL || start > UINT32_BITNUM || (start + nums) > UINT32_BITNUM || nums == 0) {
40         return;
41     }
42     *bitmap |= (UINT32_MAX - ((((1U << ((start + nums - 1U))) - 1U)) & (~((1U << ((start - 1U))) - 1U))));
43 }
44 
SoftbusBitmapClrBits(uint32_t * bitmap,const uint8_t start,const uint8_t nums)45 void SoftbusBitmapClrBits(uint32_t *bitmap, const uint8_t start, const uint8_t nums)
46 {
47     if (bitmap == NULL || start > UINT32_BITNUM || (start + nums) > UINT32_BITNUM || nums == 0) {
48         return;
49     }
50     *bitmap &= ((((1U << ((start + nums - 1U))) - 1U)) & (~((1U << ((start - 1U))) - 1U)));
51 }
52 
SoftbusLowBitGet(uint32_t bitmap)53 uint8_t SoftbusLowBitGet(uint32_t bitmap)
54 {
55     uint8_t pos = 0;
56     while (bitmap > 0) {
57         pos++;
58         if (bitmap & 0X1) {
59             return pos;
60         }
61         bitmap = bitmap >> 1;
62     }
63     return 0;
64 }
65 
SoftbusHighBitGet(uint32_t bitmap)66 uint8_t SoftbusHighBitGet(uint32_t bitmap)
67 {
68     uint8_t pos = 0;
69     while (bitmap > 0) {
70         bitmap = bitmap >> 1U;
71         pos++;
72     }
73     return pos;
74 }
75 
SoftbusIsBitmapSet(const uint32_t * bitmap,const uint8_t pos)76 bool SoftbusIsBitmapSet(const uint32_t *bitmap, const uint8_t pos)
77 {
78     if (bitmap == NULL || pos >= UINT32_BITNUM) {
79         return false;
80     }
81     bool flag = ((1U << pos) & (*bitmap)) ? true : false;
82     return flag;
83 }