source: icGREP/icgrep-devel/icgrep/re/re_seq.h @ 6138

Last change on this file since 6138 was 6138, checked in by cameron, 11 months ago

Unicode decomposition, casefolding: initial check-in

File size: 1.8 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
[4194]7#ifndef RE_SEQ_H
8#define RE_SEQ_H
[3850]9
[6138]10#include <string>
11#include <re/re_cc.h>
12#include <re/re_re.h>
13#include <UCD/unicode_set.h>
[5267]14#include <llvm/Support/Casting.h>
[3850]15
[4194]16namespace re {
17
18class Seq : public Vector {
[3850]19public:
[4194]20    static inline bool classof(const RE * re) {
21        return re->getClassTypeId() == ClassTypeId::Seq;
22    }
23    static inline bool classof(const void *) {
24        return false;
25    }
26    virtual ~Seq() {}
27protected:
[4249]28    friend Seq * makeSeq();
[5835]29    template<typename iterator> friend RE * makeSeq(const iterator, const iterator);
[4249]30    Seq()
31    : Vector(ClassTypeId::Seq) {
[4194]32
33    }
[4249]34    Seq(iterator begin, iterator end)
35    : Vector(ClassTypeId::Seq, begin, end) {
[4194]36
37    }
[3850]38};
39
[4249]40inline Seq * makeSeq() {
41    return new Seq();
[4194]42}
43
[5835]44template<typename iterator>
45inline RE * makeSeq(const iterator begin, const iterator end) {
46    Seq * seq = makeSeq();
[4203]47    for (auto i = begin; i != end; ++i) {
[5835]48        RE * const item = *i;
49        if (LLVM_UNLIKELY(llvm::isa<Seq>(item))) {
50            for (RE * const innerItem : *llvm::cast<Seq>(item)) {
51                seq->push_back(innerItem);
52            }
[4852]53        } else {
[5835]54            seq->push_back(item);
[4203]55        }
56    }
[5835]57    if (seq->size() == 1) {
58        return seq->front();
[4203]59    }
[5835]60    return seq;
[4194]61}
62
[4203]63inline RE * makeSeq(RE::InitializerList list) {
[4249]64    return makeSeq(list.begin(), list.end());
[4203]65}
66
[5810]67inline bool isEmptySeq(RE * s) {
68    return llvm::isa<Seq>(s) && llvm::cast<Seq>(s)->empty();
[4203]69}
[6138]70   
71inline RE * u32string2re(std::u32string s) {
72    std::vector<RE *> ccs;
73    for (auto c : s) {
74        ccs.push_back(makeCC(UCD::UnicodeSet(c)));
75    }
76    return makeSeq(ccs.begin(), ccs.end());
[5810]77}
[6138]78   
79}
[4203]80
[5197]81#endif // RE_SEQ_H
[3850]82
83
84
85
Note: See TracBrowser for help on using the repository browser.