cart-elc

Source code for CART-ELC
git clone git://git.laack.co/cart-elc.git
Log | Files | Refs | README | LICENSE

Swap.h (2765B)


      1 // This file is part of Eigen, a lightweight C++ template library
      2 // for linear algebra.
      3 //
      4 // Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
      5 //
      6 // This Source Code Form is subject to the terms of the Mozilla
      7 // Public License v. 2.0. If a copy of the MPL was not distributed
      8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
      9 
     10 #ifndef EIGEN_SWAP_H
     11 #define EIGEN_SWAP_H
     12 
     13 namespace Eigen { 
     14 
     15 namespace internal {
     16 
     17 // Overload default assignPacket behavior for swapping them
     18 template<typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT>
     19 class generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, swap_assign_op<typename DstEvaluatorTypeT::Scalar>, Specialized>
     20  : public generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, swap_assign_op<typename DstEvaluatorTypeT::Scalar>, BuiltIn>
     21 {
     22 protected:
     23   typedef generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, swap_assign_op<typename DstEvaluatorTypeT::Scalar>, BuiltIn> Base;
     24   using Base::m_dst;
     25   using Base::m_src;
     26   using Base::m_functor;
     27   
     28 public:
     29   typedef typename Base::Scalar Scalar;
     30   typedef typename Base::DstXprType DstXprType;
     31   typedef swap_assign_op<Scalar> Functor;
     32   
     33   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
     34   generic_dense_assignment_kernel(DstEvaluatorTypeT &dst, const SrcEvaluatorTypeT &src, const Functor &func, DstXprType& dstExpr)
     35     : Base(dst, src, func, dstExpr)
     36   {}
     37   
     38   template<int StoreMode, int LoadMode, typename PacketType>
     39   EIGEN_STRONG_INLINE void assignPacket(Index row, Index col)
     40   {
     41     PacketType tmp = m_src.template packet<LoadMode,PacketType>(row,col);
     42     const_cast<SrcEvaluatorTypeT&>(m_src).template writePacket<LoadMode>(row,col, m_dst.template packet<StoreMode,PacketType>(row,col));
     43     m_dst.template writePacket<StoreMode>(row,col,tmp);
     44   }
     45   
     46   template<int StoreMode, int LoadMode, typename PacketType>
     47   EIGEN_STRONG_INLINE void assignPacket(Index index)
     48   {
     49     PacketType tmp = m_src.template packet<LoadMode,PacketType>(index);
     50     const_cast<SrcEvaluatorTypeT&>(m_src).template writePacket<LoadMode>(index, m_dst.template packet<StoreMode,PacketType>(index));
     51     m_dst.template writePacket<StoreMode>(index,tmp);
     52   }
     53   
     54   // TODO find a simple way not to have to copy/paste this function from generic_dense_assignment_kernel, by simple I mean no CRTP (Gael)
     55   template<int StoreMode, int LoadMode, typename PacketType>
     56   EIGEN_STRONG_INLINE void assignPacketByOuterInner(Index outer, Index inner)
     57   {
     58     Index row = Base::rowIndexByOuterInner(outer, inner); 
     59     Index col = Base::colIndexByOuterInner(outer, inner);
     60     assignPacket<StoreMode,LoadMode,PacketType>(row, col);
     61   }
     62 };
     63 
     64 } // namespace internal
     65 
     66 } // end namespace Eigen
     67 
     68 #endif // EIGEN_SWAP_H