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

Last change on this file since 6195 was 6195, checked in by cameron, 7 months ago

Restructuring step: liminate RE:::Vector

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