/* * MatSample.hpp, part of LatAnalyze 3 * * Copyright (C) 2013 - 2014 Antonin Portelli * * LatAnalyze 3 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * LatAnalyze 3 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with LatAnalyze 3. If not, see . */ #ifndef Latan_MatSample_hpp_ #define Latan_MatSample_hpp_ #include #include #include BEGIN_NAMESPACE /****************************************************************************** * DMat sample class * ******************************************************************************/ class DMatSample: public Sample, public IoObject { public: // block type template template class BlockTemplate { private: typedef typename std::remove_const::type NonConstType; public: // constructors BlockTemplate(S &sample, const Index i, const Index j, const Index nRow, const Index nCol); BlockTemplate(BlockTemplate &b); BlockTemplate(BlockTemplate &&b); // destructor ~BlockTemplate(void) = default; // access S & getSample(void); const S & getSample(void) const; Index getStartRow(void) const; Index getStartCol(void) const; Index getNRow(void) const; Index getNCol(void) const; // assignement operators BlockTemplate & operator=(const S &sample); BlockTemplate & operator=(const S &&sample); private: S &sample_; const Index i_, j_, nRow_, nCol_; }; // block types typedef BlockTemplate Block; typedef const BlockTemplate ConstBlock; public: // constructors using Sample::Sample; DMatSample(void) = default; DMatSample(const Index nSample, const Index nRow, const Index nCol); DMatSample(ConstBlock &sampleBlock); DMatSample(ConstBlock &&sampleBlock); // destructor virtual ~DMatSample(void) = default; // assignement operator DMatSample & operator=(Block &sampleBlock); DMatSample & operator=(Block &&sampleBlock); DMatSample & operator=(ConstBlock &sampleBlock); DMatSample & operator=(ConstBlock &&sampleBlock); // block access ConstBlock block(const Index i, const Index j, const Index nRow, const Index nCol) const; Block block(const Index i, const Index j, const Index nRow, const Index nCol); // resize all matrices void resizeMat(const Index nRow, const Index nCol); // IO type virtual IoType getType(void) const; }; /****************************************************************************** * Block template implementation * ******************************************************************************/ // constructors //////////////////////////////////////////////////////////////// template DMatSample::BlockTemplate::BlockTemplate(S &sample, const Index i, const Index j, const Index nRow, const Index nCol) : sample_(sample) , i_(i) , j_(j) , nRow_(nRow) , nCol_(nCol) {} template DMatSample::BlockTemplate::BlockTemplate(BlockTemplate &b) : sample_(b.getSample()) , i_(b.getStartRow()) , j_(b.getStartCol()) , nRow_(b.getNRow()) , nCol_(b.getNCol()) {} template DMatSample::BlockTemplate::BlockTemplate(BlockTemplate &&b) : BlockTemplate(b) {} // access ////////////////////////////////////////////////////////////////////// template S & DMatSample::BlockTemplate::getSample(void) { return sample_; } template const S & DMatSample::BlockTemplate::getSample(void) const { return sample_; } template Index DMatSample::BlockTemplate::getStartRow(void) const { return i_; } template Index DMatSample::BlockTemplate::getStartCol(void) const { return j_; } template Index DMatSample::BlockTemplate::getNRow(void) const { return nRow_; } template Index DMatSample::BlockTemplate::getNCol(void) const { return nCol_; } // assignement operators /////////////////////////////////////////////////////// template DMatSample::BlockTemplate & DMatSample::BlockTemplate::operator=(const S &sample) { FOR_STAT_ARRAY(sample_, s) { sample_[s].block(i_, j_, nRow_, nCol_) = sample[s]; } return *this; } template DMatSample::BlockTemplate & DMatSample::BlockTemplate::operator=(const S &&sample) { *this = sample; return *this; } END_NAMESPACE #endif // Latan_MatSample_hpp_