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

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

GCC fix + misc. changes

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