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

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

Temporary check-in

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