Tatooine
unary_operation_field.h
Go to the documentation of this file.
1#ifndef TATOOINE_UNARY_OPERATION_FIELD_H
2#define TATOOINE_UNARY_OPERATION_FIELD_H
3//==============================================================================
4#include <tatooine/field.h>
6//==============================================================================
7namespace tatooine {
8//==============================================================================
9template <typename Field, typename Op>
10requires (is_field<Field>) &&
11 (invocable<Op, field_tensor_type<Field>>)
13 : field<unary_operation_field<Field, Op>, field_real_type<Field>,
14 field_num_dimensions<Field>,
15 std::invoke_result_t<Op, field_tensor_type<Field>>> {
16 public:
18 using internal_field_type = Field;
20 field<this_type, field_real_type<Field>, field_num_dimensions<Field>,
21 std::invoke_result_t<Op, field_tensor_type<Field>>>;
22
23 using typename parent_type::pos_type;
24 using typename parent_type::real_type;
25 using typename parent_type::tensor_type;
26
27 private:
28 Field m_field;
29 Op m_op;
30
31 public:
32 template <convertible_to<Field> Field_, convertible_to<Op> Op_>
33 constexpr unary_operation_field(Field_&& field, Op_&& op)
34 : m_field{std::forward<Field_>(field)}, m_op{std::forward<Op_>(op)} {}
35 //----------------------------------------------------------------------------
36 template <convertible_to<Op> Op_>
37 constexpr unary_operation_field(Op_&& op)
38 requires std::is_pointer_v<std::decay_t<Field>>
39 : m_field{nullptr}, m_op{std::forward<Op_>(op)} {}
40 //----------------------------------------------------------------------------
41 constexpr unary_operation_field(unary_operation_field const&) = default;
42 //----------------------------------------------------------------------------
43 constexpr unary_operation_field(unary_operation_field&&) noexcept = default;
44 //----------------------------------------------------------------------------
45 constexpr auto operator=(unary_operation_field const&)
46 -> unary_operation_field& = default;
47 //----------------------------------------------------------------------------
48 constexpr auto operator=(unary_operation_field&&) noexcept
49 -> unary_operation_field& = default;
50 //----------------------------------------------------------------------------
51 ~unary_operation_field() override = default;
52 //============================================================================
53 constexpr auto evaluate(pos_type const& x, real_type const t) const
54 -> tensor_type {
55 if constexpr (std::is_pointer_v<std::decay_t<Field>>) {
56 return m_op(m_field->evaluate(x, t));
57 } else {
58 return m_op(m_field(x, t));
59 }
60 }
61 //============================================================================
62 auto internal_field() const -> decltype(auto) { return m_field; }
63 auto internal_field() -> decltype(auto) { return m_field; }
64};
65//==============================================================================
66template <typename Field, typename Op>
67requires (!std::is_pointer_v<std::decay_t<Field>>)
70//------------------------------------------------------------------------------
71template <typename Field, typename Op>
72requires (!std::is_pointer_v<Field>)
73unary_operation_field(Field const& field, Op&& op)
75//------------------------------------------------------------------------------
76template <typename Field, typename Op>
77requires (!std::is_pointer_v<Field>)
80//==============================================================================
81template <typename Field, typename Op>
82requires (!std::is_pointer_v<std::decay_t<Field>>)
83unary_operation_field(Field&& field, Op const& op)
85//------------------------------------------------------------------------------
86template <typename Field, typename Op>
87requires (!std::is_pointer_v<Field>)
88unary_operation_field(Field const& field, Op const& op)
90//------------------------------------------------------------------------------
91template <typename Field, typename Op>
92requires (!std::is_pointer_v<Field>)
93unary_operation_field(Field& field, Op const& op)
95//==============================================================================
96template <typename Field, typename Op>
97requires (!std::is_pointer_v<std::decay_t<Field>>)
100//------------------------------------------------------------------------------
101template <typename Field, typename Op>
102requires (!std::is_pointer_v<Field>)
103unary_operation_field(Field const& field, Op& op)
105//------------------------------------------------------------------------------
106template <typename Field, typename Op>
107requires (!std::is_pointer_v<Field>)
110//==============================================================================
111template <typename Field, typename Op>
114//------------------------------------------------------------------------------
115template <typename Field, typename Op>
116unary_operation_field(Field const* field, Op&& op)
118//==============================================================================
119template <typename Field, typename Op>
120requires (is_field<Field>) &&
122constexpr auto operator|(Field&& field, Op&& op) {
123 return unary_operation_field{std::forward<Field>(field),
124 std::forward<Op>(op)};
125}
126//------------------------------------------------------------------------------
127template <typename Real, size_t N, typename Tensor, typename Op>
128requires (invocable<Op, Tensor>)
129constexpr auto operator|(polymorphic::field<Real, N, Tensor>* field, Op&& op) {
130 return unary_operation_field{field, std::forward<Op>(op)};
131}
132//==============================================================================
133} // namespace tatooine
134//==============================================================================
135#endif
Definition: concepts.h:121
Definition: field.h:231
Definition: algorithm.h:6
constexpr auto operator|(Field &&field, Op &&op)
Definition: unary_operation_field.h:122
static constexpr forward_tag forward
Definition: tags.h:9
typename std::decay_t< std::remove_pointer_t< std::decay_t< Field > > >::tensor_type field_tensor_type
Definition: field_type_traits.h:14
Definition: field.h:134
Real real_type
Definition: field.h:17
vec< real_type, NumDimensions > pos_type
Definition: field.h:20
Tensor tensor_type
Definition: field.h:18
Definition: field.h:13
Definition: unary_operation_field.h:15
Field internal_field_type
Definition: unary_operation_field.h:18
constexpr auto evaluate(pos_type const &x, real_type const t) const -> tensor_type
Definition: unary_operation_field.h:53
Op m_op
Definition: unary_operation_field.h:29
constexpr unary_operation_field(unary_operation_field &&) noexcept=default
constexpr unary_operation_field(Field_ &&field, Op_ &&op)
Definition: unary_operation_field.h:33
auto internal_field() -> decltype(auto)
Definition: unary_operation_field.h:63
Real real_type
Definition: field.h:17
auto internal_field() const -> decltype(auto)
Definition: unary_operation_field.h:62
constexpr unary_operation_field(unary_operation_field const &)=default
Field m_field
Definition: unary_operation_field.h:28
constexpr unary_operation_field(Op_ &&op)
Definition: unary_operation_field.h:37
Definition: vec.h:12