mirror of
https://github.com/usatiuk/psil.git
synced 2025-10-29 03:07:49 +01:00
stratom numatom
This commit is contained in:
@@ -7,9 +7,12 @@
|
||||
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
enum class CellType {
|
||||
INT,
|
||||
NUMATOM,
|
||||
STRATOM,
|
||||
CONS
|
||||
};
|
||||
|
||||
@@ -23,13 +26,20 @@ struct Cell {
|
||||
bool live = false;
|
||||
};
|
||||
|
||||
struct ValueCell : public Cell {
|
||||
ValueCell() = delete;
|
||||
explicit ValueCell(CellValType val) : Cell(CellType::INT), _val(val) {}
|
||||
struct NumAtomCell : public Cell {
|
||||
NumAtomCell() = delete;
|
||||
explicit NumAtomCell(CellValType val) : Cell(CellType::NUMATOM), _val(val) {}
|
||||
|
||||
CellValType _val;
|
||||
};
|
||||
|
||||
struct StrAtomCell : public Cell {
|
||||
StrAtomCell() = delete;
|
||||
explicit StrAtomCell(std::string val) : Cell(CellType::STRATOM), _val(std::move(val)) {}
|
||||
|
||||
std::string _val;
|
||||
};
|
||||
|
||||
struct ConsCell : public Cell {
|
||||
ConsCell() : Cell(CellType::CONS) {}
|
||||
explicit ConsCell(Cell *car) : Cell(CellType::CONS), _car(car) {}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
namespace ConsUtils {
|
||||
static inline MCHandle car(const MCHandle &cell) { return dynamic_cast<ConsCell &>(*cell)._car; }
|
||||
static inline MCHandle cdr(const MCHandle &cell) { return dynamic_cast<ConsCell &>(*cell)._cdr; }
|
||||
static inline CellValType val(const MCHandle &cell) { return dynamic_cast<ValueCell &>(*cell)._val; }
|
||||
static inline CellValType val(const MCHandle &cell) { return dynamic_cast<NumAtomCell &>(*cell)._val; }
|
||||
MCHandle cons(const MCHandle &car, const MCHandle &cdr);
|
||||
MCHandle pop(MCHandle &from);
|
||||
MCHandle push(MCHandle &to, const MCHandle &what);
|
||||
|
||||
@@ -24,6 +24,28 @@ public:
|
||||
return cell;
|
||||
}
|
||||
|
||||
template<>
|
||||
Handle create_cell<NumAtomCell>(CellValType val) {
|
||||
if (numatom_index.contains(val))
|
||||
return numatom_index.at(val);
|
||||
|
||||
NumAtomCell *cell = new NumAtomCell(val);
|
||||
_cells.emplace_back(cell);
|
||||
numatom_index.emplace(val, cell);
|
||||
return cell;
|
||||
}
|
||||
|
||||
template<>
|
||||
Handle create_cell<StrAtomCell>(std::string val) {
|
||||
if (stratom_index.contains(val))
|
||||
return stratom_index.at(val);
|
||||
|
||||
StrAtomCell *cell = new StrAtomCell(std::move(val));
|
||||
_cells.emplace_back(cell);
|
||||
stratom_index.emplace(cell->_val, cell);
|
||||
return cell;
|
||||
}
|
||||
|
||||
class Handle {
|
||||
public:
|
||||
Handle(Cell *target) : _target(target) {}
|
||||
@@ -38,6 +60,8 @@ public:
|
||||
|
||||
private:
|
||||
std::list<Cell *> _cells;
|
||||
std::unordered_map<CellValType, Cell *> numatom_index;
|
||||
std::unordered_map<std::string, Cell *> stratom_index;
|
||||
};
|
||||
|
||||
using MCHandle = MemoryContext::Handle;
|
||||
|
||||
@@ -33,7 +33,7 @@ void ConsUtils::append(MCHandle to, const MCHandle &what) {
|
||||
}
|
||||
|
||||
MCHandle ConsUtils::makeIntCell(int64_t val) {
|
||||
return CURRENT_MC.load()->create_cell<ValueCell>(val);
|
||||
return CURRENT_MC.load()->create_cell<NumAtomCell>(val);
|
||||
}
|
||||
|
||||
void ConsUtils::setcar(const MCHandle &to, const MCHandle &car) {
|
||||
|
||||
Reference in New Issue
Block a user