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

Last change on this file since 4808 was 4808, checked in by nmedfort, 3 years ago

Progress on multi-target UCD compilation

File size: 4.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
13namespace UCD {
14    class UnicodeSet;
15}
16
17namespace re {
18
19class Name : public RE {
20public:
21    static inline bool classof(const RE * re) {
22        return re->getClassTypeId() == ClassTypeId::Name;
23    }
24    static inline bool classof(const void *) {
25        return false;
26    }
27    using length_t = std::string::size_type;
28    enum class Type {
29        Byte
30        , Unicode
31        , UnicodeProperty
32        , Unknown
33    };
34    std::string getNamespace() const;
35    std::string getName() const;
36    void setFunctionName(const std::string &);
37    std::string getFunctionName() const;
38
39    Type getType() const;
40    RE * getDefinition() const;
41    pablo::PabloAST * getCompiled() const {
42        return mCompiled;
43    }
44    void setCompiled(pablo::PabloAST * var) {
45        mCompiled = var;
46    }
47    void setDefinition(RE * def);
48    virtual ~Name() {}
49protected:
50    friend Name * makeName(const std::string &, RE *);
51    friend Name * makeByteName(const std::string &, RE *);
52    friend Name * makeName(const std::string &, const Type);
53    friend Name * makeName(const std::string &, const std::string &, const Type);
54    Name(const char * nameSpace, const length_t namespaceLength, const char * name, const length_t nameLength, const Type type, RE * defn)
55    : RE(ClassTypeId::Name)
56    , mNamespaceLength(namespaceLength)
57    , mNamespace(replicateString(nameSpace, namespaceLength))
58    , mNameLength(nameLength)
59    , mName(replicateString(name, nameLength))
60    , mFunctionNameLength(0)
61    , mFunctionName(nullptr)
62    , mType(type)
63    , mDefiningRE(defn)
64    , mCompiled(nullptr)
65    {
66
67    }
68    inline const char * replicateString(const char * string, const length_t length) {
69        if (string) {
70            char * allocated = reinterpret_cast<char*>(mAllocator.allocate(length));
71            std::memcpy(allocated, string, length);
72            string = allocated;
73        }
74        return string;
75    }
76
77private:
78    const length_t      mNamespaceLength;
79    const char * const  mNamespace;
80    const length_t      mNameLength;
81    const char * const  mName;
82    length_t            mFunctionNameLength;
83    const char *        mFunctionName;
84    const Type          mType;
85    RE *                mDefiningRE;
86    pablo::PabloAST *   mCompiled;
87};
88
89inline std::string Name::getNamespace() const {
90    return std::string(mNamespace, mNamespaceLength);
91}
92
93inline std::string Name::getName() const {
94    return std::string(mName, mNameLength);
95}
96
97inline std::string Name::getFunctionName() const {
98    return std::string(mFunctionName, mFunctionNameLength);
99}
100
101inline void Name::setFunctionName(const std::string & n) {
102    mFunctionNameLength = n.length();
103    mFunctionName = replicateString(n.c_str(), n.length());
104}
105   
106inline Name::Type Name::getType() const {
107    return mType;
108}
109
110inline RE * Name::getDefinition() const {
111    return mDefiningRE;
112}
113
114inline void Name::setDefinition(RE * d) {
115    mDefiningRE = d;
116}
117
118inline Name * makeName(const std::string & name, const Name::Type type) {
119    return new Name(nullptr, 0, name.c_str(), name.length(), type, nullptr);
120}
121
122inline Name * makeName(const std::string & property, const std::string & value, const Name::Type type) {
123    return new Name(property.c_str(), property.length(), value.c_str(), value.length(),  type, nullptr);
124}
125
126inline Name * makeName(const std::string & name, RE * cc) {
127    if (isa<Name>(cc)) {
128        return cast<Name>(cc);
129    }
130    else if (isa<CC>(cc)) {
131        Name::Type ccType = cast<CC>(cc)->max_codepoint() <= 0x7F ? Name::Type::Byte : Name::Type::Unicode;
132        return new Name(nullptr, 0, name.c_str(), name.length(), ccType, cc);
133    }
134    else return new Name(nullptr, 0, name.c_str(), name.length(), Name::Type::Unknown, cc);
135}
136
137inline Name * makeByteName(const std::string & name, RE * cc) {
138    if (isa<Name>(cc)) {
139        return cast<Name>(cc);
140    }
141    else {
142        return new Name(nullptr, 0, name.c_str(), name.length(), Name::Type::Byte, cc);
143    }
144}
145
146}
147
148#endif // RE_NAME_H
Note: See TracBrowser for help on using the repository browser.