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

Last change on this file since 5810 was 5810, checked in by cameron, 16 months ago

RE optimizations

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