// GenFem - A high-level finite element library
// Copyright (C) 2010-2026 Eric Bechet
//
// See the LICENSE file for license information and contributions.
// Please report all bugs and problems to <bechet@cadxfem.org>.
//
// Initial design: Eric Bechet and Frederic Duboeuf (rev.1011)


#ifndef _GEN_TENSORTRANSPOSE__H_
#define _GEN_TENSORTRANSPOSE__H_

#include "genTensors.h"

template<class T> class TransposeOp
{
  public :
  typedef T ValType;
  TransposeOp(int n_=0, int m_=1) {}
  void operator() (const T &a, ValType &r) const
  {
    r=a;
  }
};

template<class scalar,int N> class TransposeOp<genTensor2<scalar,N> >
{
public :
  typedef genTensor2<scalar,N> ValType;
  TransposeOp(int n_=0, int m_=1) {}
  void operator() (const genTensor2<scalar,N> &a, ValType &r) const
  {
    r=a.transpose();
  }
};

template<class scalar,int N> class TransposeOp<genTensor3<scalar,N> >
{
  int n,m;
public :
  typedef genTensor3<scalar,N> ValType;
  TransposeOp(int n_=0, int m_=1) : n(n_), m(m_) {}
  void operator() (const genTensor3<scalar,N> &a, ValType &r) const
  {
    r=a.transpose(n,m);
  }
};

template<class scalar,int N> class TransposeOp<genTensor4<scalar,N> >
{
  int n,m;
public :
  typedef genTensor4<scalar,N> ValType;
  TransposeOp(int n_=0, int m_=1) : n(n_), m(m_) {}
  void operator() (const genTensor4<scalar,N> &a, ValType &r) const
  {
    r=a.transpose(n,m);
  }
};

#endif // _GEN_TENSORTRANSPOSE__H_
