ndarray
NumPy-friendly multidimensional arrays in C++
Loading...
Searching...
No Matches
vectorize.h
Go to the documentation of this file.
1// -*- c++ -*-
2/*
3 * Copyright (c) 2010-2012, Jim Bosch
4 * All rights reserved.
5 *
6 * ndarray is distributed under a simple BSD-like license;
7 * see the LICENSE file that should be present in the root
8 * of the source distribution, or alternately available at:
9 * https://github.com/ndarray/ndarray
10 */
11#ifndef NDARRAY_vectorize_h_INCLUDED
12#define NDARRAY_vectorize_h_INCLUDED
13
18#include "ndarray_fwd.h"
20
21#include <boost/mpl/and.hpp>
22#include <boost/utility/enable_if.hpp>
23
24namespace ndarray {
25namespace result_of {
26
27template <typename T1, typename T2, typename T3=void>
28struct vectorize {
29 typedef T1 BinaryFunction;
30 typedef T2 Argument1;
31 typedef T3 Argument2;
32
33 typename boost::mpl::if_<
34 boost::mpl::and_<
35 typename ExpressionTraits<Argument1>::IsScalar,
36 typename ExpressionTraits<Argument2>::IsScalar
37 >,
38 typename BinaryFunction::result_type,
40 >::type type;
41
42};
43
44template <typename T1, typename T2>
45struct vectorize<T1,T2,void> {
46 typedef T1 UnaryFunction;
47 typedef T2 Argument;
48
49 typedef typename boost::mpl::if_<
50 typename ExpressionTraits<Argument>::IsScalar,
51 typename UnaryFunction::result_type,
53 >::type type;
54};
55
56} // namespace result_of
57
60
66template <typename Scalar, typename UnaryFunction>
67#ifndef DOXYGEN
68typename boost::enable_if<typename ExpressionTraits<Scalar>::IsScalar,
69 typename UnaryFunction::result_type>::type
70#else
71typename UnaryFunction::result_type
72#endif
74 UnaryFunction const & functor,
75 Scalar const & scalar
76) {
77 return functor(scalar);
78}
79
85template <typename Derived, typename UnaryFunction>
86detail::UnaryOpExpression<Derived,UnaryFunction>
88 UnaryFunction const & functor,
89 ExpressionBase<Derived> const & operand
90) {
92 static_cast<Derived const &>(operand),
93 functor
94 );
95}
96
102template <typename Scalar1, typename Scalar2, typename BinaryFunction>
103#ifndef DOXYGEN
104typename boost::enable_if_c<
105 (ExpressionTraits<Scalar1>::IsScalar::value
106 && ExpressionTraits<Scalar2>::IsScalar::value),
107 typename BinaryFunction::result_type
108 >::type
109#else
110typename BinaryFunction::result_type
111#endif
113 BinaryFunction const & functor,
114 Scalar1 const & scalar1,
115 Scalar2 const & scalar2
116) {
117 return functor(scalar1,scalar2);
118}
119
126template <typename Derived1, typename Derived2, typename BinaryFunction>
127detail::BinaryOpExpression<Derived1,Derived2,BinaryFunction>
129 BinaryFunction const & functor,
130 ExpressionBase<Derived1> const & operand1,
131 ExpressionBase<Derived2> const & operand2
132) {
134 static_cast<Derived1 const &>(operand1),
135 static_cast<Derived2 const &>(operand2),
136 functor
137 );
138}
139
141
142} // namespace ndarray
143
144#endif // !NDARRAY_vectorize_h_INCLUDED
Lazy unary expression templates.
CRTP base class for all multidimensional expressions.
Definition ExpressionBase.h:40
Definition BinaryOp.h:91
Definition UnaryOp.h:74
boost::enable_if< typenameExpressionTraits< Scalar >::IsScalar, typenameUnaryFunction::result_type >::type vectorize(UnaryFunction const &functor, Scalar const &scalar)
Apply a non-mutating unary function object to a scalar.
Definition vectorize.h:73
Forward declarations and default template parameters for ndarray.
Definition vectorize.h:28