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

Last change on this file since 4612 was 4612, checked in by nmedfort, 4 years ago

Multiplexing bug fix and some CC changes.

File size: 5.4 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"
11
12#include <string>
13#include <vector>
[4510]14#include <slab_allocator.h>
[3850]15
[4194]16namespace re {
17
[4612]18typedef unsigned codepoint_t;
[3850]19
[4612]20struct CharSetItem {
21    constexpr CharSetItem() : lo_codepoint(0), hi_codepoint(0) {}
22    constexpr CharSetItem(const codepoint_t lo, const codepoint_t hi) : lo_codepoint(lo), hi_codepoint(hi) {}
23    constexpr codepoint_t operator [](const unsigned i) const {
24        return (i == 0) ? lo_codepoint : (i == 1) ? hi_codepoint : throw std::runtime_error("CharSetItem[] can only accept 0 or 1.");
25    }
26    codepoint_t lo_codepoint;
27    codepoint_t hi_codepoint;
[3850]28};
29
[4337]30enum CC_type {UnicodeClass, ByteClass};
31
[4187]32class CC : public RE {
[3850]33public:
[4187]34
[4194]35    static inline bool classof(const RE * re) {
36        return re->getClassTypeId() == ClassTypeId::CC;
37    }
38    static inline bool classof(const void *) {
39        return false;
40    }
41
[4510]42    using CharSetAllocator = SlabAllocator<CharSetItem>;
43    using CharSetVector = std::vector<CharSetItem, CharSetAllocator>;
44
[4187]45    typedef CharSetVector::iterator                 iterator;
46    typedef CharSetVector::const_iterator           const_iterator;
47    typedef CharSetVector::size_type                size_type;
48    typedef CharSetVector::reference                reference;
49    typedef CharSetVector::const_reference          const_reference;
50
[4612]51    static const codepoint_t UNICODE_MAX = 0x10FFFF;
[4194]52
[4510]53    std::string canonicalName(const CC_type type) const;
[4194]54
[4612]55    CharSetItem & operator [](unsigned i) {
56        return mSparseCharSet[i];
57    }
[4335]58
[4612]59    const CharSetItem & operator [](unsigned i) const {
60        return mSparseCharSet[i];
61    }
[4194]62
[4612]63    inline codepoint_t min_codepoint() const {
64        return mSparseCharSet.size() == 0 ? 0 : mSparseCharSet.front().lo_codepoint;
65    }
[3850]66
[4612]67    inline codepoint_t max_codepoint() const {
68        return mSparseCharSet.size() == 0 ? 0 : mSparseCharSet.back().hi_codepoint;
69    }
70
71    void insert_range(const codepoint_t lo_codepoint, const codepoint_t hi_codepoint);
72
73    void remove_range(const codepoint_t lo_codepoint, const codepoint_t hi_codepoint);
74
75    inline void insert(const codepoint_t codepoint) {
[4187]76        insert_range(codepoint, codepoint);
77    }
[3850]78
[4612]79    inline void remove(const codepoint_t codepoint) {
[4187]80        remove_range(codepoint, codepoint);
81    }
[3850]82
[4187]83    inline iterator begin() {
84        return mSparseCharSet.begin();
85    }
86
87    inline iterator end() {
88        return mSparseCharSet.end();
89    }
90
91    inline reference front() {
92        return mSparseCharSet.front();
93    }
94
95    inline reference back() {
96        return mSparseCharSet.back();
97    }
98
[4194]99    inline const_iterator begin() const {
100        return mSparseCharSet.cbegin();
101    }
102
103    inline const_iterator end() const {
104        return mSparseCharSet.cend();
105    }
106
[4187]107    inline const_iterator cbegin() const {
108        return mSparseCharSet.cbegin();
109    }
110
111    inline const_iterator cend() const {
112        return mSparseCharSet.cend();
113    }
114
115    inline const_reference front() const {
116        return mSparseCharSet.front();
117    }
118
119    inline const_reference back() const {
120        return mSparseCharSet.back();
121    }
122
123    inline size_type size() const {
124        return mSparseCharSet.size();
125    }
126
127    inline bool empty() const {
128        return mSparseCharSet.empty();
129    }
130
[4194]131    virtual ~CC() {}
132
133protected:
[4272]134    friend CC * makeCC();
[4612]135    friend CC * makeCC(const codepoint_t codepoint);
136    friend CC * makeCC(const codepoint_t lo, const codepoint_t hi);
[4272]137    friend CC * makeCC(const CC * cc1, const CC * cc2);
[4319]138    friend CC * subtractCC(const CC * cc1, const CC * cc2);
[4194]139    inline CC()
[4510]140    : RE(ClassTypeId::CC)
141    , mSparseCharSet(mCharSetAllocator) {
[4194]142
143    }
144    CC(const CC & cc);
[4612]145    inline CC(const codepoint_t codepoint)
[4510]146    : RE(ClassTypeId::CC)
147    , mSparseCharSet(mCharSetAllocator) {
[4194]148        insert(codepoint);
149    }
[4612]150    inline CC(const codepoint_t lo_codepoint, const codepoint_t hi_codepoint)
[4510]151    : RE(ClassTypeId::CC)
152    , mSparseCharSet(mCharSetAllocator) {
[4194]153        insert_range(lo_codepoint, hi_codepoint);
154    }
155    CC(const CC * cc1, const CC * cc2);
[4187]156private:   
157    CharSetVector mSparseCharSet;
[4510]158    static CharSetAllocator mCharSetAllocator;
[3850]159};
160
[4187]161inline static CC::iterator begin(CC & cc) {
162    return cc.begin();
163}
164
165inline static CC::iterator end(CC & cc) {
166    return cc.end();
167}
168
169inline static CC::const_iterator begin(const CC & cc) {
170    return cc.cbegin();
171}
172
173inline static CC::const_iterator end(const CC & cc) {
174    return cc.cend();
175}
176
[4612]177
178
[4194]179/**
180 * @brief RE::makeCC
181 *
182 * Various factory constructors for the RE CC class
183 *
184 * @return a CC object
185 */
[4187]186
[4194]187inline CC * makeCC() {
188    return new CC();
189}
190
[4612]191inline CC * makeCC(const codepoint_t codepoint) {
[4194]192    return new CC(codepoint);
193}
194
[4612]195inline CC * makeCC(const codepoint_t lo, const codepoint_t hi) {
[4194]196    return new CC(lo, hi);
197}
198
199inline CC * makeCC(const CC * cc1, const CC * cc2) {
200    return new CC(cc1, cc2);
201}
202
[4319]203CC * subtractCC(const CC * cc1, const CC * cc2);
[4320]204   
205CC * intersectCC(const CC * cc1, const CC * cc2);
[4319]206
[4320]207CC * caseInsensitize(const CC * cc);
[4611]208
[4612]209CC * rangeIntersect(const CC * cc, const codepoint_t lo, const codepoint_t hi);
[4611]210
[4612]211CC * rangeGaps(const CC * cc, const codepoint_t lo, const codepoint_t hi);
[4611]212
213CC * outerRanges(const CC * cc);
214
215CC * innerRanges(const CC * cc);
216
[4194]217}
218
[3850]219#endif // RE_CC_H
Note: See TracBrowser for help on using the repository browser.