1 // Licensed to the Apache Software Foundation (ASF) under one 2 // or more contributor license agreements. See the NOTICE file 3 // distributed with this work for additional information 4 // regarding copyright ownership. The ASF licenses this file 5 // to you under the Apache License, Version 2.0 (the 6 // "License"); you may not use this file except in compliance 7 // with the License. You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, 12 // software distributed under the License is distributed on an 13 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 14 // KIND, either express or implied. See the License for the 15 // specific language governing permissions and limitations 16 // under the License. 17 18 #include <R_ext/Rdynload.h> // for R_GetCCallable 19 #include <Rdefines.h> 20 21 namespace vctrs { 22 struct vctrs_api_ptrs_t { 23 R_len_t (*short_vec_size)(SEXP x); 24 vctrs_api_ptrs_tvctrs::vctrs_api_ptrs_t25 vctrs_api_ptrs_t() { 26 short_vec_size = (R_len_t(*)(SEXP))R_GetCCallable("vctrs", "short_vec_size"); 27 } 28 }; 29 vctrs_api()30const vctrs_api_ptrs_t& vctrs_api() { 31 static vctrs_api_ptrs_t ptrs; 32 return ptrs; 33 } 34 vec_size(SEXP x)35R_len_t vec_size(SEXP x) { 36 if (Rf_inherits(x, "data.frame") || TYPEOF(x) != VECSXP || Rf_inherits(x, "POSIXlt")) { 37 return vctrs_api().short_vec_size(x); 38 } else { 39 return Rf_length(x); 40 } 41 } 42 43 } // namespace vctrs 44