From 0450dc35474370b4e6daf89738bbec76562c5e6f Mon Sep 17 00:00:00 2001 From: Orange Date: Tue, 12 Aug 2025 09:21:34 +0300 Subject: [PATCH] Adds concept for prediction engine traits Introduces a concept `PredEngineConcept` to ensure that classes used as projectile prediction engine traits conform to a specific interface. This enforces the presence and return types of required methods and ensures that these methods are `noexcept`, improving type safety and predictability. --- .../proj_pred_engine_legacy.hpp | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/include/omath/projectile_prediction/proj_pred_engine_legacy.hpp b/include/omath/projectile_prediction/proj_pred_engine_legacy.hpp index 8d44255..f253c8e 100644 --- a/include/omath/projectile_prediction/proj_pred_engine_legacy.hpp +++ b/include/omath/projectile_prediction/proj_pred_engine_legacy.hpp @@ -13,7 +13,32 @@ namespace omath::projectile_prediction { + template + concept PredEngineConcept = + requires(const Projectile& projectile, const Target& target, const Vector3& vec_a, + const Vector3& vec_b, + Vector3 v3, // by-value for calc_viewpoint_from_angles + float pitch, float yaw, float time, float gravity, std::optional maybe_pitch) { + // Presence + return types + { T::predict_projectile_position(projectile, pitch, yaw, time, gravity) } -> std::same_as; + { T::predict_target_position(target, time, gravity) } -> std::same_as; + { T::calc_vector_2d_distance(vec_a) } -> std::same_as; + { T::get_vector_height_coordinate(vec_b) } -> std::same_as; + { T::calc_viewpoint_from_angles(projectile, v3, maybe_pitch) } -> std::same_as; + { T::calc_direct_pitch_angle(vec_a, vec_b) } -> std::same_as; + { T::calc_direct_yaw_angle(vec_a, vec_b) } -> std::same_as; + + // Enforce noexcept as in PredEngineTrait + requires noexcept(T::predict_projectile_position(projectile, pitch, yaw, time, gravity)); + requires noexcept(T::predict_target_position(target, time, gravity)); + requires noexcept(T::calc_vector_2d_distance(vec_a)); + requires noexcept(T::get_vector_height_coordinate(vec_b)); + requires noexcept(T::calc_viewpoint_from_angles(projectile, v3, maybe_pitch)); + requires noexcept(T::calc_direct_pitch_angle(vec_a, vec_b)); + requires noexcept(T::calc_direct_yaw_angle(vec_a, vec_b)); + }; template + requires PredEngineConcept class ProjPredEngineLegacy final : public ProjPredEngineInterface { public: