aboutsummaryrefslogtreecommitdiffstats
path: root/libalee/types.hpp
blob: 4d86c5deaef33f07c163f936357f8494d28a44ca (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
 * Alee Forth: A portable and concise Forth implementation in modern C++.
 * Copyright (C) 2023  Clyne Sullivan <clyne@bitgloo.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef ALEEFORTH_TYPES_HPP
#define ALEEFORTH_TYPES_HPP

#include <cstdint>
#include <iterator>

/**
 * Configure the below types for your platform.
 */
using Addr = uint16_t;
using Cell = int16_t;
using DoubleCell = int32_t;
using DoubleAddr = uint32_t; // Only used for um/mod.

struct Dictionary;
struct State;

using Func = void (*)(State&);

enum class Error : int {
    none = 0,
    push,
    pop,
    pushr,
    popr,
    top,
    pick,
    exit,
    noword
};

/**
 * Stores the start and past-the-end addresses of a dictionary's word.
 */
class Word
{
    Addr start;
    Addr wend;

public:
    struct iterator;

    constexpr explicit Word(Addr s = 0, Addr e = 0):
        start(s), wend(e) {}

    static constexpr Word fromLength(Addr s, Addr l) {
        return Word(s, s + l);
    }

    Addr size() const noexcept;

    iterator begin(const Dictionary *);
    iterator end(const Dictionary *);

    struct iterator {
        using iterator_category = std::input_iterator_tag;
        using value_type = uint8_t;
        using pointer = void;
        using reference = void;
        using difference_type = Cell;

        Addr addr;
        const Dictionary *dict;

        constexpr iterator(Addr a, const Dictionary *d):
            addr(a), dict(d) {}

        iterator& operator++();
        iterator operator++(int);
        value_type operator*();
        bool operator!=(const iterator&);
    };
};

#endif // ALEEFORTH_TYPES_HPP