source: icGREP/icgrep-devel/icgrep/pablo/branch.h @ 5836

Last change on this file since 5836 was 5836, checked in by nmedfort, 18 months ago

Added PabloBlock/Builder? createScope() methods + minor code changes.

File size: 2.2 KB
Line 
1#ifndef BRANCH_H
2#define BRANCH_H
3
4#include <pablo/pabloAST.h>
5namespace pablo { class Var; }
6namespace pablo { class PabloBlock; }
7
8namespace pablo {
9
10class Branch : public Statement {
11    friend class PabloBlock;
12    friend class Statement;
13    friend class Simplifier;
14public:
15    using EscapedVars = std::vector<Var *>;
16    static bool classof(const PabloAST * e) {
17        switch (e->getClassTypeId()) {
18            case ClassTypeId::If:
19            case ClassTypeId::While:
20                return true;
21            default:
22                return false;
23        }
24    }
25    static bool classof(const void *) {
26        return false;
27    }
28    PabloAST * getCondition() const {
29        return getOperand(0);
30    }
31    void setCondition(PabloAST * const condition) {
32        return setOperand(0, condition);
33    }
34    PabloBlock * getBody() const {
35        return mBody;
36    }
37    bool isRegular() const {
38        return mRegular;
39    }
40    void setRegular(const bool value) {
41        mRegular = value;
42    }
43    PabloBlock * setBody(PabloBlock * const body);
44    EscapedVars getEscaped() const;
45protected:
46    void addEscaped(PabloAST * const node);
47    void removeEscaped(PabloAST * const node);
48    Branch(const ClassTypeId typeId, PabloAST * condition, PabloBlock * body, Allocator & allocator);
49protected:
50    PabloBlock *    mBody;
51    unsigned        mEscapedCount;
52    unsigned        mEscapedCapacity;
53    PabloAST **     mEscaped;
54    bool            mRegular;
55};
56
57class If final : public Branch {
58    friend class PabloBlock;
59    friend class Statement;
60    friend class Simplifier;
61public:
62    static inline bool classof(const PabloAST * e) {
63        return e->getClassTypeId() == ClassTypeId::If;
64    }
65protected:
66    If(PabloAST * condition, PabloBlock * body, Allocator & allocator)
67    : Branch(ClassTypeId::If, condition, body, allocator) {
68
69    }
70};
71
72class While final : public Branch {
73    friend class PabloBlock;
74    friend class Statement;
75    friend class Simplifier;
76public:
77    static inline bool classof(const PabloAST * e) {
78        return e->getClassTypeId() == ClassTypeId::While;
79    }
80protected:
81    While(PabloAST * condition, PabloBlock * body, Allocator & allocator)
82    : Branch(ClassTypeId::While, condition, body, allocator) {
83
84    }
85};
86
87
88}
89
90#endif // BRANCH_H
Note: See TracBrowser for help on using the repository browser.