Rcpp Version 0.9.10
unroll.h
Go to the documentation of this file.
00001 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
00002 //
00003 // unroll.h: Rcpp R/C++ interface class library -- loop unrolling macro 
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__macros_unroll_h
00023 #define Rcpp__macros_unroll_h
00024    
00025 #define RCPP_LOOP_UNROLL(TARGET,SOURCE)           \
00026 int __trip_count = n >> 2 ;                       \
00027 int i = 0 ;                                       \
00028 for ( ; __trip_count > 0 ; --__trip_count) {      \
00029         TARGET[i] = SOURCE[i] ; i++ ;                 \
00030         TARGET[i] = SOURCE[i] ; i++ ;                 \
00031         TARGET[i] = SOURCE[i] ; i++ ;                 \
00032         TARGET[i] = SOURCE[i] ; i++ ;                 \
00033 }                                                 \
00034 switch (n - i){                                   \
00035   case 3:                                         \
00036       TARGET[i] = SOURCE[i] ; i++ ;               \
00037   case 2:                                         \
00038       TARGET[i] = SOURCE[i] ; i++ ;               \
00039   case 1:                                         \
00040       TARGET[i] = SOURCE[i] ; i++ ;               \
00041   case 0:                                         \
00042   default:                                        \
00043       {}                                          \
00044 }
00045 
00046 #define RCPP_LOOP_UNROLL_LHSFUN(TARGET,FUN,SOURCE)           \
00047 int __trip_count = n >> 2 ;                       \
00048 int i = 0 ;                                       \
00049 for ( ; __trip_count > 0 ; --__trip_count) {      \
00050         TARGET[FUN(i)] = SOURCE[i] ; i++ ;                 \
00051         TARGET[FUN(i)] = SOURCE[i] ; i++ ;                 \
00052         TARGET[FUN(i)] = SOURCE[i] ; i++ ;                 \
00053         TARGET[FUN(i)] = SOURCE[i] ; i++ ;                 \
00054 }                                                 \
00055 switch (n - i){                                   \
00056   case 3:                                         \
00057       TARGET[FUN(i)] = SOURCE[i] ; i++ ;               \
00058   case 2:                                         \
00059       TARGET[FUN(i)] = SOURCE[i] ; i++ ;               \
00060   case 1:                                         \
00061       TARGET[FUN(i)] = SOURCE[i] ; i++ ;               \
00062   case 0:                                         \
00063   default:                                        \
00064       {}                                          \
00065 }
00066 
00067 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Defines