uint64_t RSDic::SelectOutBlock(uint64_t bit, uint64_t& rank) const { // binary search over tables uint64_t left = 0; uint64_t right = rank_tables_.size(); while (left < right){ uint64_t mid = (left + right) / 2; uint64_t length = BLOCK_BITNUM * TABLE_INTERVAL * mid; if (GetBitNum(rank_tables_[mid], length, bit) < rank) { left = mid+1; } else { right = mid; } } uint64_t table_ind = (left != 0) ? left - 1: 0; uint64_t block_pos = table_ind * TABLE_INTERVAL; rank -= GetBitNum(rank_tables_[table_ind], block_pos * BLOCK_BITNUM, bit); // sequential search over blocks for ( ; block_pos < bit_blocks_.size(); ++block_pos){ uint64_t rank_next= GetBitNum(PopCount(bit_blocks_[block_pos]), BLOCK_BITNUM, bit); if (rank <= rank_next){ break; } rank -= rank_next; } return block_pos; }
dboolean G_BindActionByEvent(event_t *ev, char *action) { int button; alist_t **plist; plist = NULL; switch(ev->type) { case ev_keydown: // // HACK: ignore capslock // if(ev->data1 == KEY_CAPS) return false; plist = &KeyActions[ev->data1]; break; case ev_mouse: case ev_mousedown: button = GetBitNum(ev->data1); if((button >= 0) && (button < MOUSE_BUTTONS)) plist = &MouseActions[button]; break; } if(plist) { G_BindAction(plist, action); return true; } return false; }