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

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

Defer case-insensitization until character class is complete.

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