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

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

Bug fix for \N{..} + minor optimization changes.

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