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

Last change on this file was 6133, checked in by xwa163, 9 months ago
  1. Add sourceCC in multiplexed CC
  2. Remove workaround FakeBasisBits? from ICGrep
  3. Implement Swizzled version of LZParabix
  4. Init checkin for SwizzleByGather? Kernel
File size: 4.6 KB
Line 
1/*
2 *  Copyright (c) 2018 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#include <UCD/unicode_set.h>
12#include <cc/alphabet.h>
13
14namespace re {
15
16using codepoint_t = UCD::codepoint_t;
17using interval_t = UCD::interval_t;
18
19enum class CC_type {UnicodeClass, ByteClass};
20
21class CC : public RE, public UCD::UnicodeSet {
22public:
23
24    static inline bool classof(const RE * re) {
25        return re->getClassTypeId() == ClassTypeId::CC;
26    }
27    static inline bool classof(const void *) {
28        return false;
29    }
30
31    const cc::Alphabet * getAlphabet() const { return mAlphabet;}
32
33    std::string canonicalName() const;
34
35    inline codepoint_t min_codepoint() const {
36        return front().first;
37    }
38
39    inline codepoint_t max_codepoint() const {
40        return back().second;
41    }
42
43    virtual ~CC() {}
44
45    const CC* sourceCC;
46protected:
47    friend CC * makeCC(const cc::Alphabet * alphabet);
48    friend CC * makeCC(const codepoint_t codepoint, const cc::Alphabet * alphabet);
49    friend CC * makeCC(const codepoint_t lo, const codepoint_t hi, const cc::Alphabet * alphabet);
50    friend CC * makeCC(const CC * cc1, const CC * cc2);
51    friend CC * makeCC(std::initializer_list<interval_t> list, const cc::Alphabet * alphabet);
52    friend CC * makeCC(std::vector<interval_t> && list, const cc::Alphabet * alphabet);
53    friend CC * makeCC(UCD::UnicodeSet && set, const cc::Alphabet * alphabet);
54    friend bool intersects(const CC * a, const CC * b);
55    friend CC * subtractCC(const CC * a, const CC * b);
56    friend CC * intersectCC(const CC * a, const CC * b);
57    friend CC * makeByte(const codepoint_t codepoint);
58    friend CC * makeByte(const codepoint_t lo, const codepoint_t hi);
59
60    CC(const cc::Alphabet * alphabet);
61
62    CC(const CC & cc);
63
64    CC(const codepoint_t codepoint, const cc::Alphabet * alphabet);
65
66    explicit CC(const codepoint_t lo_codepoint, const codepoint_t hi_codepoint, const cc::Alphabet * alphabet);
67
68    explicit CC(const CC * cc1, const CC * cc2);
69
70    CC(const UCD::UnicodeSet && set, const cc::Alphabet * alphabet);
71
72    CC(std::initializer_list<interval_t>::iterator begin, std::initializer_list<interval_t>::iterator end, const cc::Alphabet * alphabet);
73
74    CC(const std::vector<interval_t>::iterator begin, const std::vector<interval_t>::iterator end, const cc::Alphabet * alphabet);
75private:
76    const cc::Alphabet * mAlphabet;
77   
78
79};
80
81inline static CC::iterator begin(const CC & cc) {
82    return cc.begin();
83}
84
85inline static CC::iterator end(const CC & cc) {
86    return cc.end();
87}
88
89inline codepoint_t lo_codepoint(const interval_t & i) {
90    return std::get<0>(i);
91}
92inline codepoint_t lo_codepoint(const CC::iterator i) {
93    return lo_codepoint(*i);
94}
95
96inline codepoint_t hi_codepoint(const interval_t & i) {
97    return std::get<1>(i);
98}
99inline codepoint_t hi_codepoint(const CC::iterator i) {
100    return hi_codepoint(*i);
101}
102
103/**
104 * @brief RE::makeCC
105 *
106 * Various factory constructors for the RE CC class
107 *
108 * @return a CC object
109 */
110
111inline CC * makeCC(const cc::Alphabet * alphabet = &cc::Unicode) {
112    return new CC(alphabet);
113}
114
115inline CC * makeCC(const codepoint_t codepoint, const cc::Alphabet * alphabet = &cc::Unicode) {
116    return new CC(codepoint, alphabet);
117}
118
119inline CC * makeCC(const codepoint_t lo, const codepoint_t hi, const cc::Alphabet * alphabet = &cc::Unicode) {
120    return new CC(lo, hi, alphabet);
121}
122
123inline CC * makeCC(const CC * cc1, const CC * cc2) {
124    return new CC(cc1, cc2);
125}
126
127inline CC * makeCC(std::initializer_list<interval_t> list, const cc::Alphabet * alphabet = &cc::Unicode) {
128    return new CC(list.begin(), list.end(), alphabet);
129}
130
131inline CC * makeCC(std::vector<interval_t> && list, const cc::Alphabet * alphabet = &cc::Unicode) {
132    return new CC(list.begin(), list.end(), alphabet);
133}
134
135inline CC * makeCC(UCD::UnicodeSet && set, const cc::Alphabet * alphabet = &cc::Unicode) {
136    return new CC(std::move(set), alphabet);
137}
138
139inline CC * subtractCC(const CC * a, const CC * b) {
140    //assert (a->getAlphabet() == b->getAlphabet());
141    return new CC(*a - *b, a->getAlphabet());
142}
143
144inline CC * intersectCC(const CC * a, const CC * b) {
145    //assert (a->getAlphabet() == b->getAlphabet());
146    return new CC(*a & *b, a->getAlphabet());
147}
148
149inline bool intersects(const CC * a, const CC * b) {
150    return (*a).intersects(*b);
151}
152
153inline CC * makeByte(const codepoint_t codepoint) {
154    return new CC(codepoint, &cc::Byte);
155}
156
157inline CC * makeByte(const codepoint_t lo, const codepoint_t hi) {
158    return new CC(lo, hi, &cc::Byte);
159}
160   
161}
162
163#endif // RE_CC_H
Note: See TracBrowser for help on using the repository browser.