• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

paulmthompson / WhiskerToolbox / 16036090729

02 Jul 2025 09:22PM UTC coverage: 72.408% (-0.06%) from 72.467%
16036090729

push

github

paulmthompson
remove obselete digitalintervalseries functions

7 of 15 new or added lines in 5 files covered. (46.67%)

74 existing lines in 8 files now uncovered.

11788 of 16280 relevant lines covered (72.41%)

1100.91 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

30.49
/src/WhiskerToolbox/DataManager/DigitalTimeSeries/Digital_Interval_Series.cpp
1
#include "Digital_Interval_Series.hpp"
2

3
#include <algorithm>
4
#include <utility>
5
#include <vector>
6

7
// ========== Constructors ==========
8

9
DigitalIntervalSeries::DigitalIntervalSeries(std::vector<Interval> digital_vector) {
70✔
10
    _data = std::move(digital_vector);
70✔
11
    _sortData();
70✔
12
}
70✔
13

NEW
14
DigitalIntervalSeries::DigitalIntervalSeries(std::vector<std::pair<float, float>> const & digital_vector) {
×
15
    std::vector<Interval> intervals;
×
16
    intervals.reserve(digital_vector.size());
×
17
    for (auto & interval: digital_vector) {
×
18
        intervals.emplace_back(Interval{static_cast<int64_t>(interval.first), static_cast<int64_t>(interval.second)});
×
19
    }
NEW
20
    _data = std::move(intervals);
×
NEW
21
    _sortData();
×
UNCOV
22
}
×
23

24
// ========== Getters ==========
25

26
std::vector<Interval> const & DigitalIntervalSeries::getDigitalIntervalSeries() const {
63✔
27
    return _data;
63✔
28
}
29

30
bool DigitalIntervalSeries::isEventAtTime(int const time) const {
×
31

32
    auto Contained = [time](auto const & event) {
×
33
        return is_contained(event, static_cast<int64_t>(time));
×
34
    };
×
35

36
    if (std::ranges::any_of(_data, Contained)) return true;
×
37

38
    return false;
×
39
}
40

41
void DigitalIntervalSeries::addEvent(Interval new_interval) {
20✔
42
    _addEvent(new_interval);
20✔
43

44
    notifyObservers();
20✔
45
}
20✔
46

47
void DigitalIntervalSeries::_addEvent(Interval new_interval) {
20✔
48
    bool merged = false;
20✔
49

50
    for (auto it = _data.begin(); it != _data.end();) {
33✔
51
        if (is_overlapping(*it, new_interval) || is_contiguous(*it, new_interval)) {
13✔
52
            new_interval.start = std::min(new_interval.start, it->start);
1✔
53
            new_interval.end = std::max(new_interval.end, it->end);
1✔
54
            it = _data.erase(it);
1✔
55
            merged = true;
1✔
56
        } else if (is_contained(new_interval, *it)) {
12✔
57
            return;
×
58
        } else {
59
            ++it;
12✔
60
        }
61
    }
62

63
    _data.push_back(new_interval);
20✔
64

65
    _sortData();
20✔
66
}
67

68
void DigitalIntervalSeries::setEventAtTime(int time, bool const event) {
×
69
    _setEventAtTime(time, event);
×
70
    notifyObservers();
×
71
}
×
72

73
void DigitalIntervalSeries::_setEventAtTime(int time, bool const event) {
×
74
    if (!event) {
×
75
        _removeEventAtTime(time);
×
76
    } else {
77
        _addEvent(Interval{static_cast<int64_t>(time), static_cast<int64_t>(time)});
×
78
    }
79
}
×
80

81
void DigitalIntervalSeries::removeEventAtTime(int const time) {
×
82
    _removeEventAtTime(time);
×
83
    notifyObservers();
×
84
}
×
85

86
void DigitalIntervalSeries::_removeEventAtTime(int const time) {
×
87
    for (auto it = _data.begin(); it != _data.end(); ++it) {
×
88
        if (is_contained(*it, static_cast<int64_t>(time))) {
×
89
            if (time == it->start && time == it->end) {
×
90
                _data.erase(it);
×
91
            } else if (time == it->start) {
×
92
                it->start = time + 1;
×
93
            } else if (time == it->end) {
×
94
                it->end = time - 1;
×
95
            } else {
96
                auto preceding_event = Interval{it->start, time - 1};
×
97
                auto following_event = Interval{time + 1, it->end};
×
98
                _data.erase(it);
×
99
                _data.push_back(preceding_event);
×
100
                _data.push_back(following_event);
×
101

102
                _sortData();
×
103
            }
104
            return;
×
105
        }
106
    }
107
}
108

109
void DigitalIntervalSeries::_sortData() {
90✔
110
    std::sort(_data.begin(), _data.end());
90✔
111
}
90✔
112

113
int find_closest_preceding_event(DigitalIntervalSeries * digital_series, int time) {
×
114
    auto const & events = digital_series->getDigitalIntervalSeries();
×
115

116
    // Check if sorted
117
    for (int i = 1; i < events.size(); ++i) {
×
118
        if (events[i].start < events[i - 1].start) {
×
119
            throw std::runtime_error("DigitalIntervalSeries is not sorted");
×
120
        }
121
    }
122
    int closest_index = -1;
×
123
    for (int i = 0; i < events.size(); ++i) {
×
124
        if (events[i].start <= time) {
×
125
            closest_index = i;
×
126
            if (time <= events[i].end) {
×
127
                return i;
×
128
            }
129
        } else {
130
            break;
×
131
        }
132
    }
133
    return closest_index;
×
134
}
135

STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc