Skip to content

File PayloadPlatform.hpp

File List > astrea > astro > astro > platforms > PayloadPlatform.hpp

Go to the documentation of this file

#pragma once

#include <vector>

#include <astro/frames/FrameReference.hpp>
#include <astro/types/typedefs.hpp>


namespace astrea {
namespace astro {

template <class Payload_T>
class PayloadPlatform : virtual public FrameReference {

    using PayloadParameters_T = decltype(std::declval<Payload_T>().get_parameters());

  protected:
    PayloadPlatform() = default;

    virtual ~PayloadPlatform() = default;

    PayloadPlatform(const PayloadPlatform& other)
    {
        _payloads = other._payloads;
        reset_payload_parentage();
    }

    PayloadPlatform(PayloadPlatform&& other) noexcept
    {
        _payloads = std::move(other._payloads);
        reset_payload_parentage();
    }

    PayloadPlatform& operator=(const PayloadPlatform& other)
    {
        if (this != &other) {
            _payloads = other._payloads;
            reset_payload_parentage();
        }
        return *this;
    }

    PayloadPlatform& operator=(PayloadPlatform&& other) noexcept
    {
        if (this != &other) {
            _payloads = std::move(other._payloads);
            reset_payload_parentage();
        }
        return *this;
    }

  public:
    virtual std::size_t get_id() const = 0;

    virtual Mass get_mass() const { return 0.0 * mp_units::si::unit_symbols::kg; }

    void attach_payload(const PayloadParameters_T& parameters) { _payloads.emplace_back(Payload_T(*this, parameters)); }

    void attach_payloads(const std::vector<PayloadParameters_T>& parameterPack)
    {
        for (const auto& parameters : parameterPack) {
            attach_payload(parameters);
        }
    }

    std::vector<Payload_T>& get_payloads() { return _payloads; }

    const std::vector<Payload_T>& get_payloads() const { return _payloads; }

  protected:
    std::vector<Payload_T> _payloads; // List of payloads attached to the platform

    void reset_payload_parentage()
    {
        for (auto& payload : _payloads) {
            payload.set_parent(*this);
        }
    }
};


} // namespace astro
} // namespace astrea