예제 #1
0
        }                                                                         //#define ST2 m_precompiled[ptr-2].value()

        //#define OP(OP, ADJ, EXPR) \
        //    case OP: \
        //        if (ADJ == 2) {\
        //            if (m_precompiled[ptr-3].cmd() == PUSH_CONST && m_precompiled[ptr-2].cmd() == PUSH_CONST && m_precompiled[ptr-1].cmd() == PUSH_CONST) \
        //            {   ptr--; m_precompiled[ptr-2] = rpn_inst(EXPR); n -= 3; ptr++; std::copy(m_precompiled.begin()+(ptr+1), m_precompiled.end(), m_precompiled.begin()+(ptr-2)); ptr-=2;} \
        //            else { ptr++; } \
        //        } else if (ADJ == 1) {\
        //            if (m_precompiled[ptr-2].cmd() == PUSH_CONST && m_precompiled[ptr-1].cmd() == PUSH_CONST) \
        //            {   m_precompiled[ptr-2] = rpn_inst(EXPR); n -= 2; std::copy(m_precompiled.begin()+(ptr+1), m_precompiled.end(), m_precompiled.begin()+(ptr-1)); ptr--;} \
        //            else { ptr++; } \
        //        } else if (ADJ == 0) {\
        //            if (m_precompiled[ptr-1].cmd() == PUSH_CONST) \
        //            { ptr++; m_precompiled[ptr-2] = rpn_inst(EXPR); n -= 1; ptr--; std::copy(m_precompiled.begin()+(ptr+1), m_precompiled.end(), m_precompiled.begin()+(ptr)); } \
        //            else { ptr++; } \
        //        } else ptr++; \
        //        break;
        void compress_OP(ref unsigned ptr, ref size_t n, int ADJ, NT EXPR)
        {
            if (ADJ == 2)
            {
                if (m_precompiled[ptr - 3].cmd() == rpn_cmd.PUSH_CONST && m_precompiled[ptr - 2].cmd() == rpn_cmd.PUSH_CONST && m_precompiled[ptr - 1].cmd() == rpn_cmd.PUSH_CONST)
                {
                    ptr--;
                    m_precompiled[ptr - 2] = new rpn_inst(EXPR);
                    n -= 3;
                    ptr++;
                    m_precompiled.CopyTo((int)ptr + 1, m_precompiled, (int)ptr - 2, ((int)ptr + 1) - m_precompiled.Count);
                    ptr -= 2;
                }
                else
                {
                    ptr++;
                }
            }
            else if (ADJ == 1)
            {
                if (m_precompiled[ptr - 2].cmd() == rpn_cmd.PUSH_CONST && m_precompiled[ptr - 1].cmd() == rpn_cmd.PUSH_CONST)
                {
                    m_precompiled[ptr - 2] = new rpn_inst(EXPR);
                    n -= 2;
                    m_precompiled.CopyTo((int)ptr + 1, m_precompiled, (int)ptr - 1, ((int)ptr + 1) - m_precompiled.Count);
                    ptr--;
                }
                else
                {
                    ptr++;
                }
            }
            else if (ADJ == 0)
            {
                if (m_precompiled[ptr - 1].cmd() == rpn_cmd.PUSH_CONST)
                {
                    ptr++;
                    m_precompiled[ptr - 2] = new rpn_inst(EXPR);
                    n -= 1;
                    ptr--;
                    m_precompiled.CopyTo((int)ptr + 1, m_precompiled, (int)ptr, ((int)ptr + 1) - m_precompiled.Count);//std::copy(m_precompiled.begin() + (ptr + 1), m_precompiled.end(), m_precompiled.begin() + (ptr));
                }
                else
                {
                    ptr++;
                }
            }
            else
            {
                ptr++;
            }
        }