summaryrefslogtreecommitdiff
path: root/src/parse/ttstream.hpp
blob: 530a177bef395b09c177a6783a5feefbfb512cb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
 * MRustC - Rust Compiler
 * - By John Hodge (Mutabah/thePowersGang)
 *
 * parse/ttstrea.hpp
 * - Token tree streams (for post-lex parsing)
 */
#pragma once

#include "tokentree.hpp"
#include "tokenstream.hpp"

/// Borrowed TTStream
class TTStream:
    public TokenStream
{
    ::std::vector< ::std::pair<unsigned int, const TokenTree*> > m_stack;
    ::std::shared_ptr<Span> m_parent_span;
    const Ident::Hygiene*   m_hygiene_ptr = nullptr;
public:
    TTStream(Span parent, const TokenTree& input_tt);
    ~TTStream();

    TTStream& operator=(const TTStream& x) { m_stack = x.m_stack; return *this; }

    Position getPosition() const override;
    ::std::shared_ptr<Span> outerSpan() const override { return m_parent_span; }

protected:
    Ident::Hygiene realGetHygiene() const override;
    Token realGetToken() override;
};

/// Owned TTStream
class TTStreamO:
    public TokenStream
{
    Position    m_last_pos;
    TokenTree   m_input_tt;
    ::std::vector< ::std::pair<unsigned int, TokenTree*> > m_stack;
    const Ident::Hygiene*   m_hygiene_ptr = nullptr;
public:
    ::std::shared_ptr<Span> m_parent_span;
    TTStreamO(Span parent, TokenTree input_tt);
    TTStreamO(TTStreamO&& x) = default;
    ~TTStreamO();

    TTStreamO& operator=(const TTStreamO& x) { m_stack = x.m_stack; return *this; }
    TTStreamO& operator=(TTStreamO&& x) = default;

    Position getPosition() const override;
    ::std::shared_ptr<Span> outerSpan() const override { return m_parent_span; }

protected:
    Ident::Hygiene realGetHygiene() const override;
    Token realGetToken() override;
};