xtd 1.0.0
Loading...
Searching...
No Matches
compare_three_way.hpp
Go to the documentation of this file.
1
4#pragma once
5#include "as_expression.hpp"
9#include <utility>
10
12namespace xtd {
14 namespace expressions {
50 template<typename left_t, typename right_t>
51 struct compare_three_way : binary_expression {
53
58
60
63 constexpr compare_three_way() = default;
64
68 constexpr compare_three_way(left_t left, right_t right) : left {std::move(left)}, right {std::move(right)} {}
70
72
77 template<typename... args_t>
78 constexpr auto operator()(args_t&&... args) const {return left(std::forward<args_t>(args)...) <=> right(std::forward<args_t>(args)...);}
80
82 friend inline auto operator <<(std::ostream& os, const compare_three_way& e) -> std::ostream& {return os << expression_stream {e.left, e.precedence} << " <=> " << expression_stream {e.right, e.precedence};}
84
85 private:
86 [[no_unique_address]] left_t left;
87 [[no_unique_address]] right_t right;
88 };
89
91 template<typename left_t, typename right_t>
92 requires std::is_base_of_v<expression, std::decay_t<left_t>> || std::is_base_of_v<expression, std::decay_t<right_t>>
93 constexpr auto expression::compare_three_way(left_t left, right_t right) {
94 auto left_expression = as_expression(left);
95 auto right_expression = as_expression(right);
96 return expressions::compare_three_way<std::decay_t<decltype(left_expression)>, std::decay_t<decltype(right_expression)>> {std::move(left_expression), std::move(right_expression)};
97 }
98
99 template<typename left_t, typename right_t>
100 requires std::is_base_of_v<expression, std::decay_t<left_t>> || std::is_base_of_v<expression, std::decay_t<right_t>>
101 constexpr auto expression::spaceship(left_t left, right_t right) {return expression::compare_three_way(std::move(left), std::move(right));}
103
105
144 template<typename left_t, typename right_t>
146 constexpr auto operator <=>(left_t left, right_t right) {return expression::compare_three_way(std::move(left), std::move(right));}
148 }
149}
Contains xtd::expressions::as_expression methods.
Contains xtd::expressions::binary_expression struct.
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.
constexpr auto operator<<(left_t left, right_t right)
Subtract the specified left and right operands.
Definition left_shift.hpp:127
operator_precedence
Specifies the operator precedence.
Definition operator_precedence.hpp:22
constexpr auto operator<=>(left_t left, right_t right)
Equal to the specified left and right operands.
Definition compare_three_way.hpp:146
@ three_way_comparison
Represnets the three way comparison operator precedence (a <=> b).
Definition operator_precedence.hpp:92
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
@ e
The E key.
Definition console_key.hpp:96
The xtd::expressions namespace provides a lightweight, composable expression template framework for b...
Definition add.hpp:14
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition abstract_object.hpp:8
Generates a set of positional args that can be decomposed using structured bindings to build readable...
Definition args.hpp:42
The xtd::expressions::compare_three_way is the three_way_comparison expression.
Definition compare_three_way.hpp:51
constexpr compare_three_way(left_t left, right_t right)
Initialize a new xtd::expressions::compare_three_way object with specified left and right operands.
Definition compare_three_way.hpp:68
static constexpr operator_precedence precedence
The operator precedence. That contains one of xtd::expressions::operator_precedence values.
Definition compare_three_way.hpp:56
constexpr compare_three_way()=default
Initialize a new xtd::expressions::compare_three_way object.
constexpr auto operator()(args_t &&... args) const
Equal to the specified arguments.
Definition compare_three_way.hpp:78
The xtd::expressions::expression_stream is the streamable class for expression objects.
Definition expression_stream.hpp:23
static constexpr auto compare_three_way(left_t left, right_t right)
Compare three way the specified left and right operands.
static constexpr auto spaceship(left_t left, right_t right)
Compare three way the specified left and right operands.