-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsystem.cpp
80 lines (68 loc) · 2.22 KB
/
system.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Ixte - a temporal structure editor for musical composition and analysis
// Copyright (C) 2014 Raphael Sousa Santos, http://www.raphaelss.com
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "system.hpp"
#include <algorithm>
#include <stdexcept>
namespace ixte {
struct match {
match(const std::string &label): _label(label) {}
bool operator()(const system::entry &e) {
return e.first == _label;
}
const std::string &_label;
};
bool system::make_line(std::string label) {
if (contains(label)) {
return false;
}
_lines.push_back(std::make_pair<std::string, line>(std::move(label), line()));
return true;
}
bool system::remove_line(const std::string &label) {
const_iterator iter = find(label);
if (iter == _lines.cend()) {
return false;
}
_lines.erase(iter);
return true;
}
bool system::contains(const std::string &label) const {
return find(label) != _lines.cend();
}
line &system::get_line(const std::string &label) {
auto iter = std::find_if(_lines.begin(), _lines.end(), match(label));
if (iter == _lines.end()) {
throw std::out_of_range(label);
}
return iter->second;
}
double system::time_length() const {
double result = -1;
for(auto iter = cbegin(), end = cend(); iter != end; ++iter) {
result = std::max<double>(iter->second.largest(), result);
}
return result;
}
system::const_iterator system::find(const std::string &label) const {
return std::find_if(_lines.cbegin(), _lines.cend(), match(label));
}
system::const_iterator system::cbegin() const {
return _lines.cbegin();
}
system::const_iterator system::cend() const {
return _lines.cend();
}
}