44using namespace Rcpp ;
55using namespace std ;
66
7- template <int RTYPE> Vector<RTYPE> cpp_stack_impl (List array_list, int along, Vector<RTYPE> fill) {
7+ template <int RTYPE> Vector<RTYPE> cpp_stack_impl (List array_list, int along, Vector<RTYPE> fill, bool ovr ) {
88 auto dimnames = vector<CharacterVector>(along); // dim: names along
99 auto axmap = vector<unordered_map<string, int >>(along); // dim: element name->index
1010 auto ax_unnamed = vector<int >(along); // counter for unnamed dimension elements
@@ -105,7 +105,13 @@ template<int RTYPE> Vector<RTYPE> cpp_stack_impl(List array_list, int along, Vec
105105 }
106106
107107// Rprintf("result[%i] = a[%i][%i]\n", *it[0] + dim_offset, ai, aidx);
108- result[*it[0 ] + dim_offset] = a[aidx];
108+ int ri = *it[0 ] + dim_offset;
109+ auto newval = a[aidx];
110+ if (!ovr) {
111+ if (! (result[ri] == fill[0 ] || result[ri] == newval))
112+ stop (" Different values on same position and allow_overwrite=FALSE" );
113+ }
114+ result[ri] = newval;
109115
110116 it[0 ]++;
111117 for (int d=0 ; d<maxdim; d++) { // check if we're jumping dimensions
@@ -123,7 +129,7 @@ template<int RTYPE> Vector<RTYPE> cpp_stack_impl(List array_list, int along, Vec
123129}
124130
125131// [[Rcpp::export]]
126- SEXP cpp_stack (List array_list, int along, SEXP fill) {
132+ SEXP cpp_stack (List array_list, int along, SEXP fill, bool ovr ) {
127133 auto max_type = NILSXP;
128134 for (int ai=0 ; ai<array_list.size (); ai++) {
129135 int cur_type = TYPEOF (array_list[ai]);
@@ -134,11 +140,11 @@ SEXP cpp_stack(List array_list, int along, SEXP fill) {
134140 }
135141
136142 switch (max_type) {
137- case LGLSXP: return cpp_stack_impl<LGLSXP>(array_list, along, as<LogicalVector>(fill));
138- case INTSXP: return cpp_stack_impl<INTSXP>(array_list, along, as<IntegerVector>(fill));
139- case REALSXP: return cpp_stack_impl<REALSXP>(array_list, along, as<NumericVector>(fill));
140- case CPLXSXP: return cpp_stack_impl<CPLXSXP>(array_list, along, as<ComplexVector>(fill));
141- case STRSXP: return cpp_stack_impl<STRSXP>(array_list, along, as<CharacterVector>(fill));
143+ case LGLSXP: return cpp_stack_impl<LGLSXP>(array_list, along, as<LogicalVector>(fill), ovr );
144+ case INTSXP: return cpp_stack_impl<INTSXP>(array_list, along, as<IntegerVector>(fill), ovr );
145+ case REALSXP: return cpp_stack_impl<REALSXP>(array_list, along, as<NumericVector>(fill), ovr );
146+ case CPLXSXP: return cpp_stack_impl<CPLXSXP>(array_list, along, as<ComplexVector>(fill), ovr );
147+ case STRSXP: return cpp_stack_impl<STRSXP>(array_list, along, as<CharacterVector>(fill), ovr );
142148 default : return R_NilValue; // this should not happen
143149 }
144150}
0 commit comments