๐Ÿ›ฐ๏ธ่ˆชๅคฉไปฟ็œŸ็ฎ—ๆณ•ๅบ“ SpaceAST 0.0.1
่ฝฝๅ…ฅไธญ...
ๆœ็ดขไธญ...
ๆœชๆ‰พๅˆฐ
TimeIntervalList.hpp
ๆต่งˆ่ฏฅๆ–‡ไปถ็š„ๆ–‡ๆกฃ.
1
21
22#pragma once
23
24#include "AstGlobal.h"
25#include "TimePoint.hpp"
26#include "IntervalList.hpp"
27#include "TimeInterval.hpp"
28#include "TimeList.hpp"
29#include <vector>
30#include <iterator> // for std::random_access_iterator_tag
31
32AST_NAMESPACE_BEGIN
33
34
59{
60public:
61
62 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
63 // ๅทฅๅŽ‚ๆ–นๆณ•
64 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
65
66 AST_CORE_API
67 static TimeIntervalList FromTimeInterval(const TimeInterval& interval);
68
74 AST_CORE_API
75 static TimeIntervalList FromTimeIntervals(const std::vector<TimeInterval>& intervals);
76
81 AST_CORE_API
82 static TimeIntervalList FromTimeIntervals(const std::vector<TimeInterval>& intervals, const TimePoint& epoch);
83
88 AST_CORE_API
89 static TimeIntervalList FromIntervals(const std::vector<Interval>& intervals, const TimePoint& epoch);
90
95 AST_CORE_API
96 static TimeIntervalList FromIntervalList(const IntervalList& list, const TimePoint& epoch);
97
98public:
99
100 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
101 // ๆž„้€ ไธŽ็”Ÿๅ‘ฝๅ‘จๆœŸ
102 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
103
105 TimeIntervalList() = default;
106
108 ~TimeIntervalList() = default;
109
112
115
117 TimeIntervalList(TimeIntervalList&&) noexcept = default;
118
120 TimeIntervalList& operator=(TimeIntervalList&&) noexcept = default;
121
125 : epoch_(epoch) {}
126
127 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
128 // ๅฎน้‡
129 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
130
132 size_t size() const noexcept { return intervals_.size(); }
133
135 bool empty() const noexcept { return intervals_.empty(); }
136
138 void reserve(size_t n) { intervals_.reserve(n); }
139
141 void clear() { intervals_.clear(); }
142
143 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
144 // ๅ…ƒ็ด ่ฎฟ้—ฎ
145 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
146
150 AST_CORE_API
151 TimeInterval operator[](size_t i) const;
152
157 AST_CORE_API
158 TimeInterval at(size_t i) const;
159
160 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
161 // ไฟฎๆ”น
162 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
163
166 AST_CORE_API
167 void push_back(const TimeInterval& ti);
168
172 AST_CORE_API
173 void push_back(const TimePoint& start, const TimePoint& stop);
174
177 void pop_back() { intervals_.pop_back(); }
178
179 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
180 // ๅކๅ…ƒ
181 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
182
184 const TimePoint& epoch() const noexcept { return epoch_; }
185
189 void setEpoch(const TimePoint& epoch) { epoch_ = epoch; }
190
191 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
192 // ๅบ•ๅฑ‚ๅฎนๅ™จ่ฎฟ้—ฎ
193 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
194
197 IntervalList& intervals() noexcept { return intervals_; }
198
200 const IntervalList& intervals() const noexcept { return intervals_; }
201
202 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
203 // ๆŸฅ่ฏข
204 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
205
207 double totalDuration() const { return intervals_.totalDuration(); }
208
212 AST_CORE_API
213 bool contains(const TimePoint& t) const;
214
215 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
216 // ้›†ๅˆ่ฟ็ฎ—
217 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
218
222 AST_CORE_API
223 TimeIntervalList merged() const;
224
229 AST_CORE_API
230 void mergeInPlace();
231
237 AST_CORE_API
238 TimeIntervalList& intersect(const TimeIntervalList& other);
239
245 AST_CORE_API
246 TimeIntervalList& unite(const TimeIntervalList& other);
247
253 AST_CORE_API
254 TimeIntervalList& subtract(const TimeIntervalList& other);
255
260 AST_CORE_API
261 TimeIntervalList intersected(const TimeIntervalList& other) const;
262
267 AST_CORE_API
268 bool intersects(const TimeIntervalList& other) const;
269
274 AST_CORE_API
275 TimeIntervalList united(const TimeIntervalList& other) const;
276
281 AST_CORE_API
282 TimeIntervalList subtracted(const TimeIntervalList& other) const;
283
284 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
285 // ่ฟ็ฎ—็ฌฆ้‡่ฝฝ๏ผˆQt / Boost.ICL ้ฃŽๆ ผ๏ผ‰
286 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
287
289 TimeIntervalList& operator&=(const TimeIntervalList& other) { return intersect(other); }
290
292 TimeIntervalList& operator|=(const TimeIntervalList& other) { return unite(other); }
293
295 TimeIntervalList& operator-=(const TimeIntervalList& other) { return subtract(other); }
296
298 TimeIntervalList operator&(const TimeIntervalList& other) const { return intersected(other); }
299
301 TimeIntervalList operator|(const TimeIntervalList& other) const { return united(other); }
302
304 TimeIntervalList operator-(const TimeIntervalList& other) const { return subtracted(other); }
305
306 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
307 // ่ฝฌๆข
308 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
309
312 IntervalList toIntervalList() const { return intervals_; }
313
320 TimeList discretize(double step) const { return intervals_.discretize(epoch_, step); }
321
329 TimeList discretize(const TimePoint& epoch, double step) const { return intervals_.discretize(epoch, step); }
330
334 AST_CORE_API
335 std::string toString(int precision = kTimePointDefaultFormatPrecision) const;
336
337 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
338 // ่ฟญไปฃๅ™จ
339 // โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”
340
345 {
346 public:
347 using iterator_category = std::random_access_iterator_tag;
348 using value_type = TimeInterval;
349 using difference_type = std::ptrdiff_t;
350 using pointer = const TimeInterval*;
351 using reference = TimeInterval; // ๆŒ‰ๅ€ผ่ฟ”ๅ›ž
352
353 const_iterator() = default;
354
355 const_iterator(const Interval* data, const TimePoint* epoch)
356 : data_(data), epoch_(epoch) {}
357
360 {
361 return TimeInterval(epoch_->shiftedBySecond(data_->start_), epoch_->shiftedBySecond(data_->stop_));
362 }
363
365 TimeInterval operator[](difference_type n) const
366 {
367 return TimeInterval(epoch_->shiftedBySecond(data_[n].start_), epoch_->shiftedBySecond(data_[n].stop_));
368 }
369
370 const_iterator& operator++() { ++data_; return *this; }
371 const_iterator operator++(int) { auto tmp = *this; ++data_; return tmp; }
372 const_iterator& operator--() { --data_; return *this; }
373 const_iterator operator--(int) { auto tmp = *this; --data_; return tmp; }
374 const_iterator& operator+=(difference_type n) { data_ += n; return *this; }
375 const_iterator& operator-=(difference_type n) { data_ -= n; return *this; }
376
377 const_iterator operator+(difference_type n) const { return {data_ + n, epoch_}; }
378 const_iterator operator-(difference_type n) const { return {data_ - n, epoch_}; }
379 difference_type operator-(const const_iterator& o) const { return data_ - o.data_; }
380
381 bool operator==(const const_iterator& o) const { return data_ == o.data_; }
382 bool operator!=(const const_iterator& o) const { return data_ != o.data_; }
383 bool operator< (const const_iterator& o) const { return data_ < o.data_; }
384 bool operator> (const const_iterator& o) const { return data_ > o.data_; }
385 bool operator<=(const const_iterator& o) const { return data_ <= o.data_; }
386 bool operator>=(const const_iterator& o) const { return data_ >= o.data_; }
387
388 private:
389 const Interval* data_ = nullptr;
390 const TimePoint* epoch_ = nullptr;
391 };
392
394 friend const_iterator operator+(const_iterator::difference_type n, const const_iterator& it)
395 {
396 return it + n;
397 }
398
399 using iterator = const_iterator;
400 using value_type = TimeInterval;
401 using size_type = size_t;
402 using difference_type = std::ptrdiff_t;
403
404 iterator begin() { return {intervals_.intervals().data(), &epoch_}; }
405 iterator end() { return {intervals_.intervals().data() + intervals_.size(), &epoch_}; }
406 const_iterator begin() const { return {intervals_.intervals().data(), &epoch_}; }
407 const_iterator end() const { return {intervals_.intervals().data() + intervals_.size(), &epoch_}; }
408 const_iterator cbegin()const { return begin(); }
409 const_iterator cend() const { return end(); }
410
411private:
412 TimePoint epoch_{};
413 IntervalList intervals_{};
414};
415
416
420AST_NAMESPACE_END
็›ธๅฏนๆ—ถๆฎตๅˆ—่กจ
ๆ—ถ้—ด็‚นๅˆ—่กจ
็ปๅฏนๆ—ถ้—ด็‚น
็›ธๅฏนๆ—ถๆฎตๅˆ—่กจ
ๅฎšไน‰ IntervalList.hpp:58
็›ธๅฏนๆ—ถ้—ดๅŒบ้—ด
ๅฎšไน‰ Interval.hpp:42
้šๆœบ่ฎฟ้—ฎๅธธ้‡่ฟญไปฃๅ™จ
ๅฎšไน‰ TimeIntervalList.hpp:345
TimeInterval operator[](difference_type n) const
ไธ‹ๆ ‡่ฎฟ้—ฎ
ๅฎšไน‰ TimeIntervalList.hpp:365
TimeInterval operator*() const
่งฃๅผ•็”จ๏ผš่ฎก็ฎ— TimeInterval(epoch_->shiftedBySecond(data_->start_), epoch_->shiftedBySecond(data_->stop_))
ๅฎšไน‰ TimeIntervalList.hpp:359
็ปๅฏนๆ—ถๆฎตๅˆ—่กจ
ๅฎšไน‰ TimeIntervalList.hpp:59
IntervalList toIntervalList() const
่ฝฌๆขไธบ็›ธๅฏนๅŒบ้—ดๅˆ—่กจ
ๅฎšไน‰ TimeIntervalList.hpp:312
TimeIntervalList operator|(const TimeIntervalList &other) const
ๅนถ้›†๏ผˆ่ฟ”ๅ›žๅ‰ฏๆœฌ๏ผŒ็ญ‰ไปทไบŽ united๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:301
TimeIntervalList(TimeIntervalList &&) noexcept=default
็งปๅŠจๆž„้€ 
TimeIntervalList & operator=(const TimeIntervalList &)=default
ๆ‹ท่ด่ต‹ๅ€ผ
void reserve(size_t n)
้ข„็•™ๅฎน้‡
ๅฎšไน‰ TimeIntervalList.hpp:138
void clear()
ๆธ…็ฉบๅˆ—่กจ
ๅฎšไน‰ TimeIntervalList.hpp:141
TimeIntervalList operator-(const TimeIntervalList &other) const
ๅทฎ้›†๏ผˆ่ฟ”ๅ›žๅ‰ฏๆœฌ๏ผŒ็ญ‰ไปทไบŽ subtracted๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:304
IntervalList & intervals() noexcept
่Žทๅ–ๅบ•ๅฑ‚็›ธๅฏนๅŒบ้—ดๅˆ—่กจ๏ผˆๅฏไฟฎๆ”น๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:197
friend const_iterator operator+(const_iterator::difference_type n, const const_iterator &it)
difference_type + const_iterator๏ผˆ้žๆˆๅ‘˜่ฟ็ฎ—็ฌฆ๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:394
void setEpoch(const TimePoint &epoch)
่ฎพ็ฝฎๅ‚่€ƒๅކๅ…ƒ
ๅฎšไน‰ TimeIntervalList.hpp:189
const TimePoint & epoch() const noexcept
่Žทๅ–ๅ‚่€ƒๅކๅ…ƒ
ๅฎšไน‰ TimeIntervalList.hpp:184
size_t size() const noexcept
่ฟ”ๅ›žๅŒบ้—ดๆ•ฐ้‡
ๅฎšไน‰ TimeIntervalList.hpp:132
TimeIntervalList & operator&=(const TimeIntervalList &other)
ๅŽŸๅœฐไบค้›†๏ผˆ็ญ‰ไปทไบŽ intersect๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:289
TimeList discretize(double step) const
็ฆปๆ•ฃๅŒ–๏ผˆไฝฟ็”จๅฝ“ๅ‰ epoch๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:320
TimeList discretize(const TimePoint &epoch, double step) const
็ฆปๆ•ฃๅŒ–๏ผˆๆŒ‡ๅฎšๅކๅ…ƒ๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:329
TimeIntervalList(const TimeIntervalList &)=default
ๆ‹ท่ดๆž„้€ 
TimeIntervalList operator&(const TimeIntervalList &other) const
ไบค้›†๏ผˆ่ฟ”ๅ›žๅ‰ฏๆœฌ๏ผŒ็ญ‰ไปทไบŽ intersected๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:298
const IntervalList & intervals() const noexcept
่Žทๅ–ๅบ•ๅฑ‚็›ธๅฏนๅŒบ้—ดๅˆ—่กจ๏ผˆๅช่ฏป๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:200
double totalDuration() const
ๆ€ปๆ—ถ้•ฟ๏ผˆๆ‰€ๆœ‰ๅŒบ้—ด duration ไน‹ๅ’Œ๏ผŒไธ่€ƒ่™‘้‡ๅ ๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:207
bool empty() const noexcept
ๅˆคๆ–ญๅˆ—่กจๆ˜ฏๅฆไธบ็ฉบ
ๅฎšไน‰ TimeIntervalList.hpp:135
TimeIntervalList & operator|=(const TimeIntervalList &other)
ๅŽŸๅœฐๅนถ้›†๏ผˆ็ญ‰ไปทไบŽ unite๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:292
~TimeIntervalList()=default
ๆžๆž„ๅ‡ฝๆ•ฐ
void pop_back()
็งป้™คๆœ€ๅŽไธ€ไธชๅŒบ้—ด
ๅฎšไน‰ TimeIntervalList.hpp:177
TimeIntervalList()=default
้ป˜่ฎคๆž„้€ ๅ‡ฝๆ•ฐ๏ผˆ็ฉบๅˆ—่กจ๏ผŒ้ป˜่ฎค epoch๏ผ‰
TimeIntervalList & operator-=(const TimeIntervalList &other)
ๅŽŸๅœฐๅทฎ้›†๏ผˆ็ญ‰ไปทไบŽ subtract๏ผ‰
ๅฎšไน‰ TimeIntervalList.hpp:295
ๆ—ถ้—ดๅŒบ้—ด
ๅฎšไน‰ TimeInterval.hpp:64
ๆ—ถ้—ด็‚นๅˆ—่กจ
ๅฎšไน‰ TimeList.hpp:49
็ปๅฏนๆ—ถ้—ด็‚น
ๅฎšไน‰ TimePoint.hpp:108