Skip to content

File StateHistory.hpp

File List > astrea > astro > astro > state > StateHistory.hpp

Go to the documentation of this file

#pragma once

#include <gtl/btree.hpp>

#include <astro/state/State.hpp>
#include <astro/types/typedefs.hpp>

namespace astrea {
namespace astro {

class StateHistory {

    using StateMap      = gtl::btree_map<Date, State>;
    using EventTimesMap = gtl::btree_map<std::string, std::vector<Date>>;

  public:
    StateHistory() = default;

    StateHistory(const std::size_t& objectId) :
        _objectId(objectId)
    {
    }

    ~StateHistory() = default;

    State& operator[](const Date& date);

    const State& at(const Date& date) const;

    void insert(const State& state);

    std::size_t size() const;

    void clear();

    const Date& epoch() const { return _states.begin()->first; }

    const State& first() const { return _states.begin()->second; }

    const State& last() const { return _states.rbegin()->second; }

    void set_object_id(const std::size_t& objectId) { _objectId = objectId; }

    std::size_t get_object_id() const { return _objectId; }

    const State& get_closest_state(const Date& date) const;

    State get_state_at(const Date& date) const;

    void set_event_times(const EventTimesMap& eventTimes) { _eventTimes = eventTimes; }

    const EventTimesMap& get_event_times() const { return _eventTimes; }

    EventTimesMap& get_event_times() { return _eventTimes; }

    using iterator = StateMap::iterator;

    using const_iterator = StateMap::const_iterator;

    iterator begin() { return _states.begin(); }

    iterator end() { return _states.end(); }

    const_iterator begin() const { return _states.begin(); }

    const_iterator end() const { return _states.end(); }

    const_iterator cbegin() const { return _states.cbegin(); }

    const_iterator cend() const { return _states.cend(); }

  private:
    StateMap _states;          
    EventTimesMap _eventTimes; 
    std::size_t _objectId = 0; 
};

} // namespace astro
} // namespace astrea