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

Last change on this file since 5809 was 5809, checked in by cameron, 19 months ago

Failure case and fix

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