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

Last change on this file since 4405 was 4337, checked in by cameron, 5 years ago

Compile only byteclasses with cc_compiler; resolve CC/BC ambiguity

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