xtd 0.2.0
Loading...
Searching...
No Matches
member_expression.hpp
Go to the documentation of this file.
1
4#pragma once
5#include "as_expression.hpp"
8#include <utility>
9
11namespace xtd {
13 namespace expressions {
25 template <typename member_t>
26 struct member_type {
27 const char* name = nullptr;
28 member_t member;
29 };
30
42 template <typename member_t>
43 constexpr auto member(member_t member) {
44 return member_type<member_t>{"<member>", member};
45 }
46
57 template <typename member_t>
58 constexpr auto member(const char* name, member_t member) {
59 return member_type<member_t>{name, member};
60 }
61
75 template <typename expression_t, typename member_t>
76 struct member_expression : private expression {
78
83
85
88 constexpr member_expression() = default;
89
93 constexpr member_expression(expression_t expression, member_t member) : expression {std::move(expression)}, member {std::move(member)} {}
95
97
102 constexpr decltype(auto) operator()(auto&&... args) const {
103 auto&& obj = expression(std::forward<decltype(args)>(args)...);
104 if constexpr (std::is_pointer_v<std::decay_t<decltype(obj)>>) return (obj->*member.member);
105 else return (obj.*member.member);
106 }
107
109 friend inline auto operator <<(std::ostream& os, const member_expression& e) -> std::ostream& {return os << expression_stream {e.expression, e.precedence} << "." << e.member.name;}
111
112 private:
113 [[no_unique_address]] expression_t expression;
114 [[no_unique_address]] member_t member;
115 };
116
118
151 template <typename expression_t, typename member_t>
153 constexpr auto operator *(expression_t expression, member_type<member_t> member) {
154 auto expr = as_expression(expression);
155 return member_expression<std::decay_t<decltype(expr)>, member_type<member_t>> {std::move(expr), std::move(member)};
156 }
157
189 template <typename expression_t, typename member_t>
190 requires expression_operand<expression_t> || expression_operand<member_type<member_t>>
191 constexpr auto operator |(expression_t expression, member_type<member_t> member) {
192 return std::forward<expression_t>(expression) * std::forward<member_type<member_t>>(member);
193 }
194
195 }
196}
Contains xtd::expressions::as_expression methods.
The xtd::expressions::expression_operand object is expression operand concept.
Definition expression_operand.hpp:27
Contains xtd::expressions::expression_operand concept.
Contains xtd::expressions::expression_stream struct.
operator_precedence
Specifies the operator precedence.
Definition operator_precedence.hpp:22
constexpr auto operator|(expression_t expression, member_type< member_t > member)
Bind member operator.
Definition member_expression.hpp:191
constexpr decltype(auto) as_expression(type_t &&value)
The xtd::expressions::as_expression method convert a type as xtd::expressions::expression.
Definition as_expression.hpp:33
constexpr auto member(member_t member)
The xtd::expressions::member is use to bind object member.
Definition member_expression.hpp:43
constexpr auto operator*(expression_t expression, member_type< member_t > member)
Bind member operator.
Definition member_expression.hpp:153
constexpr auto operator<<(left_t left, right_t right)
Subtract the specified left and right operands.
Definition left_shift_expression.hpp:127
constexpr auto args()
Generates a set of positional placeholders that can be decomposed using structured bindings to build ...
Definition args.hpp:43
@ member_access
Represnets the member access operator precedence (a.b a->b).
Definition operator_precedence.hpp:44
@ e
The E key.
Definition console_key.hpp:96
The xtd::expressions namespace provides a lightweight, composable expression template framework for b...
Definition add_expression.hpp:14
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition abstract_object.hpp:8
The xtd::expressions::expression_stream is the streamable class for expression objects.
Definition expression_stream.hpp:23
Provides the base class from which the classes that represent expression tree nodes are derived....
Definition expression.hpp:107
The xtd::expressions::as_expression method convert a type as xtd::expressions::expression or xtd::exp...
Definition member_expression.hpp:76
constexpr member_expression()=default
Initialize a new xtd::expressions::member_expression object.
constexpr member_expression(expression_t expression, member_t member)
Initialize a new xtd::expressions::add_expression object with specified expression and member operand...
Definition member_expression.hpp:93
constexpr decltype(auto) operator()(auto &&... args) const
Add the specified arguments.
Definition member_expression.hpp:102
static constexpr operator_precedence precedence
The operator precedence. That contains one of xtd::expressions::operator_precedence values.
Definition member_expression.hpp:81
The xtd::expressions::member_type contains the member type.
Definition member_expression.hpp:26