|
Rcpp Version 0.9.10
|
00001 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*- 00002 // 00003 // upper_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__upper_tri_h 00023 #define Rcpp__sugar__upper_tri_h 00024 00025 namespace Rcpp{ 00026 namespace sugar{ 00027 00028 template <int RTYPE, bool LHS_NA, typename LHS_T> 00029 class UpperTri : public VectorBase< 00030 LGLSXP , 00031 false , 00032 UpperTri<RTYPE,LHS_NA,LHS_T> 00033 > { 00034 public: 00035 typedef Rcpp::MatrixBase<RTYPE,LHS_NA,LHS_T> LHS_TYPE ; 00036 00037 UpperTri( const LHS_TYPE& lhs, bool diag) : 00038 nr( lhs.nrow() ), nc( lhs.ncol() ), 00039 getter( diag ? (&UpperTri::get_diag_true) : (&UpperTri::get_diag_false) ){} 00040 00041 inline int operator()( int i, int j ) const { 00042 return get(i,j) ; 00043 } 00044 00045 inline int size() const { return nr * nc ; } 00046 inline int nrow() const { return nr; } 00047 inline int ncol() const { return nc; } 00048 00049 private: 00050 int nr, nc ; 00051 typedef bool (UpperTri::*Method)(int,int) ; 00052 00053 Method getter ; 00054 inline bool get_diag_true( int i, int j ){ 00055 return i >= j ; 00056 } 00057 inline bool get_diag_false( int i, int j ){ 00058 return i > j ; 00059 } 00060 inline bool get( int i, int j){ 00061 return (this->*getter)(i, j ) ; 00062 } 00063 00064 } ; 00065 00066 } // sugar 00067 00068 template <int RTYPE, bool LHS_NA, typename LHS_T> 00069 inline sugar::UpperTri<RTYPE,LHS_NA,LHS_T> 00070 upper_tri( const Rcpp::MatrixBase<RTYPE,LHS_NA,LHS_T>& lhs, bool diag = false){ 00071 return sugar::UpperTri<RTYPE,LHS_NA,LHS_T>( lhs, diag ) ; 00072 } 00073 00074 } // Rcpp 00075 00076 #endif