1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_SWAP_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_SWAP_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class SwapWrapper
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \internal
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Internal helper class for swapping two expressions
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType>
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<SwapWrapper<ExpressionType> > : traits<ExpressionType> {};
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class SwapWrapper
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  : public internal::dense_xpr_base<SwapWrapper<ExpressionType> >::type
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::dense_xpr_base<SwapWrapper>::type Base;
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DENSE_PUBLIC_INTERFACE(SwapWrapper)
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::packet_traits<Scalar>::type Packet;
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline SwapWrapper(ExpressionType& xpr) : m_expression(xpr) {}
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index rows() const { return m_expression.rows(); }
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index cols() const { return m_expression.cols(); }
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index outerStride() const { return m_expression.outerStride(); }
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index innerStride() const { return m_expression.innerStride(); }
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::conditional<
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       internal::is_lvalue<ExpressionType>::value,
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       Scalar,
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       const Scalar
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                     >::type ScalarWithConstIfNotLvalue;
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Scalar* data() const { return m_expression.data(); }
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline Scalar& coeffRef(Index rowId, Index colId)
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return m_expression.const_cast_derived().coeffRef(rowId, colId);
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& coeffRef(Index index)
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.const_cast_derived().coeffRef(index);
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline Scalar& coeffRef(Index rowId, Index colId) const
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return m_expression.coeffRef(rowId, colId);
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& coeffRef(Index index) const
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.coeffRef(index);
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    void copyCoeff(Index rowId, Index colId, const DenseBase<OtherDerived>& other)
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      OtherDerived& _other = other.const_cast_derived();
767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      eigen_internal_assert(rowId >= 0 && rowId < rows()
777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                         && colId >= 0 && colId < cols());
787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      Scalar tmp = m_expression.coeff(rowId, colId);
797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      m_expression.coeffRef(rowId, colId) = _other.coeff(rowId, colId);
807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      _other.coeffRef(rowId, colId) = tmp;
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void copyCoeff(Index index, const DenseBase<OtherDerived>& other)
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      OtherDerived& _other = other.const_cast_derived();
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      eigen_internal_assert(index >= 0 && index < m_expression.size());
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      Scalar tmp = m_expression.coeff(index);
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_expression.coeffRef(index) = _other.coeff(index);
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      _other.coeffRef(index) = tmp;
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived, int StoreMode, int LoadMode>
947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    void copyPacket(Index rowId, Index colId, const DenseBase<OtherDerived>& other)
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      OtherDerived& _other = other.const_cast_derived();
977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      eigen_internal_assert(rowId >= 0 && rowId < rows()
987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                        && colId >= 0 && colId < cols());
997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      Packet tmp = m_expression.template packet<StoreMode>(rowId, colId);
1007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      m_expression.template writePacket<StoreMode>(rowId, colId,
1017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        _other.template packet<LoadMode>(rowId, colId)
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      );
1037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      _other.template writePacket<LoadMode>(rowId, colId, tmp);
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived, int StoreMode, int LoadMode>
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void copyPacket(Index index, const DenseBase<OtherDerived>& other)
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      OtherDerived& _other = other.const_cast_derived();
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      eigen_internal_assert(index >= 0 && index < m_expression.size());
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      Packet tmp = m_expression.template packet<StoreMode>(index);
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_expression.template writePacket<StoreMode>(index,
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        _other.template packet<LoadMode>(index)
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      );
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      _other.template writePacket<LoadMode>(index, tmp);
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& expression() const { return m_expression; }
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ExpressionType& m_expression;
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_SWAP_H
127