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

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

Implemented slab allocator based on the original Parabix StringPool?; intergrated it with RE and Pablo AST nodes.

File size: 1.9 KB
Line 
1#ifndef RE_NAME_H
2#define RE_NAME_H
3
4#include <re/re_re.h>
5#include <string>
6#include <iostream>
7#include <re/printer_re.h>
8
9namespace pablo {
10    class Var;
11}
12
13
14namespace re {
15
16class CC;
17
18class Name : public RE {
19public:
20    static inline bool classof(const RE * re) {
21        return re->getClassTypeId() == ClassTypeId::Name;
22    }
23    static inline bool classof(const void *) {
24        return false;
25    }
26    enum class Type {
27        FixedLength
28        , Unicode
29        , UnicodeCategory
30    };
31    const std::string & getName() const;
32    Type getType() const;
33    RE *getCC() const;
34    pablo::Var * getVar() const {
35        return mVar;
36    }
37    void setVar(pablo::Var * var) {
38        mVar = var;
39    }
40    void setCC(RE *cc);
41    virtual ~Name() {}
42protected:
43    friend Name * makeName(const std::string, RE *);
44    friend Name * makeName(const std::string, const Type);
45    void* operator new (std::size_t size) noexcept {
46        return mAllocator.allocate(size);
47    }
48    Name(const std::string && name, const Type type, RE * cc)
49    : RE(ClassTypeId::Name)
50    , mName(std::move(name))
51    , mType(type)
52    , mCC(cc)
53    , mVar(nullptr)
54    {
55
56    }
57
58private:
59    const std::string   mName;
60    const Type          mType;
61    RE *                mCC;
62    pablo::Var *        mVar;
63};
64
65inline const std::string & Name::getName() const {
66    return mName;
67}
68
69inline Name::Type Name::getType() const {
70    return mType;
71}
72
73inline RE * Name::getCC() const {
74    return mCC;
75}
76
77inline void Name::setCC(RE * cc) {
78    mCC = cc;
79}
80
81inline Name * makeName(const std::string name, const Name::Type type = Name::Type::FixedLength) {
82    return new Name(std::move(name), type, nullptr);
83}
84
85inline Name * makeName(const std::string name, RE * cc) {
86    if (isa<Name>(cc)) {
87        return cast<Name>(cc);
88    }
89    return new Name(std::move(name), Name::Type::FixedLength, cc);
90}
91
92}
93
94#endif // RE_NAME_H
Note: See TracBrowser for help on using the repository browser.