1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
     100
     101
     102
     103
     104
     105
     106
     107
     108
     109
     110
     111
     112
     113
     114
     115
     116
     117
     118
     119
     120
     121
     122
     123
     124
     125
     126
     127
     128
     129
     130
     131
     132
     133
     134
     135
     136
#ifndef ULMBLAS_CXXBLAS_LEVEL1_COPY_TCC
#define ULMBLAS_CXXBLAS_LEVEL1_COPY_TCC 1

#include <ulmblas/cxxblas/level1/copy.h>
#include <ulmblas/ulmblas.h>

namespace cxxblas {

template <typename IndexType, typename TX, typename TY>
void
copy(IndexType    n,
     bool         conjX,
     const TX     *x,
     IndexType    incX,
     TY           *y,
     IndexType    incY)
{
    if (incX<0) {
        x -= incX*(n-1);
    }
    if (incY<0) {
        y -= incY*(n-1);
    }
    ulmBLAS::copy(n, conjX, x, incX, y, incY);
}

template <typename IndexType, typename TX, typename TY>
void
copy(IndexType    n,
     const TX     *x,
     IndexType    incX,
     TY           *y,
     IndexType    incY)
{
    if (incX<0) {
        x -= incX*(n-1);
    }
    if (incY<0) {
        y -= incY*(n-1);
    }
    ulmBLAS::copy(n, false, x, incX, y, incY);
}

template <typename IndexType, typename MX, typename MY>
void
gecopy(IndexType      m,
       IndexType      n,
       bool           transX,
       bool           conjX,
       const MX       *X,
       IndexType      incRowX,
       IndexType      incColX,
       MY             *Y,
       IndexType      incRowY,
       IndexType      incColY)
{
    if (!transX) {
        ulmBLAS::gecopy(m, n, conjX, X, incRowX, incColX, Y, incRowY, incColY);
    } else {
        ulmBLAS::gecopy(m, n, conjX, X, incColX, incRowX, Y, incRowY, incColY);
    }
}

template <typename IndexType, typename MX, typename MY>
void
gecopy(IndexType      m,
       IndexType      n,
       const MX       *X,
       IndexType      incRowX,
       IndexType      incColX,
       MY             *Y,
       IndexType      incRowY,
       IndexType      incColY)
{
    gecopy(m, n,
           falsefalse,
           X, incRowX, incColX,
           Y, incRowY, incColY);
}

template <typename IndexType, typename MA, typename MB>
void
trcopy(IndexType      m,
       IndexType      n,
       bool           lowerA,
       bool           transA,
       bool           conjA,
       bool           unitDiagA,
       const MA       *A,
       IndexType      incRowA_,
       IndexType      incColA_,
       MB             *B,
       IndexType      incRowB,
       IndexType      incColB)
{
    IndexType incRowA = (!transA) ? incRowA_ : incColA_;
    IndexType incColA = (!transA) ? incColA_ : incRowA_;

    if (!transA) {
        if (lowerA) {
            //
            // Copy lower part of A to lower part of B
            //
            ulmBLAS::trlcopy(m, n,
                             unitDiagA, conjA, A, incRowA, incColA,
                             B, incRowB, incColB);
        } else {
            //
            // Copy upper part of A to upper part of B
            //
            ulmBLAS::trlcopy(n, m,
                             unitDiagA, conjA, A, incColA, incRowA,
                             B, incColB, incRowB);
        }
    } else {
        if (lowerA) {
            //
            // Copy lower part of A to upper part of B
            //
            ulmBLAS::trlcopy(m, n,
                             unitDiagA, conjA, A, incRowA, incColA,
                             B, incColB, incRowB);
        } else {
            //
            // Copy upper part of A to lower part of B
            //
            ulmBLAS::trlcopy(n, m,
                             unitDiagA, conjA, A, incColA, incRowA,
                             B, incRowB, incColB);
        }
    }
}

// namespace cxxblas

#endif // ULMBLAS_CXXBLAS_LEVEL1_COPY_TCC