Skip to content

Commit

Permalink
Merge stable_transform and unary<virtual_op>
Browse files Browse the repository at this point in the history
  • Loading branch information
wichtounet committed Apr 24, 2015
1 parent 8f6908f commit d660ca0
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 172 deletions.
1 change: 0 additions & 1 deletion include/etl/etl.hpp
Expand Up @@ -19,7 +19,6 @@
// The expressions
#include "binary_expr.hpp"
#include "unary_expr.hpp"
#include "stable_transform_expr.hpp"
#include "generator_expr.hpp"
#include "temporary_expr.hpp"

Expand Down
12 changes: 1 addition & 11 deletions include/etl/evaluator.hpp
Expand Up @@ -21,11 +21,6 @@ struct temporary_allocator_static_visitor {
(*this)(v.value());
}

template <typename T, typename Expr>
void operator()(etl::stable_transform_expr<T, Expr>& v) const {
(*this)(v.value());
}

template <typename T, typename LeftExpr, typename BinaryOp, typename RightExpr>
void operator()(etl::binary_expr<T, LeftExpr, BinaryOp, RightExpr>& v) const {
(*this)(v.lhs());
Expand Down Expand Up @@ -55,7 +50,7 @@ struct temporary_allocator_static_visitor {
void operator()(T& transformer) const {
(*this)(transformer.value());
}

template <typename Generator>
void operator()(const generator_expr<Generator>&) const {
//Leaf
Expand Down Expand Up @@ -85,11 +80,6 @@ struct evaluator_static_visitor {
(*this)(v.value());
}

template <typename T, typename Expr>
void operator()(etl::stable_transform_expr<T, Expr>& v) const {
(*this)(v.value());
}

template <typename T, typename LeftExpr, typename BinaryOp, typename RightExpr>
void operator()(etl::binary_expr<T, LeftExpr, BinaryOp, RightExpr>& v) const {
(*this)(v.lhs());
Expand Down
20 changes: 10 additions & 10 deletions include/etl/fast_expr.hpp
Expand Up @@ -50,10 +50,10 @@ template<typename E, typename OP>
using virtual_helper = unary_expr<E, OP, virtual_op>;

template<typename E, template<typename> class OP>
using stable_transform_helper = stable_transform_expr<value_t<E>, OP<build_type<E>>>;
using stable_transform_helper = unary_expr<value_t<E>, OP<build_type<E>>, virtual_op>;

template<typename LE, typename RE, template<typename,typename> class OP>
using stable_transform_binary_helper = stable_transform_expr<value_t<LE>, OP<build_type<LE>, build_type<RE>>>;
using stable_transform_binary_helper = unary_expr<value_t<LE>, OP<build_type<LE>, build_type<RE>>, virtual_op>;

template<typename A, typename B, template<typename> class OP>
using temporary_binary_helper = temporary_binary_expr<value_t<A>, build_type<A>, build_type<B>, OP<value_t<A>>, void>;
Expand Down Expand Up @@ -467,37 +467,37 @@ auto magic() -> virtual_helper<D, fast_magic_view<D, N>> {
//{{{ Apply a stable transformation

template<std::size_t D1, std::size_t... D, typename E, cpp_enable_if(is_etl_expr<E>::value)>
auto rep(E&& value) -> stable_transform_expr<value_t<E>, rep_r_transformer<build_type<E>, D1, D...>> {
auto rep(E&& value) -> unary_expr<value_t<E>, rep_r_transformer<build_type<E>, D1, D...>, virtual_op> {
static_assert(etl_traits<std::decay_t<E>>::dimensions() == 1, "Can only use rep on vector");
return {rep_r_transformer<build_type<E>, D1, D...>(value)};
}

template<std::size_t D1, std::size_t... D, typename E, cpp_enable_if(is_etl_expr<E>::value)>
auto rep_r(E&& value) -> stable_transform_expr<value_t<E>, rep_r_transformer<build_type<E>, D1, D...>> {
auto rep_r(E&& value) -> unary_expr<value_t<E>, rep_r_transformer<build_type<E>, D1, D...>, virtual_op> {
static_assert(etl_traits<std::decay_t<E>>::dimensions() == 1, "Can only use rep on vector");
return {rep_r_transformer<build_type<E>, D1, D...>(value)};
}

template<std::size_t D1, std::size_t... D, typename E, cpp_enable_if(is_etl_expr<E>::value)>
auto rep_l(E&& value) -> stable_transform_expr<value_t<E>, rep_l_transformer<build_type<E>, D1, D...>> {
auto rep_l(E&& value) -> unary_expr<value_t<E>, rep_l_transformer<build_type<E>, D1, D...>, virtual_op> {
static_assert(etl_traits<std::decay_t<E>>::dimensions() == 1, "Can only use rep on vector");
return {rep_l_transformer<build_type<E>, D1, D...>(value)};
}

template<typename... D, typename E, cpp_enable_if(is_etl_expr<E>::value && cpp::all_convertible_to<std::size_t, std::size_t, D...>::value)>
auto rep(E&& value, std::size_t d1, D... d) -> stable_transform_expr<value_t<E>, dyn_rep_r_transformer<build_type<E>, 1 + sizeof...(D)>> {
auto rep(E&& value, std::size_t d1, D... d) -> unary_expr<value_t<E>, dyn_rep_r_transformer<build_type<E>, 1 + sizeof...(D)>, virtual_op> {
static_assert(etl_traits<std::decay_t<E>>::dimensions() == 1, "Can only use rep on vector");
return {dyn_rep_r_transformer<build_type<E>, 1 + sizeof...(D)>(value, {{d1, static_cast<std::size_t>(d)...}})};
}

template<typename... D, typename E, cpp_enable_if(is_etl_expr<E>::value && cpp::all_convertible_to<std::size_t, std::size_t, D...>::value)>
auto rep_r(E&& value, std::size_t d1, D... d) -> stable_transform_expr<value_t<E>, dyn_rep_r_transformer<build_type<E>, 1 + sizeof...(D)>> {
auto rep_r(E&& value, std::size_t d1, D... d) -> unary_expr<value_t<E>, dyn_rep_r_transformer<build_type<E>, 1 + sizeof...(D)>, virtual_op> {
static_assert(etl_traits<std::decay_t<E>>::dimensions() == 1, "Can only use rep on vector");
return {dyn_rep_r_transformer<build_type<E>, 1 + sizeof...(D)>(value, {{d1, static_cast<std::size_t>(d)...}})};
}

template<typename... D, typename E, cpp_enable_if(is_etl_expr<E>::value && cpp::all_convertible_to<std::size_t, std::size_t, D...>::value)>
auto rep_l(E&& value, std::size_t d1, D... d) -> stable_transform_expr<value_t<E>, dyn_rep_l_transformer<build_type<E>, 1 + sizeof...(D)>> {
auto rep_l(E&& value, std::size_t d1, D... d) -> unary_expr<value_t<E>, dyn_rep_l_transformer<build_type<E>, 1 + sizeof...(D)>, virtual_op> {
static_assert(etl_traits<std::decay_t<E>>::dimensions() == 1, "Can only use rep on vector");
return {dyn_rep_l_transformer<build_type<E>, 1 + sizeof...(D)>(value, {{d1, static_cast<std::size_t>(d)...}})};
}
Expand Down Expand Up @@ -555,14 +555,14 @@ auto transpose(const E& value) -> stable_transform_helper<E, transpose_transform
}

template<std::size_t C1, std::size_t C2, typename E, cpp::enable_if_u<is_etl_expr<E>::value> = cpp::detail::dummy>
auto p_max_pool_h(E&& value) -> stable_transform_expr<value_t<E>, p_max_pool_h_transformer<build_type<E>, C1, C2>> {
auto p_max_pool_h(E&& value) -> unary_expr<value_t<E>, p_max_pool_h_transformer<build_type<E>, C1, C2>, virtual_op> {
static_assert(etl_traits<std::decay_t<E>>::dimensions() == 2 || etl_traits<std::decay_t<E>>::dimensions() == 3,
"Max pool is only implemented for 2D and 3D");
return {p_max_pool_h_transformer<build_type<E>, C1, C2>(value)};
}

template<std::size_t C1, std::size_t C2, typename E, cpp::enable_if_u<is_etl_expr<E>::value> = cpp::detail::dummy>
auto p_max_pool_p(E&& value) -> stable_transform_expr<value_t<E>, p_max_pool_p_transformer<build_type<E>, C1, C2>> {
auto p_max_pool_p(E&& value) -> unary_expr<value_t<E>, p_max_pool_p_transformer<build_type<E>, C1, C2>, virtual_op> {
static_assert(etl_traits<std::decay_t<E>>::dimensions() == 2 || etl_traits<std::decay_t<E>>::dimensions() == 3,
"Max pool is only implemented for 2D and 3D");
return {p_max_pool_p_transformer<build_type<E>, C1, C2>(value)};
Expand Down
109 changes: 0 additions & 109 deletions include/etl/stable_transform_expr.hpp

This file was deleted.

42 changes: 1 addition & 41 deletions include/etl/traits.hpp
Expand Up @@ -31,9 +31,6 @@ using is_binary_expr = cpp::is_specialization_of<etl::binary_expr, DT>;
template<typename T, typename DT = std::decay_t<T>>
using is_generator_expr = cpp::is_specialization_of<etl::generator_expr, DT>;

template<typename T, typename DT = std::decay_t<T>>
using is_stable_transform_expr = cpp::is_specialization_of<etl::stable_transform_expr, DT>;

template<typename T, typename DT = std::decay_t<T>>
using is_temporary_binary_expr = cpp::is_specialization_of<etl::temporary_binary_expr, DT>;

Expand Down Expand Up @@ -79,7 +76,6 @@ struct is_etl_expr : cpp::bool_constant_c<cpp::or_c<
is_unary_expr<T>,
is_binary_expr<T>,
is_temporary_binary_expr<T>,
is_stable_transform_expr<T>,
is_generator_expr<T>,
is_transformer<T>, is_view<T>,
is_transformer<T>, is_magic_view<T>
Expand All @@ -91,8 +87,7 @@ struct is_copy_expr : cpp::bool_constant_c<cpp::or_c<
is_dyn_matrix<T>,
is_unary_expr<T>,
is_binary_expr<T>,
is_temporary_binary_expr<T>,
is_stable_transform_expr<T>
is_temporary_binary_expr<T>
>> {};

template<typename T>
Expand Down Expand Up @@ -214,41 +209,6 @@ struct etl_traits<etl::unary_expr<T, Expr, UnaryOp>> {
}
};

/*!
* \brief Specialization (un)stable_transform_expr
*/
template <typename T>
struct etl_traits<T, std::enable_if_t<is_stable_transform_expr<T>::value>> {
using expr_t = std::decay_t<T>;
using sub_expr_t = std::decay_t<typename expr_t::expr_type>;

static constexpr const bool is_fast = etl_traits<sub_expr_t>::is_fast;
static constexpr const bool is_value = false;
static constexpr const bool is_generator = etl_traits<sub_expr_t>::is_generator;

static std::size_t size(const expr_t& v){
return etl_traits<sub_expr_t>::size(v.value());
}

static std::size_t dim(const expr_t& v, std::size_t d){
return etl_traits<sub_expr_t>::dim(v.value(), d);
}

template<bool B = is_fast, cpp::enable_if_u<B> = cpp::detail::dummy>
static constexpr std::size_t size(){
return etl_traits<sub_expr_t>::size();
}

template<std::size_t D>
static constexpr std::size_t dim(){
return etl_traits<sub_expr_t>::template dim<D>();
}

static constexpr std::size_t dimensions(){
return etl_traits<sub_expr_t>::dimensions();
}
};

/*!
* \brief Specialization generator_expr
*/
Expand Down

0 comments on commit d660ca0

Please sign in to comment.