Skip to content

Instantly share code, notes, and snippets.

@romainfrancois
Last active April 12, 2020 17:22
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save romainfrancois/7117691 to your computer and use it in GitHub Desktop.
Save romainfrancois/7117691 to your computer and use it in GitHub Desktop.
create list with more than 20 elements (different syntax)
#include <Rcpp.h>
using namespace Rcpp ;
template <typename T>
inline void set_item_impl( List& target, int i, const T& obj, CharacterVector& names, traits::true_type ){
target[i] = obj.object ;
names[i] = obj.name ;
}
template <typename T>
inline void set_item_impl( List& target, int i, const T& obj, CharacterVector&, traits::false_type ){
target[i] = obj ;
}
template <typename T>
inline void set_item( List& target, int i, const T& obj, CharacterVector& names){
set_item_impl( target, i, obj, names, typename traits::is_named<T>::type() ) ;
}
class SequentialInserter{
public:
SequentialInserter( List& target_, CharacterVector& names_ ) : target(target_), names(names_), index(0){}
class SequentialInserterProxy{
public:
SequentialInserterProxy( SequentialInserter& parent_, const char* name_ ) : parent(parent_), name(name_){}
template <typename T>
void operator=( const T& obj){
parent.set( name, obj ) ;
}
private:
SequentialInserter& parent ;
const char* name ;
} ;
inline SequentialInserterProxy operator[]( const char* name){
return SequentialInserterProxy( *this, name );
}
template <typename T>
void set( const char* name, const T& obj){
target[index] = obj ;
names[index] = name ;
index++ ;
}
private:
List& target ;
CharacterVector& names;
int index ;
} ;
// [[Rcpp::export]]
List biglist(){
List out( 30 ) ; CharacterVector names(30) ;
SequentialInserter inserter( out, names );
inserter["x0"] = 42 ;
inserter["x1"] = 42 ;
inserter["x2"] = 42 ;
inserter["x3"] = 42 ;
inserter["x4"] = 42 ;
inserter["x5"] = 42 ;
inserter["x6"] = 42 ;
inserter["x7"] = 42 ;
inserter["x8"] = 42 ;
inserter["x9"] = 42 ;
inserter["x10"] = 42 ;
inserter["x11"] = 42 ;
inserter["x12"] = 42 ;
inserter["x13"] = 42 ;
inserter["x14"] = 42 ;
inserter["x15"] = 42 ;
inserter["x16"] = 42 ;
inserter["x17"] = 42 ;
inserter["x18"] = 42 ;
inserter["x19"] = 42 ;
inserter["x20"] = 42 ;
inserter["x21"] = 42 ;
inserter["x22"] = 42 ;
inserter["x23"] = 42 ;
inserter["x24"] = 42 ;
inserter["x25"] = 42 ;
inserter["x26"] = 42 ;
inserter["x27"] = 42 ;
inserter["x28"] = 42 ;
inserter["x29"] = 42 ;
out.names() = names ;
return out ;
}
/*** R
biglist()
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment