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

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

Moved 'resolveProperties' into CC_NameMap as a single call for each unique Name.

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