Changeset 3588


Ignore:
Timestamp:
Mar 28, 2008, 4:46:36 PM (13 years ago)
Author:
orlov
Message:
  • operator==
File:
1 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/opents/samples/trefal.hh

    r3562 r3588  
    88class Expr;
    99
    10 typedef ts::TVar<Expr> TExpr;
     10class TExpr : public ts::TVar<Expr>
     11{
     12public:
     13    bool operator== (TExpr& _e);
     14};
    1115
    1216struct Term {
     
    1721    int i;
    1822    TExpr e;
     23
     24    void init (char _c) {
     25        type = CHAR;
     26        c = _c;
     27        i = 0;
     28        (Expr&)e;
     29    }
     30
     31    void init (int _i) {
     32        type = INT;
     33        c = 0;
     34        i = _i;
     35        (Expr&)e;
     36    }
     37
     38    void init (const TExpr& _e) {
     39        type = EXPR;
     40        c = 0;
     41        i = 0;
     42        e = _e;
     43    }
    1944};
     45
     46inline bool operator== (Term& _t1, Term& _t2) {
     47    return _t1.type == _t2.type && _t1.c == _t2.c && _t1.i == _t2.i && _t1.e == _t2.e;
     48}
     49
     50inline bool operator!= (Term& _t1, Term& _t2) {
     51    return !(_t1 == _t2);
     52}
    2053
    2154class Expr : private ts::TExtData
     
    5992
    6093        void init_str (const char* str, size_t len) {
    61             assert(!terms);
    62             terms = new Term[len];
    63             extDataSize() = len * sizeof(Term);
    64             for (unsigned i = 0; i < len; i++) {
    65                 terms[i].type = Term::CHAR;
    66                 terms[i].c = str[i];
    67                 ((Expr&)terms[i].e).init(0);
    68             }
     94            init(len);
     95            for (unsigned i = 0; i < len; i++)
     96                terms[i].init(str[i]);
    6997        }
    7098
    7199        void init_subexpr (const Expr& e, size_t start, size_t len) {
    72             assert(!terms);
    73             terms = new Term[len];
    74             extDataSize() = len * sizeof(Term);
     100            init(len);
    75101            copyFrom(e, start, len);
    76102        }
    77103
    78104        void init_paren (const TExpr& te) {
    79             assert(!terms);
    80             terms = new Term[1];
    81             extDataSize() = sizeof(Term);
    82             terms->type = Term::EXPR;
    83             terms->e = te;
     105            init(1);
     106            terms->init(te);
    84107        }
    85108
     
    122145        }
    123146
    124         Expr operator() () const {
    125             Expr e;
    126             e.init(1);
    127             Term* p = (Term *)e;
    128             p->type = Term::EXPR;
    129             p->e = *this;
    130             return e;
    131         }
     147//        Expr operator() () const {
     148//            Expr e;
     149//            e.init(1);
     150//            Term* p = (Term *)e;
     151//            p->type = Term::EXPR;
     152//            p->e = *this;
     153//            p->c = 0;
     154//            p->i = 0;
     155//            return e;
     156//        }
    132157
    133158        size_t get_len () const {
     
    179204        t.type = Term::CHAR;
    180205        is >> t.c;
    181         ((Expr &)(t.e)).init(0);
     206        t.i = 0;
     207        (Expr &)(t.e);
    182208    } else if ('0' <= c && c <= '9') {
    183209        t.type = Term::INT;
    184210        is >> t.i;
    185         ((Expr &)(t.e)).init(0);
     211        t.c = 0;
     212        (Expr &)(t.e);
    186213    } else if (c == '(') {
    187214        t.type = Term::EXPR;
     215        t.c = 0;
     216        t.i = 0;
    188217        is >> (Expr &)(t.e);
    189218    } else {
     
    227256    return e;
    228257}
     258
     259inline bool operator== (Expr& _e1, Expr& _e2) {
     260    size_t len = _e1.get_len();
     261    if (len != _e2.get_len())
     262        return false;
     263    Term* p = _e1;
     264    Term* q = _e2;
     265    for (unsigned i = 0; i < len; i++)
     266        if (*p++ != *q++)
     267            return false;
     268    return true;
     269}
     270
     271bool TExpr::operator== (TExpr& _e) {
     272    return d.cellOffset == _e.d.cellOffset || (Expr&)*this == (Expr&)_e;
     273}
     274
Note: See TracChangeset for help on using the changeset viewer.