loom

Форк
0
/
Object.cpp 
116 строк · 2.9 Кб
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
#include "simodo/bormental/DrBormental.h"
11
#include "simodo/variable/FunctionWrapper.h"
12
#include "simodo/inout/format/fmt.h"
13

14
#include <algorithm>
15

16
namespace simodo::variable
17
{
18
    Object Object::copy() const
19
    {
20
        Object record;
21

22
        for(const Variable & member : _variables)
23
            record.variables().push_back(member.copyVariable());
24

25
        return record;
26
    }
27

28
    bool Object::exists(const std::u16string & name) const
29
    {
30
        auto it = find_if(_variables.begin(), _variables.end(), [name](const Variable & v){
31
            return v.name() == name;
32
        });
33

34
        return it != _variables.end();
35
    }
36

37
    const Value & Object::find(const std::u16string & name) const
38
    {
39
        static const Value undef {};
40

41
        auto it = find_if(_variables.begin(), _variables.end(), [name](const Variable & v){
42
            return v.name() == name;
43
        });
44

45
        if (it == _variables.end())
46
            return undef;
47

48
        return it->value();  
49
    }
50

51
    Value & Object::find(const std::u16string & name)
52
    {
53
        static Value undef {};
54

55
        auto it = find_if(_variables.begin(), _variables.end(), [name](const Variable & v){
56
            return v.name() == name;
57
        });
58

59
        if (it == _variables.end())
60
            return undef;
61

62
        return it->value();
63
    }
64

65
    const Variable & Object::getVariableByName(const std::u16string & name) const
66
    {
67
        static const Variable undef {};
68

69
        auto it = find_if(_variables.begin(), _variables.end(), [name](const Variable & v){
70
            return v.name() == name;
71
        });
72

73
        if (it == _variables.end())
74
            return undef;
75

76
        return *it;  
77
    }
78

79
    Variable & Object::getVariableByName_mutable(const std::u16string & name)
80
    {
81
        return const_cast<Variable &>(getVariableByName(name));
82
    }
83

84
    const Variable & Object::getVariableByIndex(index_t index) const 
85
    {
86
        if (index >= _variables.size())
87
            throw bormental::DrBormental("Object::getVariableByIndex", inout::fmt("Out of index"));
88

89
        return _variables[index];
90
    }
91

92
    Value Object::invoke(const std::u16string & method_name, const VariableSet_t & arguments)
93
    {
94
        const Variable & function = getVariableByName(method_name);
95
        if (function.type() == variable::ValueType::Null) 
96
            return {};
97

98
        if (function.type() != variable::ValueType::Function) 
99
            return {};
100

101
        try
102
        {
103
            FunctionWrapper            func(function);
104
            VariableSet_t              args_mutable = arguments;
105
            VariableSetWrapper_mutable args(args_mutable);
106
            
107
            return func.invoke(args);
108
        }
109
        catch(const std::exception & e)
110
        {
111
        }
112
        
113
        return {};
114
    }
115

116
}

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

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

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

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