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
RevLine 
[3917]1#ifndef RE_NAME_H
2#define RE_NAME_H
3
[4246]4#include <re/re_re.h>
[3917]5#include <string>
[4249]6#include <iostream>
7#include <re/printer_re.h>
[3917]8
[4246]9namespace pablo {
10    class Var;
11}
12
13
[4194]14namespace re {
15
[4246]16class CC;
17
[4194]18class Name : public RE {
[3917]19public:
[4194]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
[4246]28        , Unicode
29        , UnicodeCategory
[4194]30    };
[4246]31    const std::string & getName() const;
[4182]32    Type getType() const;
[4246]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);
[4194]41    virtual ~Name() {}
42protected:
[4246]43    friend Name * makeName(const std::string, RE *);
[4256]44    friend Name * makeName(const std::string, const Type);
[4272]45    void* operator new (std::size_t size) noexcept {
46        return mAllocator.allocate(size);
47    }
[4256]48    Name(const std::string && name, const Type type, RE * cc)
[4249]49    : RE(ClassTypeId::Name)
50    , mName(std::move(name))
51    , mType(type)
52    , mCC(cc)
53    , mVar(nullptr)
54    {
55
56    }
57
[3917]58private:
[4246]59    const std::string   mName;
60    const Type          mType;
61    RE *                mCC;
62    pablo::Var *        mVar;
[3917]63};
64
[4246]65inline const std::string & Name::getName() const {
[4194]66    return mName;
67}
68
[4246]69inline Name::Type Name::getType() const {
70    return mType;
[4194]71}
72
[4246]73inline RE * Name::getCC() const {
74    return mCC;
[4194]75}
76
[4246]77inline void Name::setCC(RE * cc) {
78    mCC = cc;
[4194]79}
80
[4256]81inline Name * makeName(const std::string name, const Name::Type type = Name::Type::FixedLength) {
82    return new Name(std::move(name), type, nullptr);
[4194]83}
84
[4246]85inline Name * makeName(const std::string name, RE * cc) {
[4249]86    if (isa<Name>(cc)) {
87        return cast<Name>(cc);
88    }
[4256]89    return new Name(std::move(name), Name::Type::FixedLength, cc);
[4194]90}
91
92}
93
[3917]94#endif // RE_NAME_H
Note: See TracBrowser for help on using the repository browser.