/* * Set the value in the map at wordPointer to bit. */ void heapMapAtWordPut(void *wordPointer, int bit) { ulong address = (ulong)wordPointer; uchar **directory, *page; if ((address & ((1<<LOGWORDSIZE)-1))) error("misaligned word"); if (!(directory = mapPages[DIRECTORYINDEX(address)])) { if (!(directory = malloc(DIRECTORYSIZE))) { perror("heapMap malloc"); exit(1); } mapPages[DIRECTORYINDEX(address)] = directory; memset(directory,0,DIRECTORYSIZE); } if (!(page = directory[PAGEINDEX(address)])) { if (!(page = malloc(PAGESIZE))) { perror("heapMap malloc"); exit(1); } directory[PAGEINDEX(address)] = page; memset(page,0,PAGESIZE); } if (bit) page[BYTEINDEX(address)] |= 1 << BITINDEX(address); else page[BYTEINDEX(address)] &= (uchar)-1 ^ (1 << BITINDEX(address)); }
/* * Answer non-zero if the heapMap is set at wordPointer, 0 otherwise */ int heapMapAtWord(void *wordPointer) { ulong address = (ulong)wordPointer; uchar *page = mapPages[PAGEINDEX(address)]; if ((address & ((1<<LOGWORDSIZE)-1))) error("misaligned word"); return page ? page[BYTEINDEX(address)] & (1 << BITINDEX(address)) : 0; }
/* * Answer non-zero if the heapMap is set at wordPointer, 0 otherwise */ int heapMapAtWord(void *wordPointer) { ulong address = (ulong)wordPointer; uchar **directory, *page; if ((address & ((1<<LOGWORDSIZE)-1))) error("misaligned word"); if (!(directory = mapPages[DIRECTORYINDEX(address)])) return 0; page = directory[PAGEINDEX(address)]; return page ? page[BYTEINDEX(address)] & (1 << BITINDEX(address)) : 0; }
size_t BitSet::oldGetCount(size_t from, size_t to) const { if(to >= m_capacity) { to = m_capacity; } if(from > to) { return 0; } size_t fromIndex = BYTEINDEX(from); size_t toIndex = BYTEINDEX(to ); const BYTE *p = (const BYTE*)m_p; if(fromIndex < toIndex) { size_t result; if(from % 8) { result = setBitsCount[p[fromIndex] & ~_BS_MASKATOM(from%8)]; fromIndex++; } else { result = 0; } if((to+1) % 8) { result += setBitsCount[p[toIndex] & _BS_MASKATOM(to%8+1)]; toIndex--; } intptr_t j = toIndex - fromIndex + 1; if(j > 0) { for(p += fromIndex; j--;) { result += setBitsCount[*(p++)]; } } return result; } else { return setBitsCount[p[fromIndex] & (~_BS_MASKATOM(from%8) & _BS_MASKATOM(to%8+1))]; } }
intptr_t BitSet::oldGetIndex(size_t i) const { if(!contains(i)) { return -1; } const BYTE *p = (const BYTE*)m_p; const bool frac = (i%8) ? true : false; long result = 0; for(size_t j = BYTEINDEX(i)+(frac?1:0); j--;) { result += setBitsCount[*(p++)]; } if(frac) { p--; result -= setBitsCount[*p & ~((1 << (i%8))-1)]; } return result; }