source: icGREP/icgrep-devel/icgrep/re/re_re.h @ 5748

Last change on this file since 5748 was 5748, checked in by nmedfort, 22 months ago

Bug fix for segment pipeline parallel mode + memory management improvements.

File size: 2.0 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#ifndef RE_H
8#define RE_H
9
10#include <llvm/Support/raw_ostream.h>
11#include <UCD/unicode_set.h>
12#include <util/slab_allocator.h>
13#include <vector>
14
15namespace re {
16
17class RE {
18public:
19    using Allocator = SlabAllocator<RE *>;
20    using VectorAllocator = ProxyAllocator<RE *>;
21    enum class ClassTypeId : unsigned {
22        Alt
23        , Any
24        , Assertion
25        , CC
26        , Diff
27        , End
28        , Intersect
29        , Name
30        // , Permute
31        , Rep
32        , Seq
33        , Start
34        // , SymDiff
35        // , Union
36    };
37    inline ClassTypeId getClassTypeId() const {
38        return mClassTypeId;
39    }
40    inline static void Reset() {
41        llvm::outs() << "\nRE LOCAL: " << mAllocator.getTotalMemory() << "\n"
42                        "UCD GLOBAL: " << UCD::UnicodeSet::GlobalAllocator.getTotalMemory() << "\n\n";
43        mAllocator.Reset();
44    }
45    typedef std::initializer_list<RE *> InitializerList;
46
47protected:
48    inline RE(const ClassTypeId id)
49    : mClassTypeId(id) {
50
51    }
52    void* operator new (std::size_t size) noexcept {
53        return mAllocator.allocate<uint8_t>(size);
54    }
55    const ClassTypeId mClassTypeId;
56
57    static Allocator mAllocator;
58};
59
60class Vector : public RE, public std::vector<RE*, RE::VectorAllocator> {
61public:
62    static inline bool classof(const RE * re) {
63        const auto typeId = re->getClassTypeId();
64        return typeId == ClassTypeId::Alt || typeId == ClassTypeId::Seq;
65    }
66    static inline bool classof(const void *) {
67        return false;
68    }
69    virtual ~Vector() {}
70protected:
71    inline Vector(const ClassTypeId id)
72    : RE(id)
73    , std::vector<RE*, RE::VectorAllocator>(mAllocator)
74    {
75
76    }
77    inline Vector(const ClassTypeId id, const iterator begin, const iterator end)
78    : RE(id)
79    , std::vector<RE*, RE::VectorAllocator>(begin, end, mAllocator) {
80
81    }
82};
83
84}
85
86#endif // RE_H
87
88
Note: See TracBrowser for help on using the repository browser.