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
95
|
/**
* 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) {}
LIBALEE_SECTION
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
|