[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