You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
alee-forth/libalee/types.hpp

95 lines
2.2 KiB
C++

/**
* 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