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; } }
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; } } }
void push(value_type v) { m_stack.push(v); }
void pop() { m_stack.pop(); }
value_type &top() { return m_stack.top(); }
bool empty() const { return m_stack.empty(); }