diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..f49f5eb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,39 @@ +name: CI + +on: + pull_request: + workflow_dispatch: + push: + tags: + - "v*" + +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: write + checks: write + pull-requests: write + +jobs: + lint-cpp: + uses: ./.github/workflows/ci-lint.yml + + build-test-docs: + uses: ./.github/workflows/ci-build-test-docs.yml + + coverage: + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.draft == false }} + uses: ./.github/workflows/ci-coverage.yml + + package: + needs: build-test-docs + uses: ./.github/workflows/ci-package.yml + + release: + needs: package + if: startsWith(github.ref, 'refs/tags/v') + uses: ./.github/workflows/ci-release.yml + secrets: + PAGES_DEPLOY_TOKEN: ${{ secrets.PAGES_DEPLOY_TOKEN }} diff --git a/examples/time_example.cpp b/examples/time_example.cpp deleted file mode 100644 index f5eb33d..0000000 --- a/examples/time_example.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @file time_example.cpp - * @example time_example.cpp - * @brief Demonstrates the tempoch C++ API. - * - * Build and run: - * cmake -B build && cmake --build build - * ./build/time_example - */ - -#include -#include -#include -#include - -int main() { - using namespace tempoch; - - // --------------------------------------------------------------- - // UTC → JulianDate → MJD round-trip - // --------------------------------------------------------------- - UTC utc(2026, 7, 15, 22, 0, 0); - std::cout << "UTC: " << utc << "\n"; - - auto jd = JulianDate::from_utc(utc); - std::cout << "JD: " << std::fixed << std::setprecision(6) << jd << "\n"; - - auto mjd = MJD::from_jd(jd); - std::cout << "MJD: " << std::fixed << std::setprecision(6) << mjd << "\n"; - - auto utc2 = mjd.to_utc(); - std::cout << "Back: " << utc2 << "\n\n"; - - // --------------------------------------------------------------- - // J2000 epoch and Julian centuries - // --------------------------------------------------------------- - auto j2000 = JulianDate::J2000(); - std::cout << "J2000.0: " << j2000 << "\n"; - std::cout << "Centuries since J2000: " << jd.julian_centuries() << "\n\n"; - - // --------------------------------------------------------------- - // Period intersection (MJD — explicit MJD wrappers required) - // --------------------------------------------------------------- - Period night(MJD(60200.0), MJD(60200.5)); - Period obs(MJD(60200.2), MJD(60200.8)); - auto overlap = night.intersection(obs); - std::cout << "Night: " << night << "\n"; - std::cout << "Obs: " << obs << "\n"; - std::cout << "Overlap: " << overlap << "\n"; - std::cout << "Overlap duration: " << overlap.duration() << "\n\n"; - - // --------------------------------------------------------------- - // Period — start/end expressed directly as civil UTC - // --------------------------------------------------------------- - Period utc_semester(UTC(2026, 1, 1), UTC(2026, 7, 1)); - std::cout << "Semester (UTC): " << utc_semester << "\n"; - std::cout << " duration: " << utc_semester.duration() << "\n\n"; - - // --------------------------------------------------------------- - // Period — start/end as Julian Dates - // --------------------------------------------------------------- - auto jd_start = JulianDate::from_utc(UTC(2026, 1, 1)); - auto jd_end = JulianDate::from_utc(UTC(2026, 7, 1)); - Period jd_semester(jd_start, jd_end); - std::cout << "Semester (JD): " << jd_semester << "\n"; - std::cout << " duration: " << jd_semester.duration() << "\n"; - - return 0; -} diff --git a/examples/timescales.cpp b/examples/timescales.cpp deleted file mode 100644 index 412b3d8..0000000 --- a/examples/timescales.cpp +++ /dev/null @@ -1,124 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// Copyright (C) 2026 Vallés Puig, Ramon - -/** - * @file timescales.cpp - * @example timescales.cpp - * @brief Demonstrates every tempoch time-scale type and cross-scale conversion. - * - * Build and run: - * cmake -B build && cmake --build build - * ./build/timescales - * - * Time scales shown: - * JulianDate (JD), MJD, TDB, TT, TAI, TCG, TCB, GPS, UT (UT1), - * JDE (Julian Ephemeris Date ≡ TDB), UnixTime - */ - -#include -#include -#include -#include -#include - -int main() { - using namespace tempoch; - - std::cout << "=== tempoch Time-Scale Showcase ===\n\n"; - - // ── 1. Reference epoch J2000.0 ───────────────────────────────────────── - // - // JD 2 451 545.0 = 2000-01-01T12:00:00 TT. - // (2000-01-01T11:58:56Z in UTC because ΔT ≈ 63.8 s at this epoch.) - JulianDate jd = JulianDate(2'451'545.0); - std::cout << "Reference: J2000.0\n"; - std::cout << " JD value: " << std::fixed << std::setprecision(6) - << jd.value() << "\n\n"; - - // ── 2. Convert to every scale ─────────────────────────────────────────── - MJD mjd = jd.to(); - JDE jde = jd.to(); - TT tt = jd.to(); - TAI tai = jd.to(); - TDB tdb = jd.to(); - TCG tcg = jd.to(); - TCB tcb = jd.to(); - GPS gps = jd.to(); - UT ut = jd.to(); - UnixTime ux = jd.to(); - - std::cout << "Scale conversions at J2000.0:\n"; - std::cout << std::fixed << std::setprecision(9); - std::cout << " JD (JD 2451545.0) : " << jd.value() << "\n"; - std::cout << " MJD (JD − 2400000.5) : " << mjd.value() << "\n"; - std::cout << " JDE (≡ TDB, as JD) : " << jde.value() << "\n"; - std::cout << " TT (TAI + 32.184 s) : " << tt.value() << "\n"; - std::cout << " TAI (TT − 32.184 s) : " << tai.value() << "\n"; - std::cout << " TDB (≈ TT, periodic correction): " << tdb.value() << "\n"; - std::cout << " TCG (TT + secular rate) : " << tcg.value() << "\n"; - std::cout << " TCB (TDB + secular rate) : " << tcb.value() << "\n"; - std::cout << " GPS (TAI − 19 s) : " << gps.value() << "\n"; - std::cout << " UT1 (UTC + ΔT_earth) : " << ut.value() << "\n"; - std::cout << std::scientific << std::setprecision(3); - std::cout << " Unix (seconds since 1970-01-01): " << ux.value() << "\n\n"; - - // ── 3. Fixed offsets between compatible scale encodings (seconds) ────── - constexpr double SECS_PER_DAY = 86'400.0; - double tt_tai_s = (tt.value() - tai.value()) * SECS_PER_DAY; - - std::cout << std::fixed << std::setprecision(3); - std::cout << "Fixed offsets between scales:\n"; - std::cout << " TT − TAI = " << tt_tai_s << " s (constant 32.184 s)\n"; - std::cout << " GPS values use their own epoch-based numeric encoding, so\n"; - std::cout - << " inter-scale comparisons should go through typed conversions.\n\n"; - - // ── 4. Round-trips ────────────────────────────────────────────────────── - JulianDate jd_from_mjd = mjd.to(); - JulianDate jd_from_tt = tt.to(); - JulianDate jd_from_tai = tai.to(); - JulianDate jd_from_tdb = tdb.to(); - - std::cout << std::scientific << std::setprecision(3); - std::cout << "Round-trip JD → X → JD residuals (days):\n"; - std::cout << " JD → MJD → JD : " - << std::abs(jd_from_mjd.value() - jd.value()) << "\n"; - std::cout << " JD → TT → JD : " << std::abs(jd_from_tt.value() - jd.value()) - << "\n"; - std::cout << " JD → TAI → JD : " - << std::abs(jd_from_tai.value() - jd.value()) << "\n"; - std::cout << " JD → TDB → JD : " - << std::abs(jd_from_tdb.value() - jd.value()) << "\n\n"; - - // ── 5. Observable epoch (civil time → all scales) ────────────────────── - UTC obs(2026, 7, 15, 22, 0, 0); - JulianDate jd_obs = JulianDate::from_utc(obs); - MJD mjd_obs = jd_obs.to(); - TT tt_obs = jd_obs.to(); - TAI tai_obs = jd_obs.to(); - TDB tdb_obs = jd_obs.to(); - UT ut_obs = jd_obs.to(); - - std::cout << std::fixed << std::setprecision(6); - std::cout << "Observation: 2026-07-15 22:00:00 UTC\n"; - std::cout << " JD : " << jd_obs.value() << "\n"; - std::cout << " MJD : " << mjd_obs.value() << "\n"; - std::cout << " TT : " << tt_obs.value() << "\n"; - std::cout << " TAI : " << tai_obs.value() << "\n"; - std::cout << " TDB : " << tdb_obs.value() << "\n"; - std::cout << " ΔT : " << ut_obs.delta_t().value() << " s\n"; - std::cout << " Julian centuries since J2000: " << jd_obs.julian_centuries() - << "\n\n"; - - // ── 6. Cross-scale arithmetic: add 1 hour in GPS, round-trip to JD ───── - GPS gps_obs = jd_obs.to(); - GPS gps_obs_plus1h = gps_obs + qtty::Hour(1.0); - JulianDate jd_plus1h = gps_obs_plus1h.to(); - - std::cout << "GPS +1 h → JD difference: " << std::fixed - << std::setprecision(6) - << (jd_plus1h.value() - jd_obs.value()) * 24.0 << " h\n"; - - std::cout << "\n=== All time-scale examples completed successfully ===\n"; - return 0; -}