Ignore:
Timestamp:
Nov 16, 2015, 10:01:04 PM (4 years ago)
Author:
nmedfort
Message:

First stage in making And/Or/Xor? statements n-ary statements.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/pablo/pabloAST.cpp

    r4871 r4873  
    4343        } else if (const And* and1 = dyn_cast<const And>(expr1)) {
    4444            if (const And* and2 = cast<const And>(expr2)) {
    45                 if (equals(and1->getExpr1(), and2->getExpr1())) {
    46                     return equals(and1->getExpr2(), and2->getExpr2());
    47                 } else if (equals(and1->getExpr1(), and2->getExpr2())) {
    48                     return equals(and1->getExpr2(), and2->getExpr1());
     45                if (equals(and1->getOperand(0), and2->getOperand(0))) {
     46                    return equals(and1->getOperand(1), and2->getOperand(1));
     47                } else if (equals(and1->getOperand(0), and2->getOperand(1))) {
     48                    return equals(and1->getOperand(1), and2->getOperand(0));
    4949                }
    5050            }
    5151        } else if (const Or * or1 = dyn_cast<const Or>(expr1)) {
    5252            if (const Or* or2 = cast<const Or>(expr2)) {
    53                 if (equals(or1->getExpr1(), or2->getExpr1())) {
    54                     return equals(or1->getExpr2(), or2->getExpr2());
    55                 } else if (equals(or1->getExpr1(), or2->getExpr2())) {
    56                     return equals(or1->getExpr2(), or2->getExpr1());
     53                if (equals(or1->getOperand(0), or2->getOperand(0))) {
     54                    return equals(or1->getOperand(1), or2->getOperand(1));
     55                } else if (equals(or1->getOperand(0), or2->getOperand(1))) {
     56                    return equals(or1->getOperand(1), or2->getOperand(0));
    5757                }
    5858            }
    5959        } else if (const Xor * xor1 = dyn_cast<const Xor>(expr1)) {
    6060            if (const Xor * xor2 = cast<const Xor>(expr2)) {
    61                 if (equals(xor1->getExpr1(), xor2->getExpr1())) {
    62                     return equals(xor1->getExpr2(), xor2->getExpr2());
    63                 } else if (equals(xor1->getExpr1(), xor2->getExpr2())) {
    64                     return equals(xor1->getExpr2(), xor2->getExpr1());
     61                if (equals(xor1->getOperand(0), xor2->getOperand(0))) {
     62                    return equals(xor1->getOperand(1), xor2->getOperand(1));
     63                } else if (equals(xor1->getOperand(0), xor2->getOperand(1))) {
     64                    return equals(xor1->getOperand(1), xor2->getOperand(0));
    6565                }
    6666            }
     
    374374
    375375/** ------------------------------------------------------------------------------------------------------------- *
     376 * @brief addOperand
     377 ** ------------------------------------------------------------------------------------------------------------- */
     378void Variadic::addOperand(PabloAST * expr) {
     379    unsigned index = 0;
     380    for (; index != mOperands; ++index) {
     381        if (mOperand[index] > expr) {
     382            break;
     383        }
     384    }
     385    if (mOperands == mCapacity) {
     386        mCapacity = std::max<unsigned>(mCapacity * 2, 2);
     387        PabloAST ** expandedArray = reinterpret_cast<PabloAST**>(mAllocator.allocate(mOperands * sizeof(PabloAST *)));
     388        std::memcpy(expandedArray, mOperand, mOperands * sizeof(PabloAST *));
     389        mAllocator.deallocate(reinterpret_cast<Allocator::pointer>(mOperand));
     390        mOperand = expandedArray;
     391    }
     392    std::memcpy(mOperand + index + 1, mOperand + index, (mOperands - index) * sizeof(PabloAST *));
     393    mOperand[index] = expr;
     394    ++mOperands;
     395}
     396
     397/** ------------------------------------------------------------------------------------------------------------- *
     398 * @brief removeOperand
     399 ** ------------------------------------------------------------------------------------------------------------- */
     400void Variadic::removeOperand(const unsigned index) {
     401    assert (index < getNumOperands());
     402    std::memcpy(mOperand + index, mOperand + index + 1, (mOperands - index - 1) * sizeof(PabloAST *));
     403    --mOperands;
     404}
     405
     406/** ------------------------------------------------------------------------------------------------------------- *
    376407 * @brief contains
    377408 ** ------------------------------------------------------------------------------------------------------------- */
Note: See TracChangeset for help on using the changeset viewer.