| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 ********************************************************************** | |
| 3 * Copyright (c) 2002-2005, International Business Machines | |
| 4 * Corporation and others. All Rights Reserved. | |
| 5 ********************************************************************** | |
| 6 * 2002-09-20 aliu Created. | |
| 7 */ | |
| 8 | |
| 9 #include "unicode/utypes.h" | |
| 10 #include "cmemory.h" | |
| 11 #include "bitset.h" | |
| 12 | |
| 13 // TODO: have a separate capacity, so the len can just be set to | |
| 14 // zero in the clearAll() method, and growth can be smarter. | |
| 15 | |
| 16 const int32_t SLOP = 8; | |
| 17 | |
| 18 const int32_t BYTES_PER_WORD = sizeof(int32_t); | |
| 19 | |
| 20 BitSet::BitSet() { | |
| 21 len = SLOP; | |
| 22 data = (int32_t*) uprv_malloc(len * BYTES_PER_WORD); | |
| 23 clearAll(); | |
| 24 } | |
| 25 | |
| 26 BitSet::~BitSet() { | |
| 27 uprv_free(data); | |
| 28 } | |
| 29 | |
| 30 UBool BitSet::get(int32_t bitIndex) const { | |
| 31 uint32_t longIndex = bitIndex >> 5; | |
| 32 int32_t bitInLong = bitIndex & 0x1F; | |
| 33 return (longIndex < len) ? (((data[longIndex] >> bitInLong) & 1) != 0) | |
| 34 : FALSE; | |
| 35 } | |
| 36 | |
| 37 void BitSet::set(int32_t bitIndex) { | |
| 38 uint32_t longIndex = bitIndex >> 5; | |
| 39 int32_t bitInLong = bitIndex & 0x1F; | |
| 40 if (longIndex >= len) { | |
| 41 ensureCapacity(longIndex+1); | |
| 42 } | |
| 43 data[longIndex] |= (1 << bitInLong); | |
| 44 } | |
| 45 | |
| 46 void BitSet::clearAll() { | |
| 47 for (uint32_t i=0; i<len; ++i) data[i] = 0; | |
| 48 } | |
| 49 | |
| 50 void BitSet::ensureCapacity(uint32_t minLen) { | |
| 51 uint32_t newLen = len; | |
| 52 while (newLen < minLen) newLen <<= 1; // grow exponentially | |
| 53 int32_t* newData = (int32_t*) uprv_malloc(newLen * BYTES_PER_WORD); | |
| 54 uprv_memcpy(newData, data, len * BYTES_PER_WORD); | |
| 55 uprv_free(data); | |
| 56 data = newData; | |
| 57 int32_t* p = data + len; | |
| 58 int32_t* limit = data + newLen; | |
| 59 while (p < limit) *p++ = 0; | |
| 60 len = newLen; | |
| 61 } | |
| 62 | |
| 63 //eof | |
| OLD | NEW |