115 lines
5.2 KiB
C++
115 lines
5.2 KiB
C++
// This file is part of Eigen, a lightweight C++ template library
|
|
// for linear algebra.
|
|
//
|
|
// Mehdi Goli Codeplay Software Ltd.
|
|
// Ralph Potter Codeplay Software Ltd.
|
|
// Luke Iwanski Codeplay Software Ltd.
|
|
// Contact: <eigen@codeplay.com>
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla
|
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
// with this file, You can obtain one at the mozilla.org home page
|
|
|
|
/*****************************************************************
|
|
* TensorSyclLeafCount.h
|
|
*
|
|
* \brief:
|
|
* The leaf count used the pre-order expression tree traverse in order to name
|
|
* count the number of leaf nodes in the expression
|
|
*
|
|
*****************************************************************/
|
|
|
|
#ifndef UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_LEAF_COUNT_HPP
|
|
#define UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_LEAF_COUNT_HPP
|
|
|
|
namespace Eigen {
|
|
namespace TensorSycl {
|
|
namespace internal {
|
|
/// \brief LeafCount used to counting terminal nodes. The total number of
|
|
/// leaf nodes is used by MakePlaceHolderExprHelper to find the order
|
|
/// of the leaf node in a expression tree at compile time.
|
|
template <typename Expr>
|
|
struct LeafCount;
|
|
|
|
template<typename... Args> struct CategoryCount;
|
|
|
|
template<> struct CategoryCount<>
|
|
{
|
|
static const size_t Count =0;
|
|
};
|
|
|
|
template<typename Arg, typename... Args>
|
|
struct CategoryCount<Arg,Args...>{
|
|
static const size_t Count = LeafCount<Arg>::Count + CategoryCount<Args...>::Count;
|
|
};
|
|
|
|
/// specialisation of the \ref LeafCount struct when the node type is const TensorMap
|
|
template <typename PlainObjectType, int Options_, template <class> class MakePointer_>
|
|
struct LeafCount<const TensorMap<PlainObjectType, Options_, MakePointer_> > {
|
|
static const size_t Count =1;
|
|
};
|
|
|
|
/// specialisation of the \ref LeafCount struct when the node type is TensorMap
|
|
template <typename PlainObjectType, int Options_, template <class> class MakePointer_>
|
|
struct LeafCount<TensorMap<PlainObjectType, Options_, MakePointer_> > :LeafCount<const TensorMap<PlainObjectType, Options_, MakePointer_> >{};
|
|
|
|
// const TensorCwiseUnaryOp, const TensorCwiseNullaryOp, const TensorCwiseBinaryOp, const TensorCwiseTernaryOp, and Const TensorBroadcastingOp
|
|
template <template <class, class...> class CategoryExpr, typename OP, typename... RHSExpr>
|
|
struct LeafCount<const CategoryExpr<OP, RHSExpr...> >: CategoryCount<RHSExpr...> {};
|
|
// TensorCwiseUnaryOp, TensorCwiseNullaryOp, TensorCwiseBinaryOp, TensorCwiseTernaryOp, and TensorBroadcastingOp
|
|
template <template <class, class...> class CategoryExpr, typename OP, typename... RHSExpr>
|
|
struct LeafCount<CategoryExpr<OP, RHSExpr...> > :LeafCount<const CategoryExpr<OP, RHSExpr...> >{};
|
|
|
|
/// specialisation of the \ref LeafCount struct when the node type is const TensorSelectOp is an exception
|
|
template <typename IfExpr, typename ThenExpr, typename ElseExpr>
|
|
struct LeafCount<const TensorSelectOp<IfExpr, ThenExpr, ElseExpr> > : CategoryCount<IfExpr, ThenExpr, ElseExpr> {};
|
|
/// specialisation of the \ref LeafCount struct when the node type is TensorSelectOp
|
|
template <typename IfExpr, typename ThenExpr, typename ElseExpr>
|
|
struct LeafCount<TensorSelectOp<IfExpr, ThenExpr, ElseExpr> >: LeafCount<const TensorSelectOp<IfExpr, ThenExpr, ElseExpr> > {};
|
|
|
|
|
|
/// specialisation of the \ref LeafCount struct when the node type is const TensorAssignOp
|
|
template <typename LHSExpr, typename RHSExpr>
|
|
struct LeafCount<const TensorAssignOp<LHSExpr, RHSExpr> >: CategoryCount<LHSExpr,RHSExpr> {};
|
|
|
|
/// specialisation of the \ref LeafCount struct when the node type is
|
|
/// TensorAssignOp is an exception. It is not the same as Unary
|
|
template <typename LHSExpr, typename RHSExpr>
|
|
struct LeafCount<TensorAssignOp<LHSExpr, RHSExpr> > :LeafCount<const TensorAssignOp<LHSExpr, RHSExpr> >{};
|
|
|
|
/// specialisation of the \ref LeafCount struct when the node type is const TensorForcedEvalOp
|
|
template <typename Expr>
|
|
struct LeafCount<const TensorForcedEvalOp<Expr> > {
|
|
static const size_t Count =1;
|
|
};
|
|
|
|
/// specialisation of the \ref LeafCount struct when the node type is TensorForcedEvalOp
|
|
template <typename Expr>
|
|
struct LeafCount<TensorForcedEvalOp<Expr> >: LeafCount<const TensorForcedEvalOp<Expr> > {};
|
|
|
|
/// specialisation of the \ref LeafCount struct when the node type is const TensorEvalToOp
|
|
template <typename Expr>
|
|
struct LeafCount<const TensorEvalToOp<Expr> > {
|
|
static const size_t Count = 1 + CategoryCount<Expr>::Count;
|
|
};
|
|
|
|
/// specialisation of the \ref LeafCount struct when the node type is const TensorReductionOp
|
|
template <typename OP, typename Dim, typename Expr>
|
|
struct LeafCount<const TensorReductionOp<OP, Dim, Expr> > {
|
|
static const size_t Count =1;
|
|
};
|
|
|
|
/// specialisation of the \ref LeafCount struct when the node type is TensorReductionOp
|
|
template <typename OP, typename Dim, typename Expr>
|
|
struct LeafCount<TensorReductionOp<OP, Dim, Expr> >: LeafCount<const TensorReductionOp<OP, Dim, Expr> >{};
|
|
|
|
/// specialisation of the \ref LeafCount struct when the node type is TensorEvalToOp
|
|
template <typename Expr>
|
|
struct LeafCount<TensorEvalToOp<Expr> >: LeafCount<const TensorEvalToOp<Expr> >{};
|
|
|
|
} /// namespace TensorSycl
|
|
} /// namespace internal
|
|
} /// namespace Eigen
|
|
|
|
#endif // UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_LEAF_COUNT_HPP
|