siderust-cpp 0.8.0
Header-only C++ wrapper for siderust
Loading...
Searching...
No Matches
subject.hpp
Go to the documentation of this file.
1#pragma once
2
43#include "altitude.hpp"
44#include "azimuth.hpp"
45#include "bodies.hpp"
46#include "body_target.hpp"
47#include "coordinates.hpp"
48#include "ffi_core.hpp"
49#include "target.hpp"
50#include "time.hpp"
51#include <vector>
52
53namespace siderust {
54
55// ============================================================================
56// SubjectKind enum
57// ============================================================================
58
62enum class SubjectKind : int32_t {
63 Body = SIDERUST_SUBJECT_KIND_T_BODY,
64 Star = SIDERUST_SUBJECT_KIND_T_STAR,
65 Icrs = SIDERUST_SUBJECT_KIND_T_ICRS,
66 GenericTarget = SIDERUST_SUBJECT_KIND_T_GENERIC_TARGET,
67};
68
69// ============================================================================
70// Subject value type
71// ============================================================================
72
82class Subject {
83public:
84 // -- Factories --------------------------------------------------------
85
87 static Subject body(Body b) {
88 siderust_subject_t s{};
89 s.kind = SIDERUST_SUBJECT_KIND_T_BODY;
90 s.body = static_cast<SiderustBody>(b);
91 return Subject(s);
92 }
93
99 siderust_subject_t s{};
100 s.kind = SIDERUST_SUBJECT_KIND_T_STAR;
101 s.star_handle = star.c_handle();
102 return Subject(s);
103 }
104
112 siderust_subject_t s{};
113 s.kind = SIDERUST_SUBJECT_KIND_T_ICRS;
114 s.icrs_dir = dir.to_c();
115 return Subject(s);
116 }
117
124 template <typename C> static Subject target(const DirectionTarget<C> &tgt) {
125 siderust_subject_t s{};
126 s.kind = SIDERUST_SUBJECT_KIND_T_GENERIC_TARGET;
127 s.generic_target_handle = tgt.c_handle();
128 return Subject(s);
129 }
130
131 // -- Accessors --------------------------------------------------------
132
133 SubjectKind kind() const { return static_cast<SubjectKind>(inner_.kind); }
134 const siderust_subject_t &c_inner() const { return inner_; }
135
136private:
137 siderust_subject_t inner_{};
138 explicit Subject(siderust_subject_t s) : inner_(s) {}
139};
140
141// ============================================================================
142// Unified free functions
143// ============================================================================
144
148inline qtty::Radian altitude_at(const Subject &subj, const Geodetic &obs,
149 const Time<TT, MJD> &mjd) {
150 double out;
151 check_status(siderust_altitude_at(subj.c_inner(), obs.to_c(), mjd.value(), &out),
152 "altitude_at(Subject)");
153 return qtty::Radian(out);
154}
155
159inline std::vector<Period<TT, MJD>> above_threshold(const Subject &subj, const Geodetic &obs,
160 const Period<TT, MJD> &window,
161 qtty::Degree threshold,
162 const SearchOptions &opts = {}) {
163 tempoch_period_mjd_t *ptr = nullptr;
164 uintptr_t count = 0;
165 check_status(siderust_above_threshold(subj.c_inner(), obs.to_c(), window.c_inner(),
166 threshold.value(), opts.to_c(), &ptr, &count),
167 "above_threshold(Subject)");
168 return detail::periods_from_c(ptr, count);
169}
170
174inline std::vector<Period<TT, MJD>> below_threshold(const Subject &subj, const Geodetic &obs,
175 const Period<TT, MJD> &window,
176 qtty::Degree threshold,
177 const SearchOptions &opts = {}) {
178 tempoch_period_mjd_t *ptr = nullptr;
179 uintptr_t count = 0;
180 check_status(siderust_below_threshold(subj.c_inner(), obs.to_c(), window.c_inner(),
181 threshold.value(), opts.to_c(), &ptr, &count),
182 "below_threshold(Subject)");
183 return detail::periods_from_c(ptr, count);
184}
185
189inline std::vector<CrossingEvent> crossings(const Subject &subj, const Geodetic &obs,
190 const Period<TT, MJD> &window, qtty::Degree threshold,
191 const SearchOptions &opts = {}) {
192 siderust_crossing_event_t *ptr = nullptr;
193 uintptr_t count = 0;
194 check_status(siderust_crossings(subj.c_inner(), obs.to_c(), window.c_inner(), threshold.value(),
195 opts.to_c(), &ptr, &count),
196 "crossings(Subject)");
197 return detail::crossings_from_c(ptr, count);
198}
199
203inline std::vector<CulminationEvent> culminations(const Subject &subj, const Geodetic &obs,
204 const Period<TT, MJD> &window,
205 const SearchOptions &opts = {}) {
206 siderust_culmination_event_t *ptr = nullptr;
207 uintptr_t count = 0;
208 check_status(siderust_culminations(subj.c_inner(), obs.to_c(), window.c_inner(), opts.to_c(),
209 &ptr, &count),
210 "culminations(Subject)");
211 return detail::culminations_from_c(ptr, count);
212}
213
217inline std::vector<Period<TT, MJD>> altitude_ranges(const Subject &subj, const Geodetic &obs,
218 const Period<TT, MJD> &window,
219 qtty::Degree min_alt, qtty::Degree max_alt,
220 const SearchOptions &opts = {}) {
221 tempoch_period_mjd_t *ptr = nullptr;
222 uintptr_t count = 0;
223 check_status(siderust_altitude_ranges(subj.c_inner(), obs.to_c(), window.c_inner(),
224 min_alt.value(), max_alt.value(), opts.to_c(), &ptr,
225 &count),
226 "altitude_ranges(Subject)");
227 return detail::periods_from_c(ptr, count);
228}
229
233inline qtty::Degree azimuth_at(const Subject &subj, const Geodetic &obs, const Time<TT, MJD> &mjd) {
234 double out;
235 check_status(siderust_azimuth_at(subj.c_inner(), obs.to_c(), mjd.value(), &out),
236 "azimuth_at(Subject)");
237 return qtty::Degree(out);
238}
239
243inline std::vector<AzimuthCrossingEvent> azimuth_crossings(const Subject &subj, const Geodetic &obs,
244 const Period<TT, MJD> &window,
245 qtty::Degree bearing,
246 const SearchOptions &opts = {}) {
247 siderust_azimuth_crossing_event_t *ptr = nullptr;
248 uintptr_t count = 0;
249 check_status(siderust_azimuth_crossings(subj.c_inner(), obs.to_c(), window.c_inner(),
250 bearing.value(), opts.to_c(), &ptr, &count),
251 "azimuth_crossings(Subject)");
252 return detail::az_crossings_from_c(ptr, count);
253}
254
258inline std::vector<AzimuthExtremum> azimuth_extrema(const Subject &subj, const Geodetic &obs,
259 const Period<TT, MJD> &window,
260 const SearchOptions &opts = {}) {
261 siderust_azimuth_extremum_t *ptr = nullptr;
262 uintptr_t count = 0;
263 check_status(siderust_azimuth_extrema(subj.c_inner(), obs.to_c(), window.c_inner(), opts.to_c(),
264 &ptr, &count),
265 "azimuth_extrema(Subject)");
266 return detail::az_extrema_from_c(ptr, count);
267}
268
272inline std::vector<Period<TT, MJD>> in_azimuth_range(const Subject &subj, const Geodetic &obs,
273 const Period<TT, MJD> &window,
274 qtty::Degree min_deg, qtty::Degree max_deg,
275 const SearchOptions &opts = {}) {
276 tempoch_period_mjd_t *ptr = nullptr;
277 uintptr_t count = 0;
278 check_status(siderust_in_azimuth_range(subj.c_inner(), obs.to_c(), window.c_inner(),
279 min_deg.value(), max_deg.value(), opts.to_c(), &ptr,
280 &count),
281 "in_azimuth_range(Subject)");
282 return detail::periods_from_c(ptr, count);
283}
284
285} // namespace siderust
Altitude computations for Sun, Moon, stars, and arbitrary ICRS directions.
Azimuth computations for Sun, Moon, stars, and arbitrary ICRS directions.
RAII Star handle, Planet value type, and catalog helpers.
Target implementation for solar-system bodies.
Fixed celestial direction target — a Target for a specific sky position.
Definition target.hpp:112
const SiderustGenericTarget * c_handle() const
Access the underlying C handle (advanced use).
Definition target.hpp:342
RAII handle to a Star (opaque Rust object).
Definition bodies.hpp:176
Unified, lightweight handle representing any celestial subject.
Definition subject.hpp:82
const siderust_subject_t & c_inner() const
Definition subject.hpp:134
static Subject body(Body b)
Create a subject for a solar-system body.
Definition subject.hpp:87
SubjectKind kind() const
Definition subject.hpp:133
static Subject target(const DirectionTarget< C > &tgt)
Create a subject borrowing an opaque SiderustTarget handle.
Definition subject.hpp:124
static Subject star(const siderust::Star &star)
Create a subject borrowing a Star handle.
Definition subject.hpp:98
static Subject icrs(const spherical::Direction< frames::ICRS > &dir)
Create a subject for an inline ICRS direction.
Definition subject.hpp:111
Coordinate module umbrella.
Error handling and utility base for the siderust C++ wrapper.
std::vector< AzimuthExtremum > az_extrema_from_c(siderust_azimuth_extremum_t *ptr, uintptr_t count)
Definition azimuth.hpp:85
std::vector< CrossingEvent > crossings_from_c(siderust_crossing_event_t *ptr, uintptr_t count)
Definition altitude.hpp:87
std::vector< CulminationEvent > culminations_from_c(siderust_culmination_event_t *ptr, uintptr_t count)
Definition altitude.hpp:98
std::vector< AzimuthCrossingEvent > az_crossings_from_c(siderust_azimuth_crossing_event_t *ptr, uintptr_t count)
Definition azimuth.hpp:74
std::vector< Period< TT, MJD > > periods_from_c(tempoch_period_mjd_t *ptr, uintptr_t count)
Definition altitude.hpp:77
SubjectKind
Discriminant for the active field in a Subject.
Definition subject.hpp:62
tempoch::EncodedTime< Scale, Format > Time
Definition time.hpp:36
void check_status(siderust_status_t status, const char *operation)
Definition ffi_core.hpp:111
std::vector< Period< TT, MJD > > in_azimuth_range(const Subject &subj, const Geodetic &obs, const Period< TT, MJD > &window, qtty::Degree min_deg, qtty::Degree max_deg, const SearchOptions &opts={})
Periods when a subject's azimuth is within [min_deg, max_deg].
Definition subject.hpp:272
tempoch::Period< Time< Scale, Format > > Period
Definition time.hpp:37
std::vector< CrossingEvent > crossings(const Subject &subj, const Geodetic &obs, const Period< TT, MJD > &window, qtty::Degree threshold, const SearchOptions &opts={})
Threshold-crossing events for a subject.
Definition subject.hpp:189
std::vector< AzimuthCrossingEvent > azimuth_crossings(const Subject &subj, const Geodetic &obs, const Period< TT, MJD > &window, qtty::Degree bearing, const SearchOptions &opts={})
Azimuth bearing-crossing events for a subject.
Definition subject.hpp:243
std::vector< Period< TT, MJD > > altitude_ranges(const Subject &subj, const Geodetic &obs, const Period< TT, MJD > &window, qtty::Degree min_alt, qtty::Degree max_alt, const SearchOptions &opts={})
Periods when a subject's altitude is within [min, max].
Definition subject.hpp:217
std::vector< AzimuthExtremum > azimuth_extrema(const Subject &subj, const Geodetic &obs, const Period< TT, MJD > &window, const SearchOptions &opts={})
Azimuth extrema (northernmost / southernmost) for a subject.
Definition subject.hpp:258
std::vector< Period< TT, MJD > > below_threshold(const Subject &subj, const Geodetic &obs, const Period< TT, MJD > &window, qtty::Degree threshold, const SearchOptions &opts={})
Periods when a subject is below a threshold altitude.
Definition subject.hpp:174
std::vector< CulminationEvent > culminations(const Subject &subj, const Geodetic &obs, const Period< TT, MJD > &window, const SearchOptions &opts={})
Culmination (local extrema) events for a subject.
Definition subject.hpp:203
qtty::Degree azimuth_at(const Subject &subj, const Geodetic &obs, const Time< TT, MJD > &mjd)
Azimuth at an instant (degrees, N-clockwise) for any subject.
Definition subject.hpp:233
qtty::Radian altitude_at(const Subject &subj, const Geodetic &obs, const Time< TT, MJD > &mjd)
Altitude at an instant (radians) for any subject.
Definition subject.hpp:148
std::vector< Period< TT, MJD > > above_threshold(const Subject &subj, const Geodetic &obs, const Period< TT, MJD > &window, qtty::Degree threshold, const SearchOptions &opts={})
Periods when a subject is above a threshold altitude.
Definition subject.hpp:159
Body
Identifies a solar-system body for generic altitude/azimuth dispatch.
Geodetic position (WGS84 ellipsoid).
Definition geodetic.hpp:29
siderust_geodetic_t to_c() const
Convert to C FFI struct.
Definition geodetic.hpp:44
Options for altitude search algorithms.
Definition altitude.hpp:58
A direction on the celestial sphere, compile-time tagged by frame.
Definition spherical.hpp:50
siderust_spherical_dir_t to_c() const
Strongly-typed fixed-direction Target for any supported frame.
Public siderust time tags and typed time/period aliases.