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

Last change on this file since 5267 was 5267, checked in by nmedfort, 2 years ago

Code clean-up. Removed Pablo Call, SetIthBit? and Prototype.

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