loom
1/*
2MIT License
3
4Copyright (c) 2022 МГТУ им. Н.Э. Баумана, кафедра ИУ-6, Михаил Фетисов,
5
6https://bmstu.codes/lsx/simodo/loom
7*/
8
9#include "simodo/variable/Variable.h"
10
11#include <cassert>
12
13namespace simodo::variable
14{
15const VariableRef & Value::getRef() const
16{
17return std::get<VariableRef>(_variant);
18}
19
20Value Value::copy() const
21{
22switch(_type)
23{
24case ValueType::Array:
25if (std::holds_alternative<std::shared_ptr<Array>>(_variant))
26return std::make_shared<Array>(getArray()->copy());
27return _type;
28case ValueType::Function:
29/// \todo При копировании функции ломается передача замыканий (нужно проверить)
30// return *this;
31case ValueType::Object:
32if (std::holds_alternative<std::shared_ptr<Object>>(_variant))
33return { _type, std::make_shared<Object>(getObject()->copy()) };
34return _type;
35case ValueType::Ref:
36assert(getRef().origin().type() != ValueType::Ref);
37return getRef().origin().value().copy();
38default:
39return *this;
40}
41}
42
43}