1 /* Copyright (C) 2011 Wildfire Games. 2 * 3 * Permission is hereby granted, free of charge, to any person obtaining 4 * a copy of this software and associated documentation files (the 5 * "Software"), to deal in the Software without restriction, including 6 * without limitation the rights to use, copy, modify, merge, publish, 7 * distribute, sublicense, and/or sell copies of the Software, and to 8 * permit persons to whom the Software is furnished to do so, subject to 9 * the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 17 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 18 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 19 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 20 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 */ 22 23 /* 24 * FIFO bit queue 25 */ 26 27 #ifndef INCLUDED_ADTS_BIT_BUF 28 #define INCLUDED_ADTS_BIT_BUF 29 30 #include "lib/bits.h" 31 32 struct BitBuf 33 { 34 uintptr_t buf; 35 uintptr_t cur; // bit to be appended (toggled by add()) 36 size_t len; // |buf| [bits] 37 resetBitBuf38 void reset() 39 { 40 buf = 0; 41 cur = 0; 42 len = 0; 43 } 44 45 // toggle current bit if desired, and add to buffer (new bit is LSB) addBitBuf46 void add(uintptr_t toggle) 47 { 48 cur ^= toggle; 49 buf <<= 1; 50 buf |= cur; 51 len++; 52 } 53 54 // extract LS n bits extractBitBuf55 size_t extract(uintptr_t n) 56 { 57 const uintptr_t bits = buf & bit_mask<uintptr_t>(n); 58 buf >>= n; 59 60 return bits; 61 } 62 }; 63 64 #endif // #ifndef INCLUDED_ADTS_BIT_BUF 65