loom

Форк
0
/
VariableSetWrapper.cpp 
145 строк · 5.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/VariableSetWrapper.h"
10
#include "simodo/bormental/DrBormental.h"
11
#include "simodo/inout/format/fmt.h"
12

13
#include <cassert>
14

15
using namespace simodo::bormental;
16
using namespace simodo::variable;
17

18
VariableSetWrapper_mutable::VariableSetWrapper_mutable(VariableSet_t & set)
19
    : _set(set)
20
    , _begin_index(0)
21
    , _end_index(set.size())
22
{
23
}
24

25
VariableSetWrapper_mutable::VariableSetWrapper_mutable(VariableSet_t & set, size_t begin_index)
26
    : _set(set)
27
    , _begin_index(begin_index)
28
    , _end_index(set.size())
29
{
30
    assert(_begin_index <= _end_index && _end_index <= set.size());
31
}
32

33
VariableSetWrapper_mutable::VariableSetWrapper_mutable(VariableSet_t & set, size_t begin_index, size_t end_index)
34
    : _set(set)
35
    , _begin_index(begin_index)
36
    , _end_index(end_index)
37
{
38
    assert(begin_index <= end_index && end_index <= set.size());
39
}
40

41
Variable & VariableSetWrapper_mutable::at(size_t index)
42
{
43
    // Учитываем возможность изменения размера рабочего набора данных (не связанное с многопоточностью)
44
    size_t end_index = (_set.size() < _end_index) ? _set.size() : _end_index;
45

46
    if (_begin_index > end_index)
47
        throw DrBormental("VariableSetWrapper_mutable::at", inout::fmt("Invalid dataset resizing"));
48

49
    // Выход индекса за границу набора данных
50
    if (_begin_index + index >= end_index)
51
        throw DrBormental("VariableSetWrapper_mutable::at", 
52
                        inout::fmt("Attempt to handle invalid offset (%1) in Variable Set Wrapper (size: %2)")
53
                        .arg(index)
54
                        .arg(end_index-_begin_index));
55

56
    return _set[_begin_index + index];
57
}
58

59
const Variable & VariableSetWrapper_mutable::at(size_t index) const
60
{
61
    // Учитываем возможность изменения размера рабочего набора данных (не связанное с многопоточностью)
62
    size_t end_index = (_set.size() < _end_index) ? _set.size() : _end_index;
63

64
    if (_begin_index > end_index)
65
        throw DrBormental("VariableSetWrapper_mutable::at", "Invalid dataset resizing");
66

67
    // Выход индекса за границу набора данных
68
    if (_begin_index + index >= end_index)
69
        throw DrBormental("VariableSetWrapper_mutable::at", 
70
                        inout::fmt("Attempt to handle invalid offset (%1) in Variable Set Wrapper (size: %2)")
71
                        .arg(index)
72
                        .arg(end_index-_begin_index));
73

74
    return _set[_begin_index + index];
75
}
76

77
size_t VariableSetWrapper_mutable::size() const
78
{
79
    // Учитываем возможность изменения размера рабочего набора данных (не связанное с многопоточностью)
80
    size_t end_index = (_set.size() < _end_index) ? _set.size() : _end_index;
81

82
    if (_begin_index > end_index)
83
        throw DrBormental("VariableSetWrapper_mutable::size", inout::fmt("Invalid dataset resizing"));
84

85
    return _end_index-_begin_index;
86
}
87

88
VariableSetWrapper::VariableSetWrapper(const VariableSetWrapper_mutable & wrapper) 
89
    : _set(wrapper.set()) 
90
    , _begin_index(wrapper.begin_index())
91
    , _end_index(wrapper.end_index())
92
{
93
}
94

95
VariableSetWrapper::VariableSetWrapper(const VariableSet_t & set)
96
    : _set(set)
97
    , _begin_index(0)
98
    , _end_index(set.size())
99
{
100
}
101

102
VariableSetWrapper::VariableSetWrapper(const VariableSet_t & set, size_t begin_index)
103
    : _set(set)
104
    , _begin_index(begin_index)
105
    , _end_index(set.size())
106
{
107
    assert(begin_index <= _end_index && _end_index <= set.size());
108
}
109

110
VariableSetWrapper::VariableSetWrapper(const VariableSet_t & set, size_t begin_index, size_t end_index)
111
    : _set(set)
112
    , _begin_index(begin_index)
113
    , _end_index(end_index)
114
{
115
    assert(begin_index <= end_index && end_index <= set.size());
116
}
117

118
const Variable &VariableSetWrapper::at(size_t index) const
119
{
120
    // Учитываем возможность изменения размера рабочего набора данных (не связанное с многопоточностью)
121
    size_t end_index = (_set.size() < _end_index) ? _set.size() : _end_index;
122

123
    if (_begin_index > end_index)
124
        throw DrBormental("VariableSetWrapper::at", inout::fmt("Invalid dataset resizing"));
125

126
    // Выход индекса за границу набора данных
127
    if (_begin_index + index >= end_index)
128
        throw DrBormental("VariableSetWrapper::at", 
129
                        inout::fmt("Attempt to handle invalid offset (%1) in Variable Set Wrapper (size: %2)")
130
                        .arg(index)
131
                        .arg(end_index-_begin_index));
132

133
    return _set[_begin_index + index];
134
}
135

136
size_t VariableSetWrapper::size() const
137
{
138
    // Учитываем возможность изменения размера рабочего набора данных (не связанное с многопоточностью)
139
    size_t end_index = (_set.size() < _end_index) ? _set.size() : _end_index;
140

141
    if (_begin_index > end_index)
142
        throw DrBormental("VariableSetWrapper::size", inout::fmt("Invalid dataset resizing"));
143

144
    return _end_index-_begin_index;
145
}
146

147

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

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

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

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