11template<
typename T>
struct Zero;
12template<
typename T>
struct One;
15template<
typename E>
inline constexpr bool is_zero_v =
false;
16template<
typename T>
inline constexpr bool is_zero_v<Zero<T>> =
true;
18template<
typename E>
inline constexpr bool is_one_v =
false;
19template<
typename T>
inline constexpr bool is_one_v<One<T>> =
true;
27 constexpr Zero() noexcept = default;
29 [[nodiscard]] constexpr T
eval(std::span<T const> ) const noexcept {
33 [[nodiscard]] [[deprecated(
"use eval() instead")]]
34 constexpr T
evaluate(std::span<T const> args)
const noexcept {
38 template<std::
size_t Dim>
39 [[nodiscard]]
constexpr auto derivative() const noexcept {
43 [[nodiscard]] std::string
to_string()
const {
return "0"; }
52 constexpr One() noexcept = default;
54 [[nodiscard]] constexpr T
eval(std::span<T const> ) const noexcept {
58 [[nodiscard]] [[deprecated(
"use eval() instead")]]
59 constexpr T
evaluate(std::span<T const> args)
const noexcept {
63 template<std::
size_t Dim>
64 [[nodiscard]]
constexpr auto derivative() const noexcept {
68 [[nodiscard]] std::string
to_string()
const {
return "1"; }
82 [[nodiscard]]
constexpr T
eval(std::span<T const> )
const noexcept {
86 [[nodiscard]] [[deprecated(
"use eval() instead")]]
87 constexpr T
evaluate(std::span<T const> args)
const noexcept {
91 template<std::
size_t Dim>
92 [[nodiscard]]
constexpr auto derivative() const noexcept {
97 std::ostringstream oss;
107[[nodiscard]]
constexpr auto constant(T value)
noexcept {
Expression layer for composable calculus.
constexpr auto constant(T value) noexcept
std::string to_string() const
static constexpr std::size_t arity_v
constexpr Const(T v) noexcept
constexpr T eval(std::span< T const >) const noexcept
constexpr auto derivative() const noexcept
constexpr T evaluate(std::span< T const > args) const noexcept
constexpr Const() noexcept
constexpr auto derivative() const noexcept
static constexpr std::size_t arity_v
constexpr T evaluate(std::span< T const > args) const noexcept
std::string to_string() const
constexpr One() noexcept=default
constexpr T eval(std::span< T const >) const noexcept
constexpr Zero() noexcept=default
constexpr T eval(std::span< T const >) const noexcept
constexpr T evaluate(std::span< T const > args) const noexcept
constexpr auto derivative() const noexcept
static constexpr std::size_t arity_v
std::string to_string() const