Swap.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. #ifndef EIGEN_SWAP_H
  10. #define EIGEN_SWAP_H
  11. namespace Eigen {
  12. namespace internal {
  13. // Overload default assignPacket behavior for swapping them
  14. template<typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT>
  15. class generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, swap_assign_op<typename DstEvaluatorTypeT::Scalar>, Specialized>
  16. : public generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, swap_assign_op<typename DstEvaluatorTypeT::Scalar>, BuiltIn>
  17. {
  18. protected:
  19. typedef generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, swap_assign_op<typename DstEvaluatorTypeT::Scalar>, BuiltIn> Base;
  20. using Base::m_dst;
  21. using Base::m_src;
  22. using Base::m_functor;
  23. public:
  24. typedef typename Base::Scalar Scalar;
  25. typedef typename Base::DstXprType DstXprType;
  26. typedef swap_assign_op<Scalar> Functor;
  27. EIGEN_DEVICE_FUNC generic_dense_assignment_kernel(DstEvaluatorTypeT &dst, const SrcEvaluatorTypeT &src, const Functor &func, DstXprType& dstExpr)
  28. : Base(dst, src, func, dstExpr)
  29. {}
  30. template<int StoreMode, int LoadMode, typename PacketType>
  31. void assignPacket(Index row, Index col)
  32. {
  33. PacketType tmp = m_src.template packet<LoadMode,PacketType>(row,col);
  34. const_cast<SrcEvaluatorTypeT&>(m_src).template writePacket<LoadMode>(row,col, m_dst.template packet<StoreMode,PacketType>(row,col));
  35. m_dst.template writePacket<StoreMode>(row,col,tmp);
  36. }
  37. template<int StoreMode, int LoadMode, typename PacketType>
  38. void assignPacket(Index index)
  39. {
  40. PacketType tmp = m_src.template packet<LoadMode,PacketType>(index);
  41. const_cast<SrcEvaluatorTypeT&>(m_src).template writePacket<LoadMode>(index, m_dst.template packet<StoreMode,PacketType>(index));
  42. m_dst.template writePacket<StoreMode>(index,tmp);
  43. }
  44. // 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)
  45. template<int StoreMode, int LoadMode, typename PacketType>
  46. void assignPacketByOuterInner(Index outer, Index inner)
  47. {
  48. Index row = Base::rowIndexByOuterInner(outer, inner);
  49. Index col = Base::colIndexByOuterInner(outer, inner);
  50. assignPacket<StoreMode,LoadMode,PacketType>(row, col);
  51. }
  52. };
  53. } // namespace internal
  54. } // end namespace Eigen
  55. #endif // EIGEN_SWAP_H