Celestia
1// trajmanager.cpp
2//
3// Copyright (C) 2001-2008 Chris Laurel <claurel@gmail.com>
4//
5// This program is free software; you can redistribute it and/or
6// modify it under the terms of the GNU General Public License
7// as published by the Free Software Foundation; either version 2
8// of the License, or (at your option) any later version.
9
10#include "trajmanager.h"
11
12#include <utility>
13
14#include <celephem/samporbit.h>
15
16namespace celestia::engine
17{
18
19std::shared_ptr<const ephem::Orbit>
20TrajectoryManager::find(const fs::path& source,
21const fs::path& path,
22ephem::TrajectoryInterpolation interpolation,
23ephem::TrajectoryPrecision precision)
24{
25auto filename = path.empty()
26? "data" / source
27: path / "data" / source;
28
29auto it = orbits.try_emplace(Key { std::move(filename), interpolation, precision }).first;
30if (auto cachedOrbit = it->second.lock(); cachedOrbit != nullptr)
31return cachedOrbit;
32
33auto orbit = ephem::LoadSampledTrajectory(it->first.path, interpolation, precision);
34if (orbit == nullptr)
35{
36orbits.erase(it);
37return nullptr;
38}
39
40it->second = orbit;
41return orbit;
42}
43
44TrajectoryManager*
45GetTrajectoryManager()
46{
47static TrajectoryManager* const manager = std::make_unique<TrajectoryManager>().release(); //NOSONAR
48return manager;
49}
50
51} // end namespace celestia::engine
52