@@ -171,73 +171,70 @@ struct compact_repetition
171171 //
172172 // This is guaranteed to never allocate (in the R sense)
173173 static const void * Dataptr_or_null (SEXP vec) {
174- // Rprintf("Calling Dataptr_or_null on a compact_repetition at %p\n", R_ExternalPtrAddr(vec));
175174 SEXP data2 = R_altrep_data2 (vec);
176175 if (data2 == R_NilValue) return nullptr ;
177- return DATAPTR (data2);
176+
177+ switch (TYPEOF (data2)) {
178+ case INTSXP: return INTEGER (data2);
179+ case REALSXP: return REAL (data2);
180+ case LGLSXP: return LOGICAL (data2);
181+ case RAWSXP: return RAW (data2);
182+ default : return nullptr ; // fallback if unknown type
183+ }
178184 }
179185
180- // same in this case, writeable is ignored
181186 static void * DataptrInt (SEXP vec, Rboolean writeable)
182187 {
183188 SEXP data2 = R_altrep_data2 (vec);
184- if (data2 != R_NilValue)
185- {
186- // Rprintf("Returning pointer to materialized compact_repetition at %p\n", R_ExternalPtrAddr(vec));
187- return DATAPTR (data2);
189+ if (data2 != R_NilValue) {
190+ return INTEGER (data2);
188191 }
189192
190- // Rprintf("Materializing a compact repetition at %p\n", R_ExternalPtrAddr(vec));
191193 int n = Length (vec);
192194 auto v = Get (vec).value ;
193195 SEXP val = PROTECT (Rf_allocVector (INTSXP, n));
194196 int *p = INTEGER (val);
195197 for (int i = 0 ; i < n; i++) p[i] = v;
196198 R_set_altrep_data2 (vec, val);
197199 UNPROTECT (1 );
198- return DATAPTR (val);
200+ return INTEGER (val);
199201 }
200202
201203 static void * DataptrReal (SEXP vec, Rboolean writeable)
202204 {
203205 SEXP data2 = R_altrep_data2 (vec);
204- if (data2 != R_NilValue)
205- {
206- // Rprintf("Returning pointer to materialized compact_repetition at %p\n", R_ExternalPtrAddr(vec));
207- return DATAPTR (data2);
206+ if (data2 != R_NilValue) {
207+ return REAL (data2);
208208 }
209209
210- // Rprintf("Materializing a compact repetition at %p\n", R_ExternalPtrAddr(vec));
211210 int n = Length (vec);
212211 double v = Get (vec).value ;
213212 SEXP val = PROTECT (Rf_allocVector (REALSXP, n));
214213 double *p = REAL (val);
215214 for (int i = 0 ; i < n; i++) p[i] = v;
216215 R_set_altrep_data2 (vec, val);
217216 UNPROTECT (1 );
218- return DATAPTR (val);
217+ return REAL (val);
219218 }
220219
221220 static void * DataptrLogical (SEXP vec, Rboolean writeable)
222221 {
223222 SEXP data2 = R_altrep_data2 (vec);
224- if (data2 != R_NilValue)
225- {
226- // Rprintf("Returning pointer to materialized compact_repetition at %p\n", R_ExternalPtrAddr(vec));
227- return DATAPTR (data2);
223+ if (data2 != R_NilValue) {
224+ return LOGICAL (data2);
228225 }
229226
230- // Rprintf("Materializing a compact repetition at %p\n", R_ExternalPtrAddr(vec));
231227 int n = Length (vec);
232228 bool v = Get (vec).value ;
233229 SEXP val = PROTECT (Rf_allocVector (LGLSXP, n));
234230 int *p = LOGICAL (val);
235231 for (int i = 0 ; i < n; i++) p[i] = v ? TRUE : FALSE ;
236232 R_set_altrep_data2 (vec, val);
237233 UNPROTECT (1 );
238- return DATAPTR (val);
234+ return LOGICAL (val);
239235 }
240236
237+
241238 // ALTINT methods -----------------
242239 // the element at the index `i`
243240 // this does not do bounds checking because that's expensive, so
0 commit comments