コード例 #1
0
void get_nge(int in[], int out[], int len)
{
	for(int i=0; i<len; i++)
	 {
		while(!s.empty() && in[s.top()] < in[i]) 
		{
			out[s.top()] = in[i];
			s.pop();
		}
		s.push(i);
	}
	for(; !s.empty(); s.pop()) {
		out[s.top()] = -1;
	}
}
コード例 #2
0
ファイル: rmachine.hpp プロジェクト: robertadamsnet/vm
inline
void RegisterMachine::v_execute(const code_t& code) {
  auto begin = code.begin();
  auto ip = begin;
  auto end = code.end();
  word_t word;
  if(ip == end) {
    word = 0;
  } else {
    word = *ip;
  }

  auto in_bounds = [&] {
    return ip >= begin && ip < end;
  };

  move_instr_t instr;
  auto get_word = [&] {
    if(in_bounds()) {
      word = *ip++;
      instr.word = word;
    }
  };

  auto get_source = [&] {
    switch(instr.record.source) {
    case Register:
      // set source pointer to register indicated by.source_reg
      return reg_[instr.record.source_reg];
    case Code:
      get_word();
      return word;
    case Stack:
      get_word();
      return word < stack_.size() ? stack_[word] : 0;
      break;  
      // TODO: implement this
    }
    return (word_t)0;
  };

  auto do_move = [&] {
    reg_[instr.record.target_reg] = get_source();
  };

  auto do_add = [&] {
    reg_[instr.record.target_reg] += get_source();
  };

  auto do_sub = [&] {
    reg_[instr.record.target_reg] -= get_source();
  };

  auto do_mul = [&] {
    reg_[instr.record.target_reg] *= get_source();
  };

  auto do_div = [&] {
    reg_[instr.record.target_reg] /= get_source();
  };

  auto do_jump = [&] {
    get_word();
    ip = begin + word;
  };

  while(in_bounds()) {
    get_word();
    switch(instr.record.op) {
    case Op::Move:
      do_move(); 
      break;
    case Op::Add:
      do_add();
      break;
    case Op::Sub:
      do_sub();
      break;
    case Op::Mul:
      do_mul();
      break;
    case Op::Div:
      do_div();
      break;
    case Op::Dump:
      do_dump();
      break;
    case Op::Jump:
      do_jump();
      break;
    }
  }
}
コード例 #3
0
 void push(value_type v)
 {
     m_stack.push(v);
 }
コード例 #4
0
 void pop()
 {
     m_stack.pop();
 }
コード例 #5
0
 value_type &top()
 {
     return m_stack.top();
 }
コード例 #6
0
 bool empty() const
 {
     return m_stack.empty();
 }