|
Rcpp Version 0.9.10
|
00001 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*- 00002 // 00003 // lower_tri.h: Rcpp R/C++ interface class library -- lower.tri 00004 // 00005 // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois 00006 // 00007 // This file is part of Rcpp. 00008 // 00009 // Rcpp is free software: you can redistribute it and/or modify it 00010 // under the terms of the GNU General Public License as published by 00011 // the Free Software Foundation, either version 2 of the License, or 00012 // (at your option) any later version. 00013 // 00014 // Rcpp is distributed in the hope that it will be useful, but 00015 // WITHOUT ANY WARRANTY; without even the implied warranty of 00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 // GNU General Public License for more details. 00018 // 00019 // You should have received a copy of the GNU General Public License 00020 // along with Rcpp. If not, see <http://www.gnu.org/licenses/>. 00021 00022 #ifndef Rcpp__sugar__lower_tri_h 00023 #define Rcpp__sugar__lower_tri_h 00024 00025 namespace Rcpp{ 00026 namespace sugar{ 00027 00028 template <int RTYPE, bool LHS_NA, typename LHS_T> 00029 class LowerTri : public VectorBase< 00030 LGLSXP , 00031 false , 00032 LowerTri<RTYPE,LHS_NA,LHS_T> 00033 > { 00034 public: 00035 typedef Rcpp::MatrixBase<RTYPE,LHS_NA,LHS_T> LHS_TYPE ; 00036 00037 LowerTri( const LHS_TYPE& lhs, bool diag) : 00038 nr( lhs.nrow() ), nc( lhs.ncol() ), 00039 getter( diag ? (&LowerTri::get_diag_true) : (&LowerTri::get_diag_false) ){} 00040 00041 // inline int operator[]( int index ) const { 00042 // int i = Rcpp::internal::get_line( index, nr ) ; 00043 // int j = Rcpp::internal::get_column( index, nr, i ) ; 00044 // return get(i,j) ; 00045 // } 00046 inline int operator()( int i, int j ) const { 00047 return get(i,j) ; 00048 } 00049 00050 inline int size() const { return nr * nc ; } 00051 inline int nrow() const { return nr; } 00052 inline int ncol() const { return nc; } 00053 00054 private: 00055 int nr, nc ; 00056 typedef bool (LowerTri::*Method)(int,int) ; 00057 00058 Method getter ; 00059 inline bool get_diag_true( int i, int j ){ 00060 return i <= j ; 00061 } 00062 inline bool get_diag_false( int i, int j ){ 00063 return i < j ; 00064 } 00065 inline bool get( int i, int j){ 00066 return (this->*getter)(i, j ) ; 00067 } 00068 00069 } ; 00070 00071 } // sugar 00072 00073 template <int RTYPE, bool LHS_NA, typename LHS_T> 00074 inline sugar::LowerTri<RTYPE,LHS_NA,LHS_T> 00075 lower_tri( const Rcpp::MatrixBase<RTYPE,LHS_NA,LHS_T>& lhs, bool diag = false){ 00076 return sugar::LowerTri<RTYPE,LHS_NA,LHS_T>( lhs, diag ) ; 00077 } 00078 00079 } // Rcpp 00080 00081 #endif