xtensor
Toggle main menu visibility
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
19
namespace
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
xt::xfunction
Multidimensional function operating on xtensor expressions.
Definition
xfunction.hpp:208
xt::xvectorizer
Definition
xvectorize.hpp:28
xt
standard mathematical functions for xexpressions
Definition
xchunked_array.hpp:20
include
xtensor
core
xvectorize.hpp
Generated by
1.17.0