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

Last change on this file since 4380 was 4380, checked in by cameron, 4 years ago

UCD property resolution initial check in

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