yat/utility/MatrixView.cc

Code
Comments
Other
Rev Date Author Line
4129 19 Jan 22 peter 1 // $Id$
4129 19 Jan 22 peter 2
4129 19 Jan 22 peter 3 /*
4129 19 Jan 22 peter 4   Copyright (C) 2022 Peter Johansson
4129 19 Jan 22 peter 5
4129 19 Jan 22 peter 6   This file is part of the yat library, https://dev.thep.lu.se/yat
4129 19 Jan 22 peter 7
4129 19 Jan 22 peter 8   The yat library is free software; you can redistribute it and/or
4129 19 Jan 22 peter 9   modify it under the terms of the GNU General Public License as
4129 19 Jan 22 peter 10   published by the Free Software Foundation; either version 3 of the
4129 19 Jan 22 peter 11   License, or (at your option) any later version.
4129 19 Jan 22 peter 12
4129 19 Jan 22 peter 13   The yat library is distributed in the hope that it will be useful,
4129 19 Jan 22 peter 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
4129 19 Jan 22 peter 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4129 19 Jan 22 peter 16   General Public License for more details.
4129 19 Jan 22 peter 17
4129 19 Jan 22 peter 18   You should have received a copy of the GNU General Public License
4129 19 Jan 22 peter 19   along with yat. If not, see <https://www.gnu.org/licenses/>.
4129 19 Jan 22 peter 20 */
4129 19 Jan 22 peter 21
4129 19 Jan 22 peter 22 #include <config.h>
4129 19 Jan 22 peter 23
4129 19 Jan 22 peter 24 #include "MatrixView.h"
4129 19 Jan 22 peter 25 #include "BasicMatrix.h"
4129 19 Jan 22 peter 26
4129 19 Jan 22 peter 27 #include <cassert>
4129 19 Jan 22 peter 28
4129 19 Jan 22 peter 29 namespace theplu {
4129 19 Jan 22 peter 30 namespace yat {
4129 19 Jan 22 peter 31 namespace utility {
4129 19 Jan 22 peter 32
4129 19 Jan 22 peter 33   MatrixView::MatrixView(void)
4129 19 Jan 22 peter 34     : view_(nullptr)
4129 19 Jan 22 peter 35   {
4129 19 Jan 22 peter 36   }
4129 19 Jan 22 peter 37
4129 19 Jan 22 peter 38
4129 19 Jan 22 peter 39   MatrixView::MatrixView(MatrixView& other)
4129 19 Jan 22 peter 40     : view_(nullptr)
4129 19 Jan 22 peter 41   {
4129 19 Jan 22 peter 42     copy(other.gsl_matrix_p());
4129 19 Jan 22 peter 43   }
4129 19 Jan 22 peter 44
4129 19 Jan 22 peter 45
4129 19 Jan 22 peter 46   MatrixView::MatrixView(MatrixMutable& other)
4129 19 Jan 22 peter 47     : view_(nullptr)
4129 19 Jan 22 peter 48   {
4129 19 Jan 22 peter 49     copy(other.gsl_matrix_p());
4129 19 Jan 22 peter 50   }
4129 19 Jan 22 peter 51
4129 19 Jan 22 peter 52
4129 19 Jan 22 peter 53   MatrixView::MatrixView(MatrixMutable& other,
4129 19 Jan 22 peter 54                          size_t row_offset, size_t col_offset,
4129 19 Jan 22 peter 55                          size_t rows, size_t columns)
4129 19 Jan 22 peter 56     : view_(nullptr)
4129 19 Jan 22 peter 57   {
4129 19 Jan 22 peter 58     copy(other.gsl_matrix_p(), row_offset, col_offset, rows, columns);
4129 19 Jan 22 peter 59   }
4129 19 Jan 22 peter 60
4129 19 Jan 22 peter 61
4141 01 Feb 22 peter 62   MatrixView::MatrixView(gsl_matrix* m)
4141 01 Feb 22 peter 63   {
4141 01 Feb 22 peter 64     assert(0);
4141 01 Feb 22 peter 65   }
4141 01 Feb 22 peter 66
4141 01 Feb 22 peter 67
4141 01 Feb 22 peter 68   MatrixView::MatrixView(double* p, size_t rows, size_t cols)
4141 01 Feb 22 peter 69   {
4141 01 Feb 22 peter 70     assert(0);
4141 01 Feb 22 peter 71   }
4141 01 Feb 22 peter 72
4141 01 Feb 22 peter 73
4141 01 Feb 22 peter 74   MatrixView::MatrixView(double* p, size_t rows, size_t cols, size_t tda)
4141 01 Feb 22 peter 75   {
4141 01 Feb 22 peter 76     assert(0);
4141 01 Feb 22 peter 77   }
4141 01 Feb 22 peter 78
4141 01 Feb 22 peter 79
4129 19 Jan 22 peter 80   MatrixView::~MatrixView(void)
4129 19 Jan 22 peter 81   {
4129 19 Jan 22 peter 82     delete view_;
4129 19 Jan 22 peter 83     view_ = nullptr;
4129 19 Jan 22 peter 84   }
4129 19 Jan 22 peter 85
4129 19 Jan 22 peter 86
4129 19 Jan 22 peter 87   MatrixView& MatrixView::operator=(const MatrixView& other)
4129 19 Jan 22 peter 88   {
4129 19 Jan 22 peter 89     copy_assign(other);
4129 19 Jan 22 peter 90     return *this;
4129 19 Jan 22 peter 91   }
4129 19 Jan 22 peter 92
4129 19 Jan 22 peter 93
4129 19 Jan 22 peter 94   void MatrixView::copy(gsl_matrix* other)
4129 19 Jan 22 peter 95   {
4129 19 Jan 22 peter 96     copy(other, 0, 0, detail::rows(other), detail::columns(other));
4129 19 Jan 22 peter 97   }
4129 19 Jan 22 peter 98
4129 19 Jan 22 peter 99
4129 19 Jan 22 peter 100   void MatrixView::copy(gsl_matrix* other, size_t k1, size_t k2,
4129 19 Jan 22 peter 101                         size_t n1, size_t n2)
4129 19 Jan 22 peter 102   {
4129 19 Jan 22 peter 103     assert(!view_ && "should only be called in constructors");
4129 19 Jan 22 peter 104     if (other) {
4129 19 Jan 22 peter 105       view_ =
4129 19 Jan 22 peter 106         new gsl_matrix_view(gsl_matrix_submatrix(other, k1, k2, n1, n2));
4129 19 Jan 22 peter 107       assert(view_);
4129 19 Jan 22 peter 108     }
4129 19 Jan 22 peter 109   }
4129 19 Jan 22 peter 110
4129 19 Jan 22 peter 111
4129 19 Jan 22 peter 112   void MatrixView::copy_assign(const gsl_matrix* rhs)
4129 19 Jan 22 peter 113   {
4129 19 Jan 22 peter 114     if (rhs) {
4129 19 Jan 22 peter 115       assert(gsl_matrix_p()); // dimension mismatch
4129 19 Jan 22 peter 116       if (detail::overlap(gsl_matrix_p(), rhs)) {
4129 19 Jan 22 peter 117         detail::copy(blas_result_, rhs);
4129 19 Jan 22 peter 118         detail::assign(gsl_matrix_p(), blas_result_);
4129 19 Jan 22 peter 119       }
4129 19 Jan 22 peter 120       else
4129 19 Jan 22 peter 121         detail::assign(gsl_matrix_p(), rhs);
4129 19 Jan 22 peter 122     }
4129 19 Jan 22 peter 123   }
4129 19 Jan 22 peter 124
4129 19 Jan 22 peter 125
4129 19 Jan 22 peter 126   gsl_matrix* MatrixView::gsl_matrix_p(void)
4129 19 Jan 22 peter 127   {
4129 19 Jan 22 peter 128     if (view_)
4129 19 Jan 22 peter 129       return &view_->matrix;
4129 19 Jan 22 peter 130     return nullptr;
4129 19 Jan 22 peter 131   }
4129 19 Jan 22 peter 132
4129 19 Jan 22 peter 133
4129 19 Jan 22 peter 134   const gsl_matrix* MatrixView::gsl_matrix_p(void) const
4129 19 Jan 22 peter 135   {
4129 19 Jan 22 peter 136     if (view_)
4129 19 Jan 22 peter 137       return &view_->matrix;
4129 19 Jan 22 peter 138     return nullptr;
4129 19 Jan 22 peter 139   }
4129 19 Jan 22 peter 140
4129 19 Jan 22 peter 141
4129 19 Jan 22 peter 142   void MatrixView::move_assign(MatrixMutable&& rhs)
4129 19 Jan 22 peter 143   {
4129 19 Jan 22 peter 144     copy_assign(rhs);
4129 19 Jan 22 peter 145   }
4129 19 Jan 22 peter 146
4129 19 Jan 22 peter 147
4129 19 Jan 22 peter 148   void MatrixView::move_assign(gsl_matrix*&& rhs)
4129 19 Jan 22 peter 149   {
4129 19 Jan 22 peter 150     copy_assign(rhs);
4129 19 Jan 22 peter 151   }
4129 19 Jan 22 peter 152
4129 19 Jan 22 peter 153
4137 21 Jan 22 peter 154   MatrixView::MatrixView(MatrixView::proxy p)
4137 21 Jan 22 peter 155     : view_(nullptr)
4137 21 Jan 22 peter 156   {
4137 21 Jan 22 peter 157     std::swap(view_, p.view_);
4137 21 Jan 22 peter 158   }
4137 21 Jan 22 peter 159
4137 21 Jan 22 peter 160
4137 21 Jan 22 peter 161   MatrixView::operator proxy()
4137 21 Jan 22 peter 162   {
4137 21 Jan 22 peter 163     return proxy(std::move(view_));
4137 21 Jan 22 peter 164   }
4137 21 Jan 22 peter 165
4137 21 Jan 22 peter 166
4137 21 Jan 22 peter 167   MatrixView::proxy::proxy(gsl_matrix_view*&& v)
4137 21 Jan 22 peter 168     : view_(nullptr)
4137 21 Jan 22 peter 169   {
4137 21 Jan 22 peter 170     std::swap(view_, v);
4137 21 Jan 22 peter 171   }
4137 21 Jan 22 peter 172
4129 19 Jan 22 peter 173 }}} // of namespace utility, yat and thep