@@ -855,14 +855,53 @@ static SEXP get_list(SEXP len, SEXP val, size_t elmsize, bool is_factor)
855855 memcpy (RAW (vv), &RAW (val)[pt], nn);
856856 break ;
857857 default :
858- throw ErrSeqArray (" Not support data type for .tolist=TRUE." );
858+ throw ErrSeqArray (" Not support data type when ' .tolist=TRUE' ." );
859859 }
860860 pt += nn;
861861 }
862862 }
863863 return rv_ans;
864864}
865865
866+
867+ // .List_IRanges_value
868+ extern " C" SEXP OBJ_CompressedList = NULL ;
869+
870+ // / convert to a compressed list in IRanges
871+ static SEXP get_list2 (SEXP len, SEXP val, bool is_factor)
872+ {
873+ // get data type
874+ int type_idx = -1 ;
875+ switch (TYPEOF (val))
876+ {
877+ case LGLSXP: type_idx = 0 ; break ;
878+ case INTSXP: type_idx = 1 ; break ;
879+ case REALSXP: type_idx = 2 ; break ;
880+ case STRSXP: type_idx = 3 ; break ;
881+ case RAWSXP: type_idx = 4 ; break ;
882+ default :
883+ throw ErrSeqArray (" Not support data type when '.tolist=NA'." );
884+ }
885+ if (is_factor) type_idx = 5 ;
886+ // new object
887+ SEXP rv_ans = Rf_duplicate (VECTOR_ELT (OBJ_CompressedList, type_idx));
888+ PROTECT (rv_ans);
889+ // set @unlistData (OBJ_CompressedList[6]="unlistData")
890+ R_do_slot_assign (rv_ans, VECTOR_ELT (OBJ_CompressedList, 6 ), val);
891+ // get @partitioning (OBJ_CompressedList[7]="partitioning")
892+ SEXP pt = R_do_slot (rv_ans, VECTOR_ELT (OBJ_CompressedList, 7 ));
893+ // set @partitioning@end (OBJ_CompressedList[8]="end")
894+ const int n = Rf_length (len);
895+ SEXP end = PROTECT (NEW_INTEGER (n));
896+ const int *s = INTEGER (len);
897+ int *p = INTEGER (end), ed = 0 ;
898+ for (int i=0 ; i < n; i++) p[i] = (ed += s[i]);
899+ R_do_slot_assign (pt, VECTOR_ELT (OBJ_CompressedList, 8 ), end);
900+ UNPROTECT (1 );
901+ // output
902+ return rv_ans;
903+ }
904+
866905// / get data from annotation/info/VARIABLE, TODO
867906static SEXP get_info (CFileInfo &File, TVarMap &Var, void *param)
868907{
@@ -969,11 +1008,14 @@ static SEXP get_info(CFileInfo &File, TVarMap &Var, void *param)
9691008 default :
9701009 throw ErrSeqArray (" Not support data type for .padNA=TRUE." );
9711010 }
972- } else if (P->tolist )
1011+ } else if (P->tolist ) // TRUE or NA
9731012 {
9741013 // convert to a list
9751014 size_t d2 = (Var.NDim < 2 ) ? 1 : dimcnt[1 ];
976- rv_ans = get_list (I32, val, d2, is_factor);
1015+ if ((P->tolist == TRUE ) || (d2 != 1 ))
1016+ rv_ans = get_list (I32, val, d2, is_factor);
1017+ else
1018+ rv_ans = get_list2 (I32, val, is_factor);
9771019 } else {
9781020 // create `list(length, data)`
9791021 rv_ans = PROTECT (NEW_LIST (2 ));
@@ -1369,9 +1411,9 @@ COREARRAY_DLL_EXPORT SEXP SEQ_GetData(SEXP gdsfile, SEXP var_name, SEXP UseRaw,
13691411 if (padNA == NA_LOGICAL)
13701412 Rf_error (" '.padNA' must be TRUE or FALSE." );
13711413 // .tolist
1414+ if (!Rf_isLogical (ToList) || Rf_length (ToList)!=1 )
1415+ Rf_error (" '.tolist' must be TRUE, FALSE or NA." );
13721416 const int tolist = Rf_asLogical (ToList);
1373- if (tolist == NA_LOGICAL)
1374- Rf_error (" '.tolist' must be TRUE or FALSE." );
13751417 // .envir
13761418 if (!Rf_isNull (Env))
13771419 {
0 commit comments