loom

Форк
0
/
VariableRef.cpp 
92 строки · 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
        assert(!empty());
56

57
        if (_val_ptr) {
58
            if (!_val_variable)
59
                _val_variable = std::make_shared<Variable>(u"", *_val_ptr);
60

61
            return *_val_variable;
62
        }
63
        return *_variable_ptr; 
64
    }
65

66
    Variable & VariableRef::origin()
67
    { 
68
        assert(!empty());
69

70
        if (_val_ptr) {
71
            if (!_val_variable)
72
                _val_variable = std::make_shared<Variable>(u"", *_val_ptr);
73

74
            return *_val_variable;
75
        }
76
        return *_variable_ptr; 
77
    }
78

79
    void VariableRef::setValue(const Value & value)
80
    {
81
        assert(!empty());
82

83
        if (_val_ptr) {
84
            *_val_ptr = value;
85
            if (_val_variable)
86
                _val_variable->value() = value;
87
        }
88
        else
89
            _variable_ptr->value() = value;
90
    }
91

92
}

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

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

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

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