limes 3.1.0
Composable Calculus Expressions for C++20
Loading...
Searching...
No Matches
const.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <span>
4#include <string>
5#include <cstddef>
6#include <sstream>
7
8namespace limes::expr {
9
10// Forward declarations for marker types
11template<typename T> struct Zero;
12template<typename T> struct One;
13
14// Type traits for marker constants (defined early for use by all types)
15template<typename E> inline constexpr bool is_zero_v = false;
16template<typename T> inline constexpr bool is_zero_v<Zero<T>> = true;
17
18template<typename E> inline constexpr bool is_one_v = false;
19template<typename T> inline constexpr bool is_one_v<One<T>> = true;
20
21// Zero<T>: Compile-time zero constant for algebraic simplification
22template<typename T>
23struct Zero {
24 using value_type = T;
25 static constexpr std::size_t arity_v = 0;
26
27 constexpr Zero() noexcept = default;
28
29 [[nodiscard]] constexpr T eval(std::span<T const> /*args*/) const noexcept {
30 return T(0);
31 }
32
33 [[nodiscard]] [[deprecated("use eval() instead")]]
34 constexpr T evaluate(std::span<T const> args) const noexcept {
35 return eval(args);
36 }
37
38 template<std::size_t Dim>
39 [[nodiscard]] constexpr auto derivative() const noexcept {
40 return Zero<T>{};
41 }
42
43 [[nodiscard]] std::string to_string() const { return "0"; }
44};
45
46// One<T>: Compile-time one constant for algebraic simplification
47template<typename T>
48struct One {
49 using value_type = T;
50 static constexpr std::size_t arity_v = 0;
51
52 constexpr One() noexcept = default;
53
54 [[nodiscard]] constexpr T eval(std::span<T const> /*args*/) const noexcept {
55 return T(1);
56 }
57
58 [[nodiscard]] [[deprecated("use eval() instead")]]
59 constexpr T evaluate(std::span<T const> args) const noexcept {
60 return eval(args);
61 }
62
63 template<std::size_t Dim>
64 [[nodiscard]] constexpr auto derivative() const noexcept {
65 return Zero<T>{};
66 }
67
68 [[nodiscard]] std::string to_string() const { return "1"; }
69};
70
71// Const<T>: A constant value expression node (arity 0)
72template<typename T>
73struct Const {
74 using value_type = T;
75 static constexpr std::size_t arity_v = 0;
76
78
79 constexpr Const() noexcept : value{} {}
80 constexpr explicit Const(T v) noexcept : value{v} {}
81
82 [[nodiscard]] constexpr T eval(std::span<T const> /*args*/) const noexcept {
83 return value;
84 }
85
86 [[nodiscard]] [[deprecated("use eval() instead")]]
87 constexpr T evaluate(std::span<T const> args) const noexcept {
88 return eval(args);
89 }
90
91 template<std::size_t Dim>
92 [[nodiscard]] constexpr auto derivative() const noexcept {
93 return Zero<T>{};
94 }
95
96 [[nodiscard]] std::string to_string() const {
97 std::ostringstream oss;
98 oss << value;
99 return oss.str();
100 }
101};
102
103template<typename T>
105
106template<typename T>
107[[nodiscard]] constexpr auto constant(T value) noexcept {
108 return Const<T>{value};
109}
110
111} // namespace limes::expr
Expression layer for composable calculus.
Definition analysis.hpp:7
constexpr bool is_one_v
Definition const.hpp:18
constexpr auto constant(T value) noexcept
Definition const.hpp:107
constexpr bool is_zero_v
Definition const.hpp:15
std::string to_string() const
Definition const.hpp:96
static constexpr std::size_t arity_v
Definition const.hpp:75
constexpr Const(T v) noexcept
Definition const.hpp:80
constexpr T eval(std::span< T const >) const noexcept
Definition const.hpp:82
constexpr auto derivative() const noexcept
Definition const.hpp:92
constexpr T evaluate(std::span< T const > args) const noexcept
Definition const.hpp:87
constexpr Const() noexcept
Definition const.hpp:79
constexpr auto derivative() const noexcept
Definition const.hpp:64
static constexpr std::size_t arity_v
Definition const.hpp:50
constexpr T evaluate(std::span< T const > args) const noexcept
Definition const.hpp:59
std::string to_string() const
Definition const.hpp:68
constexpr One() noexcept=default
constexpr T eval(std::span< T const >) const noexcept
Definition const.hpp:54
constexpr Zero() noexcept=default
constexpr T eval(std::span< T const >) const noexcept
Definition const.hpp:29
constexpr T evaluate(std::span< T const > args) const noexcept
Definition const.hpp:34
constexpr auto derivative() const noexcept
Definition const.hpp:39
static constexpr std::size_t arity_v
Definition const.hpp:25
std::string to_string() const
Definition const.hpp:43