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

Last change on this file since 5781 was 5781, checked in by cameron, 14 months ago

Small fixes

File size: 3.2 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
[5278]15using codepoint_t = UCD::codepoint_t;
[5748]16using interval_t = UCD::interval_t;
[3850]17
[5781]18enum class CC_type {UnicodeClass, ByteClass};
[4337]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
[5742]54    CC();
[4194]55
56    CC(const CC & cc);
[4814]57
[5742]58    CC(const codepoint_t codepoint);
[4812]59
[5742]60    explicit CC(const codepoint_t lo_codepoint, const codepoint_t hi_codepoint);
[4814]61
[5742]62    explicit CC(const CC * cc1, const CC * cc2);
[4812]63
[5748]64    CC(const UCD::UnicodeSet && set);
[4814]65
[5742]66    CC(std::initializer_list<interval_t>::iterator begin, std::initializer_list<interval_t>::iterator end);
[4614]67
[5742]68    CC(const std::vector<interval_t>::iterator begin, const std::vector<interval_t>::iterator end);
[4812]69
[3850]70};
71
[4812]72inline static CC::iterator begin(const CC & cc) {
[4187]73    return cc.begin();
74}
75
[4812]76inline static CC::iterator end(const CC & cc) {
[4187]77    return cc.end();
78}
79
[4617]80inline codepoint_t lo_codepoint(const interval_t & i) {
[4614]81    return std::get<0>(i);
82}
[4812]83inline codepoint_t lo_codepoint(const CC::iterator i) {
[4614]84    return lo_codepoint(*i);
85}
[4612]86
[4617]87inline codepoint_t hi_codepoint(const interval_t & i) {
[4614]88    return std::get<1>(i);
89}
[4812]90inline codepoint_t hi_codepoint(const CC::iterator i) {
[4614]91    return hi_codepoint(*i);
92}
[4612]93
[4194]94/**
95 * @brief RE::makeCC
96 *
97 * Various factory constructors for the RE CC class
98 *
99 * @return a CC object
100 */
[4187]101
[4194]102inline CC * makeCC() {
103    return new CC();
104}
105
[4612]106inline CC * makeCC(const codepoint_t codepoint) {
[4194]107    return new CC(codepoint);
108}
109
[4612]110inline CC * makeCC(const codepoint_t lo, const codepoint_t hi) {
[4194]111    return new CC(lo, hi);
112}
113
114inline CC * makeCC(const CC * cc1, const CC * cc2) {
115    return new CC(cc1, cc2);
116}
117
[4860]118inline CC * makeCC(std::initializer_list<interval_t> list) {
119    return new CC(list.begin(), list.end());
[4617]120}
121
[4860]122inline CC * makeCC(std::vector<interval_t> && list) {
123    return new CC(list.begin(), list.end());
[4617]124}
125
[4812]126inline CC * makeCC(UCD::UnicodeSet && set) {
[4814]127    return new CC(std::move(set));
[4812]128}
129
[4814]130inline CC * subtractCC(const CC * a, const CC * b) {
[5037]131    return new CC(*a - *b);
[4814]132}
[4319]133
[4814]134inline CC * intersectCC(const CC * a, const CC * b) {
[5037]135    return new CC(*a & *b);
[4814]136}
137
[4194]138}
139
[3850]140#endif // RE_CC_H
Note: See TracBrowser for help on using the repository browser.