source: icGREP/icgrep-devel/icgrep/re/re_name.h @ 4438

Last change on this file since 4438 was 4438, checked in by nmedfort, 4 years ago

Preliminary steps for removal of superfluous Assigns.

File size: 3.1 KB
Line 
1#ifndef RE_NAME_H
2#define RE_NAME_H
3
4#include <re/re_re.h>
5#include <re/re_cc.h>
6#include <string>
7#include <re/printer_re.h>
8
9namespace pablo {
10    class PabloAST;
11}
12
13
14namespace re {
15
16class Name : public RE {
17public:
18    static inline bool classof(const RE * re) {
19        return re->getClassTypeId() == ClassTypeId::Name;
20    }
21    static inline bool classof(const void *) {
22        return false;
23    }
24    enum class Type {
25        Byte
26        , Unicode
27        , UnicodeProperty
28        , Unknown
29    };
30    const std::string & getNamespace() const;
31    const std::string & getName() const;
32    void setName(std::string);
33    Type getType() const;
34    RE *getDefinition() const;
35    pablo::PabloAST * getCompiled() const {
36        return mCompiled;
37    }
38    void setCompiled(pablo::PabloAST * var) {
39        mCompiled = var;
40    }
41    void setDefinition(RE * def);
42    virtual ~Name() {}
43protected:
44    friend Name * makeName(const std::string, RE *);   
45    friend Name * makeByteName(const std::string, RE *);
46    friend Name * makeName(const std::string, const Type);
47    friend Name * makeName(const std::string, const std::string, const Type);   
48    void* operator new (std::size_t size) noexcept {
49        return mAllocator.allocate(size);
50    }
51    Name(const std::string && nameSpace, const std::string && name, const Type type, RE * defn)
52    : RE(ClassTypeId::Name)
53    , mNamespace(std::move(nameSpace))
54    , mName(std::move(name))
55    , mType(type)
56    , mDefiningRE(defn)
57    , mCompiled(nullptr)
58    {
59
60    }
61
62private:
63    std::string         mNamespace;
64    std::string         mName;
65    const Type          mType;
66    RE *                mDefiningRE;
67    pablo::PabloAST *   mCompiled;
68};
69
70inline const std::string & Name::getNamespace() const {
71    return mNamespace;
72}
73
74    inline const std::string & Name::getName() const {
75        return mName;
76    }
77   
78    inline void Name::setName(std::string n) {
79        mName = n;
80    }
81   
82inline Name::Type Name::getType() const {
83    return mType;
84}
85
86inline RE * Name::getDefinition() const {
87    return mDefiningRE;
88}
89
90inline void Name::setDefinition(RE * d) {
91    mDefiningRE = d;
92}
93
94inline Name * makeName(const std::string name, const Name::Type type = Name::Type::Unicode) {
95    return new Name("", std::move(name), type, nullptr);
96}
97
98inline Name * makeName(const std::string property, const std::string value, const Name::Type type = Name::Type::Unicode) {
99    return new Name(std::move(property), std::move(value), type, nullptr);
100}
101
102inline Name * makeName(const std::string name, RE * cc) {
103    if (isa<Name>(cc)) {
104        return cast<Name>(cc);
105    }
106    else if (isa<CC>(cc)) {
107        Name::Type ccType = cast<CC>(cc)->max_codepoint() <= 0x7F ? Name::Type::Byte : Name::Type::Unicode;
108        return new Name("", std::move(name), ccType, cc);
109    }
110    else return new Name("", std::move(name), Name::Type::Unknown, cc);
111}
112
113inline Name * makeByteName(const std::string name, RE * cc) {
114    if (isa<Name>(cc)) {
115        return cast<Name>(cc);
116    }
117    else {
118        return new Name("", std::move(name), Name::Type::Byte, cc);
119    }
120}
121
122}
123
124#endif // RE_NAME_H
Note: See TracBrowser for help on using the repository browser.