source: icGREP/icgrep-devel/icgrep/re/re_cc.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: 4.1 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_CC_H
8#define RE_CC_H
9
10#include "re_re.h"
11
12#include <string>
13#include <vector>
14
15namespace re {
16
17typedef int CodePointType;
18
19struct CharSetItem{   
20    CharSetItem() : lo_codepoint(0), hi_codepoint(0) {}
21    CharSetItem(const CodePointType lo, const CodePointType hi) : lo_codepoint(lo), hi_codepoint(hi) {}
22    CodePointType lo_codepoint;
23    CodePointType hi_codepoint;
24};
25
26typedef std::vector<CharSetItem> CharSetVector;
27
28class CC : public RE {
29public:
30
31    static inline bool classof(const RE * re) {
32        return re->getClassTypeId() == ClassTypeId::CC;
33    }
34    static inline bool classof(const void *) {
35        return false;
36    }
37
38    typedef CharSetVector::iterator                 iterator;
39    typedef CharSetVector::const_iterator           const_iterator;
40    typedef CharSetVector::size_type                size_type;
41    typedef CharSetVector::reference                reference;
42    typedef CharSetVector::const_reference          const_reference;
43
44    static const CodePointType UNICODE_MAX = 0x10FFFF;
45
46    std::string getName() const;
47
48    void insert_range(const CodePointType lo_codepoint, const CodePointType hi_codepoint);
49
50    void remove_range(const CodePointType lo_codepoint, const CodePointType hi_codepoint);
51
52    inline void insert(const CodePointType codepoint) {
53        insert_range(codepoint, codepoint);
54    }
55
56    inline void remove(const CodePointType codepoint) {
57        remove_range(codepoint, codepoint);
58    }
59
60    inline iterator begin() {
61        return mSparseCharSet.begin();
62    }
63
64    inline iterator end() {
65        return mSparseCharSet.end();
66    }
67
68    inline reference front() {
69        return mSparseCharSet.front();
70    }
71
72    inline reference back() {
73        return mSparseCharSet.back();
74    }
75
76    inline const_iterator begin() const {
77        return mSparseCharSet.cbegin();
78    }
79
80    inline const_iterator end() const {
81        return mSparseCharSet.cend();
82    }
83
84    inline const_iterator cbegin() const {
85        return mSparseCharSet.cbegin();
86    }
87
88    inline const_iterator cend() const {
89        return mSparseCharSet.cend();
90    }
91
92    inline const_reference front() const {
93        return mSparseCharSet.front();
94    }
95
96    inline const_reference back() const {
97        return mSparseCharSet.back();
98    }
99
100    inline size_type size() const {
101        return mSparseCharSet.size();
102    }
103
104    inline bool empty() const {
105        return mSparseCharSet.empty();
106    }
107
108    virtual ~CC() {}
109
110protected:
111    friend CC * makeCC();
112    friend CC * makeCC(const CodePointType codepoint);
113    friend CC * makeCC(const CodePointType lo, const CodePointType hi);
114    friend CC * makeCC(const CC * cc1, const CC * cc2);
115    void* operator new (std::size_t size) noexcept {
116        return mAllocator.allocate(size);
117    }
118    inline CC()
119    : RE(ClassTypeId::CC) {
120
121    }
122    CC(const CC & cc);
123    inline CC(const CodePointType codepoint)
124    : RE(ClassTypeId::CC) {
125        insert(codepoint);
126    }
127    inline CC(const CodePointType lo_codepoint, const CodePointType hi_codepoint)
128    : RE(ClassTypeId::CC) {
129        insert_range(lo_codepoint, hi_codepoint);
130    }
131    CC(const CC * cc1, const CC * cc2);
132private:   
133    CharSetVector mSparseCharSet;
134};
135
136inline static CC::iterator begin(CC & cc) {
137    return cc.begin();
138}
139
140inline static CC::iterator end(CC & cc) {
141    return cc.end();
142}
143
144inline static CC::const_iterator begin(const CC & cc) {
145    return cc.cbegin();
146}
147
148inline static CC::const_iterator end(const CC & cc) {
149    return cc.cend();
150}
151
152/**
153 * @brief RE::makeCC
154 *
155 * Various factory constructors for the RE CC class
156 *
157 * @return a CC object
158 */
159
160inline CC * makeCC() {
161    return new CC();
162}
163
164inline CC * makeCC(const CodePointType codepoint) {
165    return new CC(codepoint);
166}
167
168inline CC * makeCC(const CodePointType lo, const CodePointType hi) {
169    return new CC(lo, hi);
170}
171
172inline CC * makeCC(const CC * cc1, const CC * cc2) {
173    return new CC(cc1, cc2);
174}
175
176}
177
178#endif // RE_CC_H
Note: See TracBrowser for help on using the repository browser.