예제 #1
0
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;
}
예제 #2
0
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;
}