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