Add std::format formatters for basic math types

This commit is contained in:
Nikita Lisitsa 2025-04-04 21:07:19 +03:00
parent 6a8a896aba
commit 57f9f7331c
5 changed files with 126 additions and 0 deletions

View file

@ -5,6 +5,7 @@
#include <psemek/math/point.hpp>
#include <iostream>
#include <format>
namespace psemek::math
{
@ -348,3 +349,34 @@ namespace psemek::math
}
}
namespace std
{
template <typename T, std::size_t N, typename Char>
struct formatter<::psemek::math::box<T, N>, Char>
{
constexpr auto parse(std::format_parse_context & ctx)
{
return ctx.begin();
}
auto format(::psemek::math::point<T, N> const & p, std::format_context & ctx) const
{
if constexpr (N == 0)
{
return std::format_to(ctx.out(), "()");
}
else
{
auto out = ctx.out();
out = std::format_to(out, "({}", p[0]);
for (std::size_t i = 1; i < p.dimension(); ++i)
out = std::format_to(out, ", {}", p[i]);
out = std::format_to(out, ")");
return out;
}
}
};
}

View file

@ -4,6 +4,7 @@
#include <limits>
#include <type_traits>
#include <cmath>
#include <format>
namespace psemek::math
{
@ -302,3 +303,22 @@ namespace psemek::math
}
}
namespace std
{
template <typename T, typename Char>
struct formatter<::psemek::math::interval<T>, Char>
{
constexpr auto parse(std::format_parse_context & ctx)
{
return ctx.begin();
}
auto format(::psemek::math::interval<T> const & i, std::format_context & ctx) const
{
return std::format_to(ctx.out(), "[{} .. {}]", i.min, i.max);
}
};
}

View file

@ -6,6 +6,7 @@
#include <psemek/math/vector.hpp>
#include <iostream>
#include <format>
namespace psemek::math
{
@ -232,4 +233,30 @@ namespace std
}
};
template <typename T, std::size_t N, typename Char>
struct formatter<::psemek::math::point<T, N>, Char>
{
constexpr auto parse(std::format_parse_context & ctx)
{
return ctx.begin();
}
auto format(::psemek::math::point<T, N> const & p, std::format_context & ctx) const
{
if constexpr (N == 0)
{
return std::format_to(ctx.out(), "()");
}
else
{
auto out = ctx.out();
out = std::format_to(out, "({}", p[0]);
for (std::size_t i = 1; i < p.dimension(); ++i)
out = std::format_to(out, ", {}", p[i]);
out = std::format_to(out, ")");
return out;
}
}
};
}

View file

@ -5,6 +5,8 @@
#include <psemek/math/matrix.hpp>
#include <psemek/math/interval.hpp>
#include <format>
namespace psemek::math
{
@ -338,3 +340,22 @@ namespace psemek::math
}
}
namespace std
{
template <typename T, typename Char>
struct formatter<::psemek::math::quaternion<T>, Char>
{
constexpr auto parse(std::format_parse_context & ctx)
{
return ctx.begin();
}
auto format(::psemek::math::quaternion<T> const & q, std::format_context & ctx) const
{
return std::format_to(ctx.out(), "{}", q.coords);
}
};
}

View file

@ -522,4 +522,30 @@ namespace std
}
};
template <typename T, std::size_t N, typename Char>
struct formatter<::psemek::math::vector<T, N>, Char>
{
constexpr auto parse(std::format_parse_context & ctx)
{
return ctx.begin();
}
auto format(::psemek::math::vector<T, N> const & v, std::format_context & ctx) const
{
if constexpr (N == 0)
{
return std::format_to(ctx.out(), "()");
}
else
{
auto out = ctx.out();
out = std::format_to(out, "({}", v[0]);
for (std::size_t i = 1; i < v.dimension(); ++i)
out = std::format_to(out, ", {}", v[i]);
out = std::format_to(out, ")");
return out;
}
}
};
}