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

Last change on this file since 4255 was 4255, checked in by nmedfort, 5 years ago

Added Diff to RE Compiler/Parser?. Removed CC.negate()

File size: 4.0 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
112    inline CC()
113    : RE(ClassTypeId::CC) {
114
115    }
116    CC(const CC & cc);
117    inline CC(const CodePointType codepoint)
118    : RE(ClassTypeId::CC) {
119        insert(codepoint);
120    }
121    inline CC(const CodePointType lo_codepoint, const CodePointType hi_codepoint)
122    : RE(ClassTypeId::CC) {
123        insert_range(lo_codepoint, hi_codepoint);
124    }
125
126    CC(const CC * cc1, const CC * cc2);
127
128    friend CC * makeCC();
129    friend CC * makeCC(const CodePointType codepoint);
130    friend CC * makeCC(const CodePointType lo, const CodePointType hi);
131    friend CC * makeCC(const CC * cc1, const CC * cc2);
132
133private:   
134    CharSetVector mSparseCharSet;
135};
136
137inline static CC::iterator begin(CC & cc) {
138    return cc.begin();
139}
140
141inline static CC::iterator end(CC & cc) {
142    return cc.end();
143}
144
145inline static CC::const_iterator begin(const CC & cc) {
146    return cc.cbegin();
147}
148
149inline static CC::const_iterator end(const CC & cc) {
150    return cc.cend();
151}
152
153/**
154 * @brief RE::makeCC
155 *
156 * Various factory constructors for the RE CC class
157 *
158 * @return a CC object
159 */
160
161inline CC * makeCC() {
162    return new CC();
163}
164
165inline CC * makeCC(const CodePointType codepoint) {
166    return new CC(codepoint);
167}
168
169inline CC * makeCC(const CodePointType lo, const CodePointType hi) {
170    return new CC(lo, hi);
171}
172
173inline CC * makeCC(const CC * cc1, const CC * cc2) {
174    return new CC(cc1, cc2);
175}
176
177}
178
179#endif // RE_CC_H
Note: See TracBrowser for help on using the repository browser.