xtensor
 
Loading...
Searching...
No Matches
xvectorize.hpp
1/***************************************************************************
2 * Copyright (c) Johan Mabille, Sylvain Corlay and Wolf Vollprecht *
3 * Copyright (c) QuantStack *
4 * *
5 * Distributed under the terms of the BSD 3-Clause License. *
6 * *
7 * The full license is in the file LICENSE, distributed with this software. *
8 ****************************************************************************/
9
10#ifndef XTENSOR_VECTORIZE_HPP
11#define XTENSOR_VECTORIZE_HPP
12
13#include <type_traits>
14#include <utility>
15
16#include "../core/xfunction.hpp"
17#include "../utils/xutils.hpp"
18
19namespace xt
20{
21
22 /***************
23 * xvectorizer *
24 ***************/
25
26 template <class F, class R>
27 class xvectorizer
28 {
29 public:
30
31 template <class... E>
32 using xfunction_type = xfunction<F, xclosure_t<E>...>;
33
34 template <class Func, class = std::enable_if_t<!std::is_same<std::decay_t<Func>, xvectorizer>::value>>
35 xvectorizer(Func&& f);
36
37 template <class... E>
38 xfunction_type<E...> operator()(E&&... e) const;
39
40 private:
41
42 typename std::remove_reference<F>::type m_f;
43 };
44
45 namespace detail
46 {
47 template <class F>
48 using get_function_type = remove_class_t<decltype(&std::remove_reference_t<F>::operator())>;
49 }
50
51 template <class R, class... Args>
52 xvectorizer<R (*)(Args...), R> vectorize(R (*f)(Args...));
53
54 template <class F, class R, class... Args>
55 xvectorizer<F, R> vectorize(F&& f, R (*)(Args...));
56
57 template <class F>
58 auto vectorize(F&& f)
59 -> decltype(vectorize(std::forward<F>(f), std::declval<detail::get_function_type<F>*>()));
60
61 /******************************
62 * xvectorizer implementation *
63 ******************************/
64
65 template <class F, class R>
66 template <class Func, class>
67 inline xvectorizer<F, R>::xvectorizer(Func&& f)
68 : m_f(std::forward<Func>(f))
69 {
70 }
71
72 template <class F, class R>
73 template <class... E>
74 inline auto xvectorizer<F, R>::operator()(E&&... e) const -> xfunction_type<E...>
75 {
76 return xfunction_type<E...>(m_f, std::forward<E>(e)...);
77 }
78
79 template <class R, class... Args>
80 inline xvectorizer<R (*)(Args...), R> vectorize(R (*f)(Args...))
81 {
82 return xvectorizer<R (*)(Args...), R>(f);
83 }
84
85 template <class F, class R, class... Args>
86 inline xvectorizer<F, R> vectorize(F&& f, R (*)(Args...))
87 {
88 return xvectorizer<F, R>(std::forward<F>(f));
89 }
90
91 template <class F>
92 inline auto vectorize(F&& f)
93 -> decltype(vectorize(std::forward<F>(f), std::declval<detail::get_function_type<F>*>()))
94 {
95 return vectorize(std::forward<F>(f), static_cast<detail::get_function_type<F>*>(nullptr));
96 }
97}
98
99#endif
Multidimensional function operating on xtensor expressions.
standard mathematical functions for xexpressions