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

Last change on this file since 5074 was 5037, checked in by nmedfort, 3 years ago

UnicodeSet? bug fix and compile warning clean-up.

File size: 3.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 <UCD/unicode_set.h>
15#include <util/slab_allocator.h>
16
17namespace re {
18
19using codepoint_t = UCD::UnicodeSet::codepoint_t;
20using interval_t = UCD::UnicodeSet::interval_t;
21
22enum CC_type {UnicodeClass, ByteClass};
23
24class CC : public RE, public UCD::UnicodeSet {
25public:
26
27    static inline bool classof(const RE * re) {
28        return re->getClassTypeId() == ClassTypeId::CC;
29    }
30    static inline bool classof(const void *) {
31        return false;
32    }
33
34
35    std::string canonicalName(const CC_type type) const;
36
37    inline codepoint_t min_codepoint() const {
38        return front().first;
39    }
40
41    inline codepoint_t max_codepoint() const {
42        return back().second;
43    }
44
45    virtual ~CC() {}
46
47protected:
48    friend CC * makeCC();
49    friend CC * makeCC(const codepoint_t codepoint);
50    friend CC * makeCC(const codepoint_t lo, const codepoint_t hi);
51    friend CC * makeCC(const CC * cc1, const CC * cc2);
52    friend CC * makeCC(std::initializer_list<interval_t> list);
53    friend CC * makeCC(std::vector<interval_t> && list);
54    friend CC * makeCC(UCD::UnicodeSet && set);
55    friend CC * subtractCC(const CC * a, const CC * b);
56    friend CC * intersectCC(const CC * a, const CC * b);
57    friend CC * caseInsensitize(const CC * a, const CC * b);
58
59    inline CC()
60    : RE(ClassTypeId::CC) {
61
62    }
63
64    CC(const CC & cc);
65
66    inline CC(const codepoint_t codepoint)
67    : RE(ClassTypeId::CC)
68    , UCD::UnicodeSet(codepoint) {
69
70    }
71
72    inline CC(const codepoint_t lo_codepoint, const codepoint_t hi_codepoint)
73    : RE(ClassTypeId::CC)
74    , UCD::UnicodeSet(lo_codepoint, hi_codepoint) {
75
76    }
77
78    CC(const CC * cc1, const CC * cc2);
79
80    inline CC(UCD::UnicodeSet && set)
81    : RE(ClassTypeId::CC)
82    , UCD::UnicodeSet(std::move(set)) {
83
84    }
85
86    CC(std::initializer_list<interval_t>::iterator begin, std::initializer_list<interval_t>::iterator end)
87    : RE(ClassTypeId::CC)
88    , UCD::UnicodeSet(begin, end)
89    {
90
91    }
92
93    CC(const std::vector<interval_t>::iterator begin, const std::vector<interval_t>::iterator end)
94    : RE(ClassTypeId::CC)
95    , UCD::UnicodeSet(begin, end)
96    {
97
98    }
99
100};
101
102inline static CC::iterator begin(const CC & cc) {
103    return cc.begin();
104}
105
106inline static CC::iterator end(const CC & cc) {
107    return cc.end();
108}
109
110inline codepoint_t lo_codepoint(const interval_t & i) {
111    return std::get<0>(i);
112}
113inline codepoint_t lo_codepoint(const CC::iterator i) {
114    return lo_codepoint(*i);
115}
116
117inline codepoint_t hi_codepoint(const interval_t & i) {
118    return std::get<1>(i);
119}
120inline codepoint_t hi_codepoint(const CC::iterator i) {
121    return hi_codepoint(*i);
122}
123
124/**
125 * @brief RE::makeCC
126 *
127 * Various factory constructors for the RE CC class
128 *
129 * @return a CC object
130 */
131
132inline CC * makeCC() {
133    return new CC();
134}
135
136inline CC * makeCC(const codepoint_t codepoint) {
137    return new CC(codepoint);
138}
139
140inline CC * makeCC(const codepoint_t lo, const codepoint_t hi) {
141    return new CC(lo, hi);
142}
143
144inline CC * makeCC(const CC * cc1, const CC * cc2) {
145    return new CC(cc1, cc2);
146}
147
148inline CC * makeCC(std::initializer_list<interval_t> list) {
149    return new CC(list.begin(), list.end());
150}
151
152inline CC * makeCC(std::vector<interval_t> && list) {
153    return new CC(list.begin(), list.end());
154}
155
156inline CC * makeCC(UCD::UnicodeSet && set) {
157    return new CC(std::move(set));
158}
159
160inline CC * subtractCC(const CC * a, const CC * b) {
161    return new CC(*a - *b);
162}
163
164inline CC * intersectCC(const CC * a, const CC * b) {
165    return new CC(*a & *b);
166}
167
168CC * caseInsensitize(const CC * cc);
169
170}
171
172#endif // RE_CC_H
Note: See TracBrowser for help on using the repository browser.