Files
MeanField_SERiF/src/compile_time_checks/serif/utils/laneemden.cpp

33 lines
2.1 KiB
C++

#include <concepts>
#include <expected>
#include <format>
#include <string>
#include "serif/utils/laneemden/laneemden.hpp"
namespace {
namespace laneemden = serif::utils::laneemden;
namespace dimensions = serif::dimensions;
/** @brief Physical reference inputs must carry their distinct dimensions. */
template <typename Mass, typename Density, typename Gravity>
concept CanScaleMass = requires(const laneemden::Solution &solution, Mass mass, Density density, Gravity gravity) {
{ laneemden::scale_from_mass(solution, mass, density, gravity) } -> std::same_as<std::expected<laneemden::PhysicalScales, std::string>>;
};
static_assert(CanScaleMass<dimensions::QuantityValue<dimensions::Mass>, dimensions::QuantityValue<dimensions::MassDensity>, dimensions::QuantityValue<dimensions::GravitationalConstant>>);
static_assert(!CanScaleMass<double, double, double>);
static_assert(!CanScaleMass<dimensions::QuantityValue<dimensions::Length>, dimensions::QuantityValue<dimensions::MassDensity>, dimensions::QuantityValue<dimensions::GravitationalConstant>>);
static_assert(!CanScaleMass<dimensions::QuantityValue<dimensions::Mass>, dimensions::QuantityValue<dimensions::Length>, dimensions::QuantityValue<dimensions::GravitationalConstant>>);
static_assert(std::same_as<decltype(laneemden::solve(3.0)), std::expected<laneemden::Solution, std::string>>);
static_assert(std::equality_comparable<laneemden::IntegrationOptions>);
static_assert(std::formattable<laneemden::Sample, char>);
static_assert(std::formattable<laneemden::Solution, char>);
/** @brief Literal formatting must parse selectors at compile time for both levels of the profile. */
constexpr std::format_string<laneemden::Sample, laneemden::Sample, laneemden::Sample, laneemden::Sample, laneemden::Sample>
sample_formats{"{} {:all} {:xi} {:theta} {:derivative}"};
constexpr std::format_string<laneemden::Solution, laneemden::Solution, laneemden::Solution, laneemden::Solution, laneemden::Solution>
solution_formats{"{} {:all} {:xi} {:theta} {:derivative}"};
}