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

Last change on this file since 6141 was 6133, checked in by xwa163, 14 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.