[Rcpp-commits] r3976 - in pkg/Rcpp: . inst/include/Rcpp/sugar/functions
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Thu Nov 15 19:14:45 CET 2012
Author: romain
Date: 2012-11-15 19:14:45 +0100 (Thu, 15 Nov 2012)
New Revision: 3976
Added:
pkg/Rcpp/inst/include/Rcpp/sugar/functions/minmax.h
Modified:
pkg/Rcpp/ChangeLog
pkg/Rcpp/inst/include/Rcpp/sugar/functions/functions.h
Log:
min, max, range
Modified: pkg/Rcpp/ChangeLog
===================================================================
--- pkg/Rcpp/ChangeLog 2012-11-15 17:35:45 UTC (rev 3975)
+++ pkg/Rcpp/ChangeLog 2012-11-15 18:14:45 UTC (rev 3976)
@@ -11,6 +11,7 @@
an uninitialized vector. e.g. IntegerVector out = no_init(10) ;
* include/Rcpp/sugar/functions/unique.h: sugar version of %in% using
unordered_set
+ * include/Rcpp/sugar/functions/minmax.h: min, max, and range
2012-11-14 JJ Allaire <jj at rstudio.org>
Modified: pkg/Rcpp/inst/include/Rcpp/sugar/functions/functions.h
===================================================================
--- pkg/Rcpp/inst/include/Rcpp/sugar/functions/functions.h 2012-11-15 17:35:45 UTC (rev 3975)
+++ pkg/Rcpp/inst/include/Rcpp/sugar/functions/functions.h 2012-11-15 18:14:45 UTC (rev 3976)
@@ -41,6 +41,7 @@
#include <Rcpp/sugar/functions/ifelse.h>
#include <Rcpp/sugar/functions/pmin.h>
#include <Rcpp/sugar/functions/pmax.h>
+#include <Rcpp/sugar/functions/minmax.h>
#include <Rcpp/sugar/functions/sign.h>
#include <Rcpp/sugar/functions/diff.h>
#include <Rcpp/sugar/functions/pow.h>
Added: pkg/Rcpp/inst/include/Rcpp/sugar/functions/minmax.h
===================================================================
--- pkg/Rcpp/inst/include/Rcpp/sugar/functions/minmax.h (rev 0)
+++ pkg/Rcpp/inst/include/Rcpp/sugar/functions/minmax.h 2012-11-15 18:14:45 UTC (rev 3976)
@@ -0,0 +1,145 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+//
+// minmax.h: Rcpp R/C++ interface class library -- min, mx, range
+//
+// Copyright (C) 2012 Dirk Eddelbuettel and Romain Francois
+//
+// This file is part of Rcpp.
+//
+// Rcpp 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 2 of the License, or
+// (at your option) any later version.
+//
+// Rcpp 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 Rcpp. If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef Rcpp__sugar__minmax_h
+#define Rcpp__sugar__minmax_h
+
+namespace Rcpp{
+namespace sugar{
+
+ template <int RTYPE, bool NA, typename T>
+ class MinMax {
+ public:
+ typedef typename Rcpp::traits::storage_type<RTYPE>::type STORAGE ;
+
+ MinMax( const T& obj_) : obj(obj_) {}
+
+ STORAGE min() {
+ min_ = obj[0] ;
+ if( Rcpp::traits::is_na<RTYPE>( min_ ) ) return min_ ;
+
+ int n = obj.size() ;
+ for( int i=1; i<n; i++){
+ current = obj[i] ;
+ if( Rcpp::traits::is_na<RTYPE>( current ) ) return current;
+ if( current < min_ ) min_ = current ;
+ }
+ return min ;
+ }
+ STORAGE max() {
+ max_ = obj[0] ;
+ if( Rcpp::traits::is_na<RTYPE>( max_ ) ) return max_ ;
+
+ int n = obj.size() ;
+ for( int i=1; i<n; i++){
+ current = obj[i] ;
+ if( Rcpp::traits::is_na<RTYPE>( current ) ) return current;
+ if( current > max_ ) max_ = current ;
+ }
+ return min ;
+ }
+ Vector<RTYPE> range(){
+ min_ = max_ = obj[0] ;
+ if( Rcpp::traits::is_na<RTYPE>( min_ ) ) return Vector<RTYPE>::create( min_, max_ ) ;
+
+ int n = obj.size() ;
+ for( int i=1; i<n; i++){
+ current = obj[i] ;
+ if( Rcpp::traits::is_na<RTYPE>( current ) ) return Vector<RTYPE>::create( min_, max_ ) ;
+ if( current < min_ ) min_ = current ;
+ }
+ return Vector<RTYPE>::create( min_, max_ ) ;
+ }
+
+
+ private:
+ const T& obj ;
+ STORAGE min_, max_, current ;
+ } ;
+
+ // version for NA = false
+ template <int RTYPE, typename T>
+ class MinMax<RTYPE,false,T> {
+ public:
+ typedef typename Rcpp::traits::storage_type<RTYPE>::type STORAGE ;
+
+ MinMax( const T& obj_) : obj(obj_) {}
+
+ STORAGE min() {
+ min_ = obj[0] ;
+
+ int n = obj.size() ;
+ for( int i=1; i<n; i++){
+ current = obj[i] ;
+ if( current < min_ ) min_ = current ;
+ }
+ return min ;
+ }
+ STORAGE max() {
+ max_ = obj[0] ;
+
+ int n = obj.size() ;
+ for( int i=1; i<n; i++){
+ current = obj[i] ;
+ if( current > max_ ) max_ = current ;
+ }
+ return min ;
+ }
+ Vector<RTYPE> range(){
+ min_ = max_ = obj[0] ;
+
+ int n = obj.size() ;
+ for( int i=1; i<n; i++){
+ current = obj[i] ;
+ if( current < min_ ) min_ = current ;
+ }
+ return Vector<RTYPE>::create( min_, max_ ) ;
+ }
+
+
+ private:
+ const T& obj ;
+ STORAGE min_, max_, current ;
+ } ;
+
+
+} // sugar
+
+
+template <int RTYPE, bool NA, typename T>
+typename traits::storage_type<RTYPE>::type min( const VectorBase<RTYPE,NA,T>& x){
+ sugar::MinMax<RTYPE,NA,T> obj(x.get_ref()) ;
+ return obj.min() ;
+}
+template <int RTYPE, bool NA, typename T>
+typename traits::storage_type<RTYPE>::type max( const VectorBase<RTYPE,NA,T>& x){
+ sugar::MinMax<RTYPE,NA,T> obj(x.get_ref()) ;
+ return obj.max() ;
+}
+template <int RTYPE, bool NA, typename T>
+Vector<RTYPE> range( const VectorBase<RTYPE,NA,T>& x){
+ sugar::MinMax<RTYPE,NA,T> obj(x.get_ref()) ;
+ return obj.range() ;
+}
+
+} // Rcpp
+
+#endif
More information about the Rcpp-commits
mailing list