4
Copyright (c) 2022 МГТУ им. Н.Э. Баумана, кафедра ИУ-6, Михаил Фетисов,
6
https://bmstu.codes/lsx/simodo/loom
9
#include "simodo/variable/VariableSetWrapper.h"
10
#include "simodo/bormental/DrBormental.h"
11
#include "simodo/inout/format/fmt.h"
15
using namespace simodo::bormental;
16
using namespace simodo::variable;
18
VariableSetWrapper_mutable::VariableSetWrapper_mutable(VariableSet_t & set)
21
, _end_index(set.size())
25
VariableSetWrapper_mutable::VariableSetWrapper_mutable(VariableSet_t & set, size_t begin_index)
27
, _begin_index(begin_index)
28
, _end_index(set.size())
30
assert(_begin_index <= _end_index && _end_index <= set.size());
33
VariableSetWrapper_mutable::VariableSetWrapper_mutable(VariableSet_t & set, size_t begin_index, size_t end_index)
35
, _begin_index(begin_index)
36
, _end_index(end_index)
38
assert(begin_index <= end_index && end_index <= set.size());
41
Variable & VariableSetWrapper_mutable::at(size_t index)
43
// Учитываем возможность изменения размера рабочего набора данных (не связанное с многопоточностью)
44
size_t end_index = (_set.size() < _end_index) ? _set.size() : _end_index;
46
if (_begin_index > end_index)
47
throw DrBormental("VariableSetWrapper_mutable::at", inout::fmt("Invalid dataset resizing"));
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)")
54
.arg(end_index-_begin_index));
56
return _set[_begin_index + index];
59
const Variable & VariableSetWrapper_mutable::at(size_t index) const
61
// Учитываем возможность изменения размера рабочего набора данных (не связанное с многопоточностью)
62
size_t end_index = (_set.size() < _end_index) ? _set.size() : _end_index;
64
if (_begin_index > end_index)
65
throw DrBormental("VariableSetWrapper_mutable::at", "Invalid dataset resizing");
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)")
72
.arg(end_index-_begin_index));
74
return _set[_begin_index + index];
77
size_t VariableSetWrapper_mutable::size() const
79
// Учитываем возможность изменения размера рабочего набора данных (не связанное с многопоточностью)
80
size_t end_index = (_set.size() < _end_index) ? _set.size() : _end_index;
82
if (_begin_index > end_index)
83
throw DrBormental("VariableSetWrapper_mutable::size", inout::fmt("Invalid dataset resizing"));
85
return _end_index-_begin_index;
88
VariableSetWrapper::VariableSetWrapper(const VariableSetWrapper_mutable & wrapper)
90
, _begin_index(wrapper.begin_index())
91
, _end_index(wrapper.end_index())
95
VariableSetWrapper::VariableSetWrapper(const VariableSet_t & set)
98
, _end_index(set.size())
102
VariableSetWrapper::VariableSetWrapper(const VariableSet_t & set, size_t begin_index)
104
, _begin_index(begin_index)
105
, _end_index(set.size())
107
assert(begin_index <= _end_index && _end_index <= set.size());
110
VariableSetWrapper::VariableSetWrapper(const VariableSet_t & set, size_t begin_index, size_t end_index)
112
, _begin_index(begin_index)
113
, _end_index(end_index)
115
assert(begin_index <= end_index && end_index <= set.size());
118
const Variable &VariableSetWrapper::at(size_t index) const
120
// Учитываем возможность изменения размера рабочего набора данных (не связанное с многопоточностью)
121
size_t end_index = (_set.size() < _end_index) ? _set.size() : _end_index;
123
if (_begin_index > end_index)
124
throw DrBormental("VariableSetWrapper::at", inout::fmt("Invalid dataset resizing"));
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)")
131
.arg(end_index-_begin_index));
133
return _set[_begin_index + index];
136
size_t VariableSetWrapper::size() const
138
// Учитываем возможность изменения размера рабочего набора данных (не связанное с многопоточностью)
139
size_t end_index = (_set.size() < _end_index) ? _set.size() : _end_index;
141
if (_begin_index > end_index)
142
throw DrBormental("VariableSetWrapper::size", inout::fmt("Invalid dataset resizing"));
144
return _end_index-_begin_index;