xref: /aosp_15_r20/external/openthread/third_party/tcplp/lib/bitmap.h (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2018, Sam Kumar <[email protected]>
3*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2018, University of California, Berkeley
4*cfb92d14SAndroid Build Coastguard Worker  *  All rights reserved.
5*cfb92d14SAndroid Build Coastguard Worker  *
6*cfb92d14SAndroid Build Coastguard Worker  *  Redistribution and use in source and binary forms, with or without
7*cfb92d14SAndroid Build Coastguard Worker  *  modification, are permitted provided that the following conditions are met:
8*cfb92d14SAndroid Build Coastguard Worker  *  1. Redistributions of source code must retain the above copyright
9*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer.
10*cfb92d14SAndroid Build Coastguard Worker  *  2. Redistributions in binary form must reproduce the above copyright
11*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer in the
12*cfb92d14SAndroid Build Coastguard Worker  *     documentation and/or other materials provided with the distribution.
13*cfb92d14SAndroid Build Coastguard Worker  *  3. Neither the name of the copyright holder nor the
14*cfb92d14SAndroid Build Coastguard Worker  *     names of its contributors may be used to endorse or promote products
15*cfb92d14SAndroid Build Coastguard Worker  *     derived from this software without specific prior written permission.
16*cfb92d14SAndroid Build Coastguard Worker  *
17*cfb92d14SAndroid Build Coastguard Worker  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18*cfb92d14SAndroid Build Coastguard Worker  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*cfb92d14SAndroid Build Coastguard Worker  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*cfb92d14SAndroid Build Coastguard Worker  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21*cfb92d14SAndroid Build Coastguard Worker  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22*cfb92d14SAndroid Build Coastguard Worker  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*cfb92d14SAndroid Build Coastguard Worker  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*cfb92d14SAndroid Build Coastguard Worker  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25*cfb92d14SAndroid Build Coastguard Worker  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26*cfb92d14SAndroid Build Coastguard Worker  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27*cfb92d14SAndroid Build Coastguard Worker  *  POSSIBILITY OF SUCH DAMAGE.
28*cfb92d14SAndroid Build Coastguard Worker  */
29*cfb92d14SAndroid Build Coastguard Worker 
30*cfb92d14SAndroid Build Coastguard Worker #ifndef BITMAP_H_
31*cfb92d14SAndroid Build Coastguard Worker #define BITMAP_H_
32*cfb92d14SAndroid Build Coastguard Worker 
33*cfb92d14SAndroid Build Coastguard Worker #include <stdint.h>
34*cfb92d14SAndroid Build Coastguard Worker #include <stdlib.h>
35*cfb92d14SAndroid Build Coastguard Worker 
36*cfb92d14SAndroid Build Coastguard Worker /* Computes the number of bytes required to store the specified number of bits. */
37*cfb92d14SAndroid Build Coastguard Worker #define BITS_TO_BYTES(bits) (((bits) >> 3) + (((bits) & 0x7) ? 1 : 0))
38*cfb92d14SAndroid Build Coastguard Worker 
39*cfb92d14SAndroid Build Coastguard Worker /* Initializes a bitmap to all zeros. */
40*cfb92d14SAndroid Build Coastguard Worker void bmp_init(uint8_t* buf, size_t numbytes);
41*cfb92d14SAndroid Build Coastguard Worker 
42*cfb92d14SAndroid Build Coastguard Worker /* Sets the specified range of bits. START is the index
43*cfb92d14SAndroid Build Coastguard Worker    of the first bit to be set. LEN is the number of bits
44*cfb92d14SAndroid Build Coastguard Worker    to be set. */
45*cfb92d14SAndroid Build Coastguard Worker void bmp_setrange(uint8_t* buf, size_t start, size_t len);
46*cfb92d14SAndroid Build Coastguard Worker 
47*cfb92d14SAndroid Build Coastguard Worker /* Clears the specified range of bits. START is the index
48*cfb92d14SAndroid Build Coastguard Worker    of the first bit to be cleared. LEN is the number of bits
49*cfb92d14SAndroid Build Coastguard Worker    to be cleared. */
50*cfb92d14SAndroid Build Coastguard Worker void bmp_clrrange(uint8_t* buf, size_t start, size_t len);
51*cfb92d14SAndroid Build Coastguard Worker 
52*cfb92d14SAndroid Build Coastguard Worker /* Counts the number of set bits in BUF starting at START. BUF has length
53*cfb92d14SAndroid Build Coastguard Worker    BUFLEN, in bytes. Counts the number of set bits until it either (1) finds
54*cfb92d14SAndroid Build Coastguard Worker    a bit that isn't set, in which case it returns the number of set bits,
55*cfb92d14SAndroid Build Coastguard Worker    (2) it has counted at least LIMIT bits, in which case it returns a number
56*cfb92d14SAndroid Build Coastguard Worker    greater than or equal to LIMIT, or (3) reaches the end of the buffer, in
57*cfb92d14SAndroid Build Coastguard Worker    which case it returns exactly the number of set bits it found. */
58*cfb92d14SAndroid Build Coastguard Worker size_t bmp_countset(uint8_t* buf, size_t buflen, size_t start, size_t limit);
59*cfb92d14SAndroid Build Coastguard Worker 
60*cfb92d14SAndroid Build Coastguard Worker /* Swaps two non-overlapping regions of the bitmap. START_1 is the index of
61*cfb92d14SAndroid Build Coastguard Worker    the first region, START_2 is the index of the secoind region, and LEN is
62*cfb92d14SAndroid Build Coastguard Worker    the length of each region, in bits. */
63*cfb92d14SAndroid Build Coastguard Worker void bmp_swap(uint8_t* buf, size_t start_1, size_t start_2, size_t len);
64*cfb92d14SAndroid Build Coastguard Worker 
65*cfb92d14SAndroid Build Coastguard Worker /* Returns 1 if the bitmap is all zeros, and 0 otherwise. */
66*cfb92d14SAndroid Build Coastguard Worker int bmp_isempty(uint8_t* buf, size_t buflen);
67*cfb92d14SAndroid Build Coastguard Worker 
68*cfb92d14SAndroid Build Coastguard Worker /* Prints out the bitmap in hexadecimal (used for debugging). */
69*cfb92d14SAndroid Build Coastguard Worker void bmp_print(uint8_t* buf, size_t buflen);
70*cfb92d14SAndroid Build Coastguard Worker 
71*cfb92d14SAndroid Build Coastguard Worker #endif
72