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

paulmthompson / WhiskerToolbox / 14759446314

30 Apr 2025 04:26PM UTC coverage: 18.699% (+1.7%) from 16.999%
14759446314

push

github

paulmthompson
fix test errors

319 of 1706 relevant lines covered (18.7%)

1.87 hits per line

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

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

3
#include <algorithm>
4
#include <cmath>// std::round
5
#include <fstream>
6
#include <ranges>
7
#include <sstream>
8
#include <utility>
9
#include <vector>
10

11
DigitalIntervalSeries::DigitalIntervalSeries(std::vector<Interval> digital_vector) {
×
12
    _data = std::move(digital_vector);
×
13
    _sortData();
×
14
}
×
15

16
void DigitalIntervalSeries::setData(std::vector<Interval> digital_vector) {
×
17
    _data = std::move(digital_vector);
×
18
    _sortData();
×
19
    notifyObservers();
×
20
}
×
21

22
void DigitalIntervalSeries::setData(std::vector<std::pair<float, float>> const & digital_vector) {
×
23
    std::vector<Interval> intervals;
×
24
    intervals.reserve(digital_vector.size());
×
25
    for (auto & interval: digital_vector) {
×
26
        intervals.emplace_back(Interval{static_cast<int64_t>(interval.first), static_cast<int64_t>(interval.second)});
×
27
    }
28
    setData(intervals);
×
29
}
×
30

31
std::vector<Interval> const & DigitalIntervalSeries::getDigitalIntervalSeries() const {
1✔
32
    return _data;
1✔
33
}
34

35
bool DigitalIntervalSeries::isEventAtTime(int const time) const {
×
36

37
    auto Contained = [time](auto const & event) {
×
38
        return is_contained(event, time);
×
39
    };
×
40

41
    if (std::ranges::any_of(_data, Contained)) return true;
×
42

43
    return false;
×
44
}
45

46
void DigitalIntervalSeries::addEvent(Interval new_interval) {
20✔
47
    _addEvent(new_interval);
20✔
48

49
    notifyObservers();
20✔
50
}
20✔
51

52
void DigitalIntervalSeries::_addEvent(Interval new_interval) {
20✔
53
    bool merged = false;
20✔
54

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

68
    _data.push_back(new_interval);
20✔
69

70
    _sortData();
20✔
71
}
72

73
void DigitalIntervalSeries::setEventAtTime(int time, bool const event) {
×
74
    _setEventAtTime(time, event);
×
75
    notifyObservers();
×
76
}
×
77

78
void DigitalIntervalSeries::_setEventAtTime(int time, bool const event) {
×
79
    if (!event) {
×
80
        _removeEventAtTime(time);
×
81
    } else {
82
        _addEvent(Interval{static_cast<int64_t>(time), static_cast<int64_t>(time)});
×
83
    }
84
}
×
85

86
void DigitalIntervalSeries::removeEventAtTime(int const time) {
×
87
    _removeEventAtTime(time);
×
88
    notifyObservers();
×
89
}
×
90

91
void DigitalIntervalSeries::_removeEventAtTime(int const time) {
×
92
    for (auto it = _data.begin(); it != _data.end(); ++it) {
×
93
        if (is_contained(*it, time)) {
×
94
            if (time == it->start && time == it->end) {
×
95
                _data.erase(it);
×
96
            } else if (time == it->start) {
×
97
                it->start = time + 1;
×
98
            } else if (time == it->end) {
×
99
                it->end = time - 1;
×
100
            } else {
101
                auto preceding_event = Interval{it->start, time - 1};
×
102
                auto following_event = Interval{time + 1, it->end};
×
103
                _data.erase(it);
×
104
                _data.push_back(preceding_event);
×
105
                _data.push_back(following_event);
×
106

107
                _sortData();
×
108
            }
109
            return;
×
110
        }
111
    }
112
}
113

114
void DigitalIntervalSeries::_sortData() {
20✔
115
    std::sort(_data.begin(), _data.end());
20✔
116
}
20✔
117

118
int find_closest_preceding_event(DigitalIntervalSeries * digital_series, int time) {
×
119
    auto const & events = digital_series->getDigitalIntervalSeries();
×
120

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

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