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

Last change on this file since 4643 was 4516, checked in by nmedfort, 5 years ago

More memory leak fixes. All known leaks accounted for.

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