10#ifndef XTENSOR_OPTIONAL_HPP 
   11#define XTENSOR_OPTIONAL_HPP 
   16#include <xtl/xoptional.hpp> 
   17#include <xtl/xoptional_sequence.hpp> 
   19#include "../containers/xarray.hpp" 
   20#include "../containers/xscalar.hpp" 
   21#include "../containers/xtensor.hpp" 
   22#include "../generators/xgenerator.hpp" 
   23#include "../reducers/xreducer.hpp" 
   24#include "../views/xbroadcast.hpp" 
   25#include "../views/xdynamic_view.hpp" 
   26#include "../views/xfunctor_view.hpp" 
   27#include "../views/xindex_view.hpp" 
   28#include "../views/xrepeat.hpp" 
   29#include "../views/xstrided_view.hpp" 
   30#include "../views/xview.hpp" 
   46        template <
class T, 
class B>
 
   65            D& derived_cast() 
noexcept;
 
   66            const D& derived_cast() 
const noexcept;
 
 
   76        template <
class T, 
class Tag>
 
   77        struct split_optional_expression_impl
 
   79            using value_expression = T;
 
   80            using flag_expression = 
decltype(
ones<bool>(std::declval<T>().shape()));
 
   83            inline static U&& value(U&& 
arg)
 
   85                return std::forward<U>(
arg);
 
   89            inline static flag_expression has_value(U&& 
arg)
 
   95        template <
class T, 
class Tag>
 
   96        struct split_optional_expression_impl<xscalar<T>, Tag>
 
   98            using value_expression = xscalar<T>;
 
   99            using flag_expression = xscalar<bool>;
 
  102            inline static U&& value(U&& 
arg)
 
  104                return std::forward<U>(
arg);
 
  108            inline static flag_expression has_value(U&&)
 
  110                return xscalar<bool>(
true);
 
  115        struct split_optional_expression_impl_base
 
  117            static constexpr bool is_const = std::is_const<std::remove_reference_t<T>>::value;
 
  118            using decay_type = std::decay_t<T>;
 
  120            using value_expression = std::conditional_t<
 
  122                typename decay_type::const_value_expression,
 
  123                typename decay_type::value_expression>;
 
  124            using flag_expression = std::
 
  125                conditional_t<is_const, typename decay_type::const_flag_expression, typename decay_type::flag_expression>;
 
  128            inline static value_expression value(U&& 
arg)
 
  134            inline static flag_expression has_value(U&& 
arg)
 
  136                return arg.has_value();
 
  141        struct split_optional_expression_impl<T, xoptional_expression_tag>
 
  142            : split_optional_expression_impl_base<T>
 
  147        struct split_optional_expression_impl<xscalar<T>, xoptional_expression_tag>
 
  148            : split_optional_expression_impl_base<xscalar<T>>
 
  153        struct split_optional_expression
 
  154            : split_optional_expression_impl<T, xexpression_tag_t<std::decay_t<T>>>
 
  159        using value_expression_t = 
typename split_optional_expression<T>::value_expression;
 
  162        using flag_expression_t = 
typename split_optional_expression<T>::flag_expression;
 
  168        template <
class T = 
bool>
 
  169        class optional_bitwise
 
  173            using return_type = T;
 
  174            using first_argument_type = T;
 
  175            using second_argument_type = T;
 
  176            using result_type = T;
 
  177            using simd_value_type = bool;
 
  178            using simd_result_type = bool;
 
  180            template <
class... Args>
 
  181            constexpr result_type operator()(
const Args&... args)
 const 
  183                return apply_impl(args...);
 
  186            template <
class B, 
class... Args>
 
  187            constexpr B simd_apply(
const B& b, 
const Args&... args)
 const 
  189                return simd_apply_impl(b, args...);
 
  194            constexpr result_type apply_impl()
 const 
  199            template <
class U, 
class... Args>
 
  200            constexpr result_type apply_impl(
const U& t, 
const Args&... args)
 const 
  202                return t & apply_impl(args...);
 
  206            constexpr B simd_apply_impl(
const B& b)
 const 
  211            template <
class B1, 
class B2, 
class... Args>
 
  212            constexpr B1 simd_apply_impl(
const B1& b1, 
const B2& b2, 
const Args&... args)
 const 
  214                return b1 & simd_apply_impl(b2, args...);
 
  222        template <
class T, 
class B>
 
  223        struct const_value_rebinder<xtl::xoptional<T, B>, T>
 
  225            static const_value<T> run(
const const_value<xtl::xoptional<T, B>>& src)
 
  227                return const_value<T>(src.m_value.value());
 
  235        template <
class T, 
class B>
 
  236        struct xreducer_size_type<xtl::xoptional<T, B>>
 
  238            using type = xtl::xoptional<std::size_t, bool>;
 
  241        template <
class T, 
class B>
 
  242        struct xreducer_temporary_type<xtl::xoptional<T, B>>
 
  244            using type = xtl::xoptional<std::decay_t<T>, 
bool>;
 
  253    template <
class T, 
class B>
 
  254    auto sign(
const xtl::xoptional<T, B>& e);
 
  267        template <
class E1, 
class E2>
 
 
  280            using closure_type = CT;
 
  281            static constexpr bool is_ref = std::is_reference<closure_type>::value;
 
  282            using unref_closure_type = std::remove_reference_t<closure_type>;
 
  283            static constexpr bool is_const = std::is_const<unref_closure_type>::value;
 
  284            using raw_closure_type = std::decay_t<CT>;
 
  286            using raw_value_closure = 
typename raw_closure_type::value_closure;
 
  287            using raw_flag_closure = 
typename raw_closure_type::flag_closure;
 
  288            using const_raw_value_closure = std::add_const_t<raw_value_closure>;
 
  289            using const_raw_flag_closure = std::add_const_t<raw_flag_closure>;
 
  291            using value_closure = std::conditional_t<is_ref, std::add_lvalue_reference_t<raw_value_closure>, raw_value_closure>;
 
  292            using flag_closure = std::conditional_t<is_ref, std::add_lvalue_reference_t<raw_flag_closure>, raw_flag_closure>;
 
  293            using const_value_closure = std::
 
  294                conditional_t<is_ref, std::add_lvalue_reference_t<const_raw_value_closure>, raw_value_closure>;
 
  295            using const_flag_closure = std::
 
  296                conditional_t<is_ref, std::add_lvalue_reference_t<const_raw_flag_closure>, raw_flag_closure>;
 
 
  310            using value_expression = 
typename traits::value_expression;
 
  311            using flag_expression = 
typename traits::flag_expression;
 
  312            using const_value_expression = 
typename traits::const_value_expression;
 
  313            using const_flag_expression = 
typename traits::const_flag_expression;
 
  316            value_expression value();
 
  317            const_value_expression value() 
const;
 
  319            flag_expression has_value();
 
  320            const_flag_expression has_value() 
const;
 
 
  342            using value_expression = 
typename traits::value_expression;
 
  343            using flag_expression = 
typename traits::flag_expression;
 
  344            using const_value_expression = 
typename traits::const_value_expression;
 
  345            using const_flag_expression = 
typename traits::const_flag_expression;
 
  348            value_expression value();
 
  349            const_value_expression value() 
const;
 
  351            flag_expression has_value();
 
  352            const_flag_expression has_value() 
const;
 
 
  362        template <
class EC, layout_type L, 
class SC>
 
  365            using value_container = 
typename std::remove_reference_t<EC>::base_container_type;
 
  366            using flag_container = 
typename std::remove_reference_t<EC>::flag_container_type;
 
 
  373        template <
class EC, layout_type L, 
class SC>
 
  379        template <
class EC, layout_type L, 
class SC>
 
  393        template <
class EC, layout_type L, 
class SC>
 
  399        template <
class EC, layout_type L, 
class SC>
 
  413        template <
class EC, std::
size_t N, layout_type L>
 
  416            using value_container = 
typename std::remove_reference_t<EC>::base_container_type;
 
  417            using flag_container = 
typename std::remove_reference_t<EC>::flag_container_type;
 
 
  424        template <
class EC, std::
size_t N, layout_type L>
 
  430        template <
class EC, std::
size_t N, layout_type L>
 
  444        template <
class EC, std::
size_t N, layout_type L>
 
  450        template <
class EC, std::
size_t N, layout_type L>
 
  464        template <
class EC, std::
size_t N, layout_type L>
 
  470        template <
class EC, std::
size_t N, layout_type L>
 
  484        template <
class F, 
class... CT>
 
  490            using value_functor = F;
 
  491            using flag_functor = xt::detail::optional_bitwise<bool>;
 
  495            using const_value_expression = value_expression;
 
  496            using const_flag_expression = flag_expression;
 
  498            const_value_expression value() 
const;
 
  499            const_flag_expression has_value() 
const;
 
  503            template <std::size_t... I>
 
  504            const_value_expression value_impl(std::index_sequence<I...>) 
const;
 
  506            template <std::size_t... I>
 
  507            const_flag_expression has_value_impl(std::index_sequence<I...>) 
const;
 
 
  510        template <
class F, 
class... CT>
 
  523        template <
class CT, 
class S, layout_type L, 
class FST>
 
  529            using uvt = 
typename std::decay_t<CT>::value_expression;
 
  530            using uft = 
typename std::decay_t<CT>::flag_expression;
 
  531            using ucvt = 
typename std::decay_t<CT>::const_value_expression;
 
  532            using ucft = 
typename std::decay_t<CT>::const_flag_expression;
 
  538            value_expression value();
 
  539            const_value_expression value() 
const;
 
  541            flag_expression has_value();
 
  542            const_flag_expression has_value() 
const;
 
 
  545        template <
class CT, 
class S, layout_type L, 
class FST>
 
  558        template <
class CT, 
class X>
 
  566            using const_value_expression = value_expression;
 
  567            using const_flag_expression = flag_expression;
 
  569            const_value_expression value() 
const;
 
  570            const_flag_expression has_value() 
const;
 
 
  573        template <
class CT, 
class X>
 
  586        template <
class F, 
class CT>
 
  592            using uvt = 
typename std::decay_t<CT>::value_expression;
 
  593            using uft = 
typename std::decay_t<CT>::flag_expression;
 
  594            using ucvt = 
typename std::decay_t<CT>::const_value_expression;
 
  595            using ucft = 
typename std::decay_t<CT>::const_flag_expression;
 
  597            using flag_expression = uft;
 
  599            using const_flag_expression = ucft;
 
  601            value_expression value();
 
  602            const_value_expression value() 
const;
 
  604            flag_expression has_value();
 
  605            const_flag_expression has_value() 
const;
 
 
  608        template <
class F, 
class CT>
 
  621        template <
class CT, 
class I>
 
  627            using uvt = 
typename std::decay_t<CT>::value_expression;
 
  628            using ucvt = 
typename std::decay_t<CT>::const_value_expression;
 
  629            using uft = 
typename std::decay_t<CT>::flag_expression;
 
  630            using ucft = 
typename std::decay_t<CT>::const_flag_expression;
 
  636            value_expression value();
 
  637            const_value_expression value() 
const;
 
  639            flag_expression has_value();
 
  640            const_flag_expression has_value() 
const;
 
 
  643        template <
class CT, 
class I>
 
  656        template <
class F, 
class CT, 
class X, 
class O>
 
  662            using result_type = 
typename F::init_value_type;
 
  664            using rebound_result_type = 
typename result_type::value_type;
 
  665            using rebound_functors_type = 
typename F::template rebind_t<rebound_result_type>;
 
  666            using rebound_reduce_options_values = 
typename O::template rebind_t<rebound_result_type>;
 
  667            using rebound_reduce_options_flag = 
typename O::template rebind_t<bool>;
 
  673            using const_value_expression = value_expression;
 
  674            using const_flag_expression = flag_expression;
 
  676            const_value_expression value() 
const;
 
  677            const_flag_expression has_value() 
const;
 
 
  680        template <
class F, 
class CT, 
class X, 
class O>
 
  693        template <
class CT, 
class X>
 
  701            using const_value_expression = value_expression;
 
  702            using const_flag_expression = flag_expression;
 
  704            const_value_expression value() 
const;
 
  705            const_flag_expression has_value() 
const;
 
 
  708        template <
class CT, 
class X>
 
  721        template <
class CT, 
class S, layout_type L, 
class FST>
 
  727            using uvt = 
typename std::decay_t<CT>::value_expression;
 
  728            using uft = 
typename std::decay_t<CT>::flag_expression;
 
  729            using ucvt = 
typename std::decay_t<CT>::const_value_expression;
 
  730            using ucft = 
typename std::decay_t<CT>::const_flag_expression;
 
  736            value_expression value();
 
  737            const_value_expression value() 
const;
 
  739            flag_expression has_value();
 
  740            const_flag_expression has_value() 
const;
 
 
  743        template <
class CT, 
class S, layout_type L, 
class FST>
 
  756        template <
class CT, 
class... S>
 
  762            using uvt = 
typename std::decay_t<CT>::value_expression;
 
  763            using uft = 
typename std::decay_t<CT>::flag_expression;
 
  764            using ucvt = 
typename std::decay_t<CT>::const_value_expression;
 
  765            using ucft = 
typename std::decay_t<CT>::const_flag_expression;
 
  766            using value_expression = 
xview<uvt, S...>;
 
  767            using flag_expression = 
xview<uft, S...>;
 
  768            using const_value_expression = 
xview<ucvt, S...>;
 
  769            using const_flag_expression = 
xview<ucft, S...>;
 
  771            value_expression value();
 
  772            const_value_expression value() 
const;
 
  774            flag_expression has_value();
 
  775            const_flag_expression has_value() 
const;
 
 
  778        template <
class CT, 
class... S>
 
  793            template <
class F, 
class = 
void_t<
int>>
 
  798                static type get(
const F& f)
 
  805            struct value_functor<F, void_t<typename F::value_functor_type>>
 
  807                using type = 
typename F::value_functor_type;
 
  809                static type get(
const F& f)
 
  811                    return f.value_functor();
 
  816            using value_functor_t = 
typename value_functor<F>::type;
 
  820                template <
class... T>
 
  821                bool operator()(T...)
 const 
  827            template <
class F, 
class = 
void_t<
int>>
 
  830                using type = always_true;
 
  832                static type get(
const F&)
 
  839            struct flag_functor<F, void_t<typename F::flag_functor_type>>
 
  841                using type = 
typename F::flag_functor_type;
 
  843                static type get(
const F& f)
 
  845                    return f.flag_functor();
 
  850            using flag_functor_t = 
typename flag_functor<F>::type;
 
  853        template <
class F, 
class R, 
class S>
 
  859            using value_closure = 
typename R::value_closure;
 
  860            using flag_closure = 
typename R::flag_closure;
 
  861            using value_functor = detail::value_functor_t<F>;
 
  862            using flag_functor = detail::flag_functor_t<F>;
 
  865            using const_value_expression = value_expression;
 
  866            using const_flag_expression = flag_expression;
 
  868            const_value_expression value() 
const;
 
  869            const_flag_expression has_value() 
const;
 
 
  872        template <
class F, 
class R, 
class S>
 
  886        inline D& xoptional_empty_base<D>::derived_cast() noexcept
 
  888            return *
static_cast<D*
>(
this);
 
  892        inline const D& xoptional_empty_base<D>::derived_cast() const noexcept
 
  894            return *
static_cast<const D*
>(
this);
 
  905        inline auto xscalar_optional_base<CT>::value() -> value_expression
 
  907            return this->derived_cast().expression().value();
 
  911        inline auto xscalar_optional_base<CT>::value() const -> const_value_expression
 
  913            return this->derived_cast().expression().value();
 
  917        inline auto xscalar_optional_base<CT>::has_value() -> flag_expression
 
  919            return this->derived_cast().expression().has_value();
 
  923        inline auto xscalar_optional_base<CT>::has_value() const -> const_flag_expression
 
  925            return this->derived_cast().expression().has_value();
 
  936        inline auto xcontainer_optional_base<T>::value() -> value_expression
 
  938            return value_expression(this->derived_cast().storage().value(), this->derived_cast().shape());
 
  942        inline auto xcontainer_optional_base<T>::value() const -> const_value_expression
 
  944            return const_value_expression(this->derived_cast().storage().value(), this->derived_cast().shape());
 
  948        inline auto xcontainer_optional_base<T>::has_value() -> flag_expression
 
  950            return flag_expression(this->derived_cast().storage().has_value(), this->derived_cast().shape());
 
  954        inline auto xcontainer_optional_base<T>::has_value() const -> const_flag_expression
 
  956            return const_flag_expression(this->derived_cast().storage().has_value(), this->derived_cast().shape());
 
  966        template <
class F, 
class... CT>
 
  967        inline auto xfunction_optional_base<F, CT...>::value() const -> const_value_expression
 
  969            return value_impl(std::make_index_sequence<
sizeof...(CT)>());
 
  972        template <
class F, 
class... CT>
 
  973        inline auto xfunction_optional_base<F, CT...>::has_value() const -> const_flag_expression
 
  975            return has_value_impl(std::make_index_sequence<
sizeof...(CT)>());
 
  978        template <
class F, 
class... CT>
 
  979        template <std::size_t... I>
 
  980        inline auto xfunction_optional_base<F, CT...>::value_impl(std::index_sequence<I...>) 
const 
  981            -> const_value_expression
 
  983            return value_expression(
 
  985                xt::detail::split_optional_expression<CT>::value(std::get<I>(this->derived_cast().arguments()))...
 
  989        template <
class F, 
class... CT>
 
  990        template <std::size_t... I>
 
  991        inline auto xfunction_optional_base<F, CT...>::has_value_impl(std::index_sequence<I...>) 
const 
  992            -> const_flag_expression
 
  994            return flag_expression(
 
  996                xt::detail::split_optional_expression<CT>::has_value(
 
  997                    std::get<I>(this->derived_cast().arguments())
 
 1009        template <
class CT, 
class S, layout_type L, 
class FST>
 
 1010        inline auto xdynamic_view_optional<CT, S, L, FST>::value() -> value_expression
 
 1012            return this->derived_cast().build_view(this->derived_cast().expression().value());
 
 1015        template <
class CT, 
class S, layout_type L, 
class FST>
 
 1016        inline auto xdynamic_view_optional<CT, S, L, FST>::value() const -> const_value_expression
 
 1018            return this->derived_cast().build_view(this->derived_cast().expression().value());
 
 1021        template <
class CT, 
class S, layout_type L, 
class FST>
 
 1022        inline auto xdynamic_view_optional<CT, S, L, FST>::has_value() -> flag_expression
 
 1024            return this->derived_cast().build_view(this->derived_cast().expression().has_value());
 
 1027        template <
class CT, 
class S, layout_type L, 
class FST>
 
 1028        inline auto xdynamic_view_optional<CT, S, L, FST>::has_value() const -> const_flag_expression
 
 1030            return this->derived_cast().build_view(this->derived_cast().expression().has_value());
 
 1040        template <
class CT, 
class X>
 
 1041        inline auto xbroadcast_optional<CT, X>::value() const -> const_value_expression
 
 1043            return this->derived_cast().build_broadcast(this->derived_cast().expression().value());
 
 1046        template <
class CT, 
class X>
 
 1047        inline auto xbroadcast_optional<CT, X>::has_value() const -> const_flag_expression
 
 1049            return this->derived_cast().build_broadcast(this->derived_cast().expression().has_value());
 
 1059        template <
class F, 
class CT>
 
 1060        inline auto xfunctor_view_optional<F, CT>::value() -> value_expression
 
 1062            return this->derived_cast().build_functor_view(this->derived_cast().expression().value());
 
 1065        template <
class F, 
class CT>
 
 1066        inline auto xfunctor_view_optional<F, CT>::value() const -> const_value_expression
 
 1068            return this->derived_cast().build_functor_view(this->derived_cast().expression().value());
 
 1071        template <
class F, 
class CT>
 
 1072        inline auto xfunctor_view_optional<F, CT>::has_value() -> flag_expression
 
 1074            return this->derived_cast().expression().has_value();
 
 1077        template <
class F, 
class CT>
 
 1078        inline auto xfunctor_view_optional<F, CT>::has_value() const -> const_flag_expression
 
 1080            return this->derived_cast().expression().has_value();
 
 1090        template <
class CT, 
class I>
 
 1091        inline auto xindex_view_optional<CT, I>::value() -> value_expression
 
 1093            return this->derived_cast().build_index_view(this->derived_cast().expression().value());
 
 1096        template <
class CT, 
class I>
 
 1097        inline auto xindex_view_optional<CT, I>::value() const -> const_value_expression
 
 1099            return this->derived_cast().build_index_view(this->derived_cast().expression().value());
 
 1102        template <
class CT, 
class I>
 
 1103        inline auto xindex_view_optional<CT, I>::has_value() -> flag_expression
 
 1105            return this->derived_cast().build_index_view(this->derived_cast().expression().has_value());
 
 1108        template <
class CT, 
class I>
 
 1109        inline auto xindex_view_optional<CT, I>::has_value() const -> const_flag_expression
 
 1111            return this->derived_cast().build_index_view(this->derived_cast().expression().has_value());
 
 1121        template <
class F, 
class CT, 
class X, 
class O>
 
 1122        inline auto xreducer_optional<F, CT, X, O>::value() const -> const_value_expression
 
 1124            auto func = this->derived_cast().functors();
 
 1125            auto opts = this->derived_cast().options().template rebind<rebound_result_type>(
 
 1126                this->derived_cast().options().initial_value.value(),
 
 1127                this->derived_cast().options()
 
 1130            return this->derived_cast().build_reducer(
 
 1131                this->derived_cast().expression().value(),
 
 1132                func.template rebind<rebound_result_type>(),
 
 1137        template <
class F, 
class CT, 
class X, 
class O>
 
 1138        inline auto xreducer_optional<F, CT, X, O>::has_value() const -> const_flag_expression
 
 1140            auto opts = this->derived_cast().options().rebind(
 
 1141                this->derived_cast().options().initial_value.has_value(),
 
 1142                this->derived_cast().options()
 
 1145            return this->derived_cast().build_reducer(
 
 1146                this->derived_cast().expression().has_value(),
 
 1147                make_xreducer_functor(xt::detail::optional_bitwise<bool>(), xt::const_value<bool>(
true)),
 
 1159        template <
class CT, 
class S, layout_type L, 
class FST>
 
 1160        inline auto xstrided_view_optional<CT, S, L, FST>::value() -> value_expression
 
 1162            return this->derived_cast().build_view(this->derived_cast().expression().value());
 
 1165        template <
class CT, 
class S, layout_type L, 
class FST>
 
 1166        inline auto xstrided_view_optional<CT, S, L, FST>::value() const -> const_value_expression
 
 1168            return this->derived_cast().build_view(this->derived_cast().expression().value());
 
 1171        template <
class CT, 
class S, layout_type L, 
class FST>
 
 1172        inline auto xstrided_view_optional<CT, S, L, FST>::has_value() -> flag_expression
 
 1174            return this->derived_cast().build_view(this->derived_cast().expression().has_value());
 
 1177        template <
class CT, 
class S, layout_type L, 
class FST>
 
 1178        inline auto xstrided_view_optional<CT, S, L, FST>::has_value() const -> const_flag_expression
 
 1180            return this->derived_cast().build_view(this->derived_cast().expression().has_value());
 
 1190        template <
class CT, 
class... S>
 
 1191        inline auto xview_optional<CT, S...>::value() -> value_expression
 
 1193            return this->derived_cast().build_view(this->derived_cast().expression().value());
 
 1196        template <
class CT, 
class... S>
 
 1197        inline auto xview_optional<CT, S...>::value() const -> const_value_expression
 
 1199            return this->derived_cast().build_view(this->derived_cast().expression().value());
 
 1202        template <
class CT, 
class... S>
 
 1203        inline auto xview_optional<CT, S...>::has_value() -> flag_expression
 
 1205            return this->derived_cast().build_view(this->derived_cast().expression().has_value());
 
 1208        template <
class CT, 
class... S>
 
 1209        inline auto xview_optional<CT, S...>::has_value() const -> const_flag_expression
 
 1211            return this->derived_cast().build_view(this->derived_cast().expression().has_value());
 
 1221        template <
class F, 
class R, 
class S>
 
 1222        inline auto xgenerator_optional<F, R, S>::value() const -> const_value_expression
 
 1224            return this->derived_cast().template build_generator<value_closure>(
 
 1225                detail::value_functor<F>::get(this->derived_cast().functor())
 
 1229        template <
class F, 
class R, 
class S>
 
 1230        inline auto xgenerator_optional<F, R, S>::has_value() const -> const_flag_expression
 
 1232            return this->derived_cast().template build_generator<flag_closure>(
 
 1233                detail::flag_functor<F>::get(this->derived_cast().functor())
 
 1244        template <
class T, 
class B>
 
 1247            static constexpr auto run(
const xtl::xoptional<T, B>& x)
 
 
 1254    template <
class T, 
class B>
 
 1255    inline auto sign(
const xtl::xoptional<T, B>& e)
 
 1257        using value_type = std::decay_t<T>;
 
 1258        return e.has_value() ? math::sign_impl<value_type>::run(e.value()) : xtl::missing<value_type>();
 
 1265    template <
class E, XTL_REQUIRES(is_xexpression<E>)>
 
 1266    inline auto value(E&& e) -> detail::value_expression_t<E>
 
 1268        return detail::split_optional_expression<E>::value(std::forward<E>(e));
 
 1271    template <
class E, XTL_REQUIRES(is_xexpression<E>)>
 
 1272    inline auto has_value(E&& e) -> detail::flag_expression_t<E>
 
 1274        return detail::split_optional_expression<E>::has_value(std::forward<E>(e));
 
 1279        template <
class T1, 
class T2>
 
 1280        struct assign_data_impl
 
 1282            template <
class E1, 
class E2>
 
 1283            static void run(xexpression<E1>& e1, 
const xexpression<E2>& e2, 
bool trivial)
 
 1285                E1& de1 = e1.derived_cast();
 
 1286                const E2& de2 = e2.derived_cast();
 
 1288                decltype(
auto) bde1 = xt::value(de1);
 
 1289                decltype(
auto) hde1 = xt::has_value(de1);
 
 1290                xexpression_assigner_base<xtensor_expression_tag>::assign_data(bde1, xt::value(de2), trivial);
 
 1291                xexpression_assigner_base<xtensor_expression_tag>::assign_data(hde1, xt::has_value(de2), trivial);
 
 1296        struct xarray_assigner
 
 1298            template <
class E1, 
class E2>
 
 1299            static void assign(xexpression<E1>& e1, 
const xexpression<E2>& e2, 
bool trivial)
 
 1301                E1& de1 = e1.derived_cast();
 
 1302                const E2& de2 = e2.derived_cast();
 
 1305                decltype(
auto) bde1 = xt::value(de1);
 
 1306                decltype(
auto) hde1 = xt::has_value(de1);
 
 1307                xexpression_assigner_base<xtensor_expression_tag>::assign_data(bde1, e2, trivial);
 
 1308                xexpression_assigner_base<xtensor_expression_tag>::assign_data(hde1, mask, trivial);
 
 1313        struct xarray_assigner<xtl::xoptional<T>>
 
 1315            template <
class E1, 
class E2>
 
 1316            static void assign(xexpression<E1>& e1, 
const xexpression<E2>& e2, 
bool trivial)
 
 1318                xexpression_assigner_base<xtensor_expression_tag>::assign_data(e1, e2, trivial);
 
 1323        struct assign_data_impl<xoptional_expression_tag, xtensor_expression_tag>
 
 1325            template <
class E1, 
class E2>
 
 1326            static void run(xexpression<E1>& e1, 
const xexpression<E2>& e2, 
bool trivial)
 
 1328                xarray_assigner<typename E2::value_type>::assign(e1, e2, trivial);
 
 1333        struct assign_data_impl<xtensor_expression_tag, xoptional_expression_tag>
 
 1335            template <
class E1, 
class E2>
 
 1336            static void run(xexpression<E1>& e1, 
const xexpression<E2>& e2, 
bool trivial)
 
 1338                xexpression_assigner_base<xtensor_expression_tag>::assign_data(e1, e2, trivial);
 
 1343    template <
class E1, 
class E2>
 
 1350        detail::assign_data_impl<typename E1::expression_tag, typename E2::expression_tag>::run(e1, e2, trivial);
 
Dense multidimensional container adaptor with tensor semantic.
Dense multidimensional container with tensor semantic.
Broadcasted xexpression to a specified shape.
Base class for xexpressions.
Multidimensional function operating on xtensor expressions.
Multidimensional function operating on indices.
View of an xexpression from vector of indices.
Reducing function operating over specified axes.
View of an xexpression using strides.
Dense multidimensional container adaptor with tensor semantics and fixed dimension.
Dense multidimensional container with tensor semantic and fixed dimension.
Dense multidimensional container adaptor with view semantics and fixed dimension.
Multidimensional view with tensor semantic.
auto sign(E &&e) noexcept -> detail::xfunction_type_t< math::sign_fun, E >
Returns an element-wise indication of the sign of a number.
auto arg(E &&e) noexcept
Calculates the phase angle (in radians) elementwise for the complex numbers in e.
standard mathematical functions for xexpressions
xarray_container< uvector< T, A >, L, xt::svector< typename uvector< T, A >::size_type, 4, SA, true > > xarray
Alias template on xarray_container with default parameters for data container type and shape / stride...
auto ones(S shape) noexcept
Returns an xexpression containing ones of the specified shape.
auto full_like(const xexpression< E > &e, typename E::value_type fill_value)
Create a xcontainer (xarray, xtensor or xtensor_fixed), filled with fill_value and of the same shape,...