loom

Форк
0
/
VariableRef.cpp 
86 строк · 2.4 Кб
1
/*
2
MIT License
3

4
Copyright (c) 2022 МГТУ им. Н.Э. Баумана, кафедра ИУ-6, Михаил Фетисов,
5

6
https://bmstu.codes/lsx/simodo/loom
7
*/
8

9
#include "simodo/variable/Variable.h"
10

11
#include <cassert>
12

13
namespace simodo::variable
14
{
15
    VariableRef::VariableRef(Variable & var)
16
    {
17
        if (var.type() != ValueType::Ref)
18
            _variable_ptr = &var;
19
        else {
20
            VariableRef variant_ref = std::get<VariableRef>(var.variant());  // Копируем вариант со ссылкой (чуть дольше, но безопасно?)
21
            Variable &  ref         = variant_ref.origin();        // Получаем изменяемую ссылку
22

23
            assert(ref.type() != ValueType::Ref);
24
            _variable_ptr = &ref;
25
        }
26
    }
27

28
    VariableRef::VariableRef(const Variable & var_c)
29
    {
30
        Variable & var = const_cast<Variable &>(var_c);
31

32
        if (var.type() != ValueType::Ref)
33
            _variable_ptr = &var;
34
        else {
35
            VariableRef variant_ref = std::get<VariableRef>(var.variant());  // Копируем вариант со ссылкой (чуть дольше, но безопасно?)
36
            Variable &  ref         = variant_ref.origin();             // Получаем изменяемую ссылку
37

38
            assert(ref.type() != ValueType::Ref);
39
            _variable_ptr = &ref;
40
        }
41
    }
42

43
    VariableRef::VariableRef(Value & val)
44
        : _val_ptr(&val)
45
    {
46
    }
47

48
    VariableRef::VariableRef(const Value & val_c)
49
        : _val_ptr(const_cast<Value *>(&val_c))
50
    {
51
    }
52

53
    const Variable & VariableRef::origin() const 
54
    { 
55
        if (_val_ptr) {
56
            if (!_val_variable)
57
                _val_variable = std::make_shared<Variable>(u"", *_val_ptr);
58

59
            return *_val_variable;
60
        }
61
        return *_variable_ptr; 
62
    }
63

64
    Variable & VariableRef::origin()
65
    { 
66
        if (_val_ptr) {
67
            if (!_val_variable)
68
                _val_variable = std::make_shared<Variable>(u"", *_val_ptr);
69

70
            return *_val_variable;
71
        }
72
        return *_variable_ptr; 
73
    }
74

75
    void VariableRef::setValue(const Value & value)
76
    {
77
        if (_val_ptr) {
78
            *_val_ptr = value;
79
            if (_val_variable)
80
                _val_variable->value() = value;
81
        }
82
        else
83
            _variable_ptr->value() = value;
84
    }
85

86
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.