🛰️航天仿真算法库 SpaceAST 0.3.1
载入中...
搜索中...
未找到
DoubleRange.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "AstUtil/Math.hpp"
25#include <iterator> // for std::input_iterator_tag
26#include <cstddef> // for size_t / ptrdiff_t
27#include <cmath> // for std::ceil
28
29AST_NAMESPACE_BEGIN
30
31
43{
44public:
50 DoubleRange(double start, double stop, double step, size_t n)
51 : start_(start), stop_(stop), step_(step), n_(n)
52 {}
53
54 DoubleRange(double start, double stop, double step)
55 : start_(start), stop_(stop), step_(step), n_(aDiscretizedCount(stop - start, step))
56 {}
57
59 {
60 public:
61 using iterator_category = std::input_iterator_tag;
62 using value_type = double;
63 using difference_type = ptrdiff_t;
64 using pointer = const double*;
65 using reference = double; // input iterator:按值返回
66
67 iterator() = default;
68 iterator(const DoubleRange* range, size_t idx)
69 : range_(range), idx_(idx) {}
70
72 reference operator*() const
73 {
74 return (idx_ == range_->n_ - 1)
75 ? range_->stop_
76 : range_->start_ + range_->step_ * idx_;
77 }
78
79 iterator& operator++() { ++idx_; return *this; }
80 iterator operator++(int) { auto tmp = *this; ++*this; return tmp; }
81
82 bool operator==(const iterator& other) const { return idx_ == other.idx_; }
83 bool operator!=(const iterator& other) const { return !(*this == other); }
84
85 private:
86 const DoubleRange* range_ = nullptr;
87 size_t idx_ = 0;
88 };
89
90 iterator begin() const { return iterator(this, 0); }
91 iterator end() const { return iterator(this, n_); }
92 size_t size() const { return n_; }
93
97 double operator[](size_t i) const
98 {
99 return (i == n_ - 1) ? stop_ : start_ + step_ * i;
100 }
101
102 double start() const {return start_;}
103 double stop() const {return stop_;}
104 double step() const {return step_;}
105
106private:
107 double start_;
108 double stop_;
109 double step_;
110 size_t n_;
111};
112
113
117AST_NAMESPACE_END
定义 DoubleRange.hpp:59
reference operator*() const
解引用:除末点按 step 步进,末点返回 stop_
定义 DoubleRange.hpp:72
按步长采样的相对秒范围(惰性可迭代)
定义 DoubleRange.hpp:43
double operator[](size_t i) const
下标访问:返回第 i 个采样值(末点返回 stop_)
定义 DoubleRange.hpp:97
DoubleRange(double start, double stop, double step, size_t n)
构造相对秒采样范围
定义 DoubleRange.hpp:50
A_ALWAYS_INLINE size_t aDiscretizedCount(double span, double step)
计算闭区间 [0, span] 按 step 步长采样(含两端点)的采样点数
定义 Math.hpp:107