source: icGREP/icgrep-devel/icgrep/re/re_cc.h @ 4612

Last change on this file since 4612 was 4612, checked in by nmedfort, 4 years ago

Multiplexing bug fix and some CC changes.

File size: 5.4 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#include <slab_allocator.h>
15
16namespace re {
17
18typedef unsigned codepoint_t;
19
20struct CharSetItem {
21    constexpr CharSetItem() : lo_codepoint(0), hi_codepoint(0) {}
22    constexpr CharSetItem(const codepoint_t lo, const codepoint_t hi) : lo_codepoint(lo), hi_codepoint(hi) {}
23    constexpr codepoint_t operator [](const unsigned i) const {
24        return (i == 0) ? lo_codepoint : (i == 1) ? hi_codepoint : throw std::runtime_error("CharSetItem[] can only accept 0 or 1.");
25    }
26    codepoint_t lo_codepoint;
27    codepoint_t hi_codepoint;
28};
29
30enum CC_type {UnicodeClass, ByteClass};
31
32class CC : public RE {
33public:
34
35    static inline bool classof(const RE * re) {
36        return re->getClassTypeId() == ClassTypeId::CC;
37    }
38    static inline bool classof(const void *) {
39        return false;
40    }
41
42    using CharSetAllocator = SlabAllocator<CharSetItem>;
43    using CharSetVector = std::vector<CharSetItem, CharSetAllocator>;
44
45    typedef CharSetVector::iterator                 iterator;
46    typedef CharSetVector::const_iterator           const_iterator;
47    typedef CharSetVector::size_type                size_type;
48    typedef CharSetVector::reference                reference;
49    typedef CharSetVector::const_reference          const_reference;
50
51    static const codepoint_t UNICODE_MAX = 0x10FFFF;
52
53    std::string canonicalName(const CC_type type) const;
54
55    CharSetItem & operator [](unsigned i) {
56        return mSparseCharSet[i];
57    }
58
59    const CharSetItem & operator [](unsigned i) const {
60        return mSparseCharSet[i];
61    }
62
63    inline codepoint_t min_codepoint() const {
64        return mSparseCharSet.size() == 0 ? 0 : mSparseCharSet.front().lo_codepoint;
65    }
66
67    inline codepoint_t max_codepoint() const {
68        return mSparseCharSet.size() == 0 ? 0 : mSparseCharSet.back().hi_codepoint;
69    }
70
71    void insert_range(const codepoint_t lo_codepoint, const codepoint_t hi_codepoint);
72
73    void remove_range(const codepoint_t lo_codepoint, const codepoint_t hi_codepoint);
74
75    inline void insert(const codepoint_t codepoint) {
76        insert_range(codepoint, codepoint);
77    }
78
79    inline void remove(const codepoint_t codepoint) {
80        remove_range(codepoint, codepoint);
81    }
82
83    inline iterator begin() {
84        return mSparseCharSet.begin();
85    }
86
87    inline iterator end() {
88        return mSparseCharSet.end();
89    }
90
91    inline reference front() {
92        return mSparseCharSet.front();
93    }
94
95    inline reference back() {
96        return mSparseCharSet.back();
97    }
98
99    inline const_iterator begin() const {
100        return mSparseCharSet.cbegin();
101    }
102
103    inline const_iterator end() const {
104        return mSparseCharSet.cend();
105    }
106
107    inline const_iterator cbegin() const {
108        return mSparseCharSet.cbegin();
109    }
110
111    inline const_iterator cend() const {
112        return mSparseCharSet.cend();
113    }
114
115    inline const_reference front() const {
116        return mSparseCharSet.front();
117    }
118
119    inline const_reference back() const {
120        return mSparseCharSet.back();
121    }
122
123    inline size_type size() const {
124        return mSparseCharSet.size();
125    }
126
127    inline bool empty() const {
128        return mSparseCharSet.empty();
129    }
130
131    virtual ~CC() {}
132
133protected:
134    friend CC * makeCC();
135    friend CC * makeCC(const codepoint_t codepoint);
136    friend CC * makeCC(const codepoint_t lo, const codepoint_t hi);
137    friend CC * makeCC(const CC * cc1, const CC * cc2);
138    friend CC * subtractCC(const CC * cc1, const CC * cc2);
139    inline CC()
140    : RE(ClassTypeId::CC)
141    , mSparseCharSet(mCharSetAllocator) {
142
143    }
144    CC(const CC & cc);
145    inline CC(const codepoint_t codepoint)
146    : RE(ClassTypeId::CC)
147    , mSparseCharSet(mCharSetAllocator) {
148        insert(codepoint);
149    }
150    inline CC(const codepoint_t lo_codepoint, const codepoint_t hi_codepoint)
151    : RE(ClassTypeId::CC)
152    , mSparseCharSet(mCharSetAllocator) {
153        insert_range(lo_codepoint, hi_codepoint);
154    }
155    CC(const CC * cc1, const CC * cc2);
156private:   
157    CharSetVector mSparseCharSet;
158    static CharSetAllocator mCharSetAllocator;
159};
160
161inline static CC::iterator begin(CC & cc) {
162    return cc.begin();
163}
164
165inline static CC::iterator end(CC & cc) {
166    return cc.end();
167}
168
169inline static CC::const_iterator begin(const CC & cc) {
170    return cc.cbegin();
171}
172
173inline static CC::const_iterator end(const CC & cc) {
174    return cc.cend();
175}
176
177
178
179/**
180 * @brief RE::makeCC
181 *
182 * Various factory constructors for the RE CC class
183 *
184 * @return a CC object
185 */
186
187inline CC * makeCC() {
188    return new CC();
189}
190
191inline CC * makeCC(const codepoint_t codepoint) {
192    return new CC(codepoint);
193}
194
195inline CC * makeCC(const codepoint_t lo, const codepoint_t hi) {
196    return new CC(lo, hi);
197}
198
199inline CC * makeCC(const CC * cc1, const CC * cc2) {
200    return new CC(cc1, cc2);
201}
202
203CC * subtractCC(const CC * cc1, const CC * cc2);
204   
205CC * intersectCC(const CC * cc1, const CC * cc2);
206
207CC * caseInsensitize(const CC * cc);
208
209CC * rangeIntersect(const CC * cc, const codepoint_t lo, const codepoint_t hi);
210
211CC * rangeGaps(const CC * cc, const codepoint_t lo, const codepoint_t hi);
212
213CC * outerRanges(const CC * cc);
214
215CC * innerRanges(const CC * cc);
216
217}
218
219#endif // RE_CC_H
Note: See TracBrowser for help on using the repository browser.