@@ -1363,7 +1363,7 @@ COREARRAY_DLL_EXPORT SEXP SEQ_ClearVarMap(SEXP gdsfile)
13631363
13641364
13651365// ===========================================================
1366- // Clear VarMap in a GDS file
1366+ // Get or clear the memory buffer storing variant positions
13671367// ===========================================================
13681368
13691369COREARRAY_DLL_EXPORT SEXP SEQ_BufferPosition (SEXP gdsfile, SEXP clear)
@@ -1385,6 +1385,36 @@ COREARRAY_DLL_EXPORT SEXP SEQ_BufferPosition(SEXP gdsfile, SEXP clear)
13851385
13861386
13871387
1388+ // ===========================================================
1389+ // Get RLE-coded chromosome
1390+ // ===========================================================
1391+
1392+ COREARRAY_DLL_EXPORT SEXP SEQ_Get_ChromRLE (SEXP gdsfile)
1393+ {
1394+ COREARRAY_TRY
1395+ CFileInfo &File = GetFileInfo (gdsfile);
1396+ CChromIndex &Chrom = File.Chromosome ();
1397+ vector<string> &V = Chrom.RLE_Values ();
1398+ vector<C_UInt32> &L = Chrom.RLE_Lengths ();
1399+ if (V.size () != L.size ())
1400+ throw ErrSeqArray (" Invalid RLE of chromosome!" );
1401+ rv_ans = PROTECT (NEW_LIST (2 ));
1402+ SEXP l = NEW_INTEGER (L.size ());
1403+ SET_ELEMENT (rv_ans, 0 , l);
1404+ memcpy (INTEGER (l), &L[0 ], sizeof (int )*L.size ());
1405+ SEXP v = NEW_CHARACTER (V.size ());
1406+ SET_ELEMENT (rv_ans, 1 , v);
1407+ for (size_t i=0 ; i < V.size (); i++)
1408+ {
1409+ string &s = V[i];
1410+ SET_STRING_ELT (v, i, Rf_mkCharLen (&s[0 ], s.size ()));
1411+ }
1412+ UNPROTECT (1 );
1413+ COREARRAY_CATCH
1414+ }
1415+
1416+
1417+
13881418// ===========================================================
13891419// Get system configuration
13901420// ===========================================================
@@ -1677,6 +1707,7 @@ COREARRAY_DLL_EXPORT void R_init_SeqArray(DllInfo *info)
16771707
16781708 CALL (SEQ_IntAssign, 2 ), CALL (SEQ_AppendFill, 3 ),
16791709 CALL (SEQ_ClearVarMap, 1 ), CALL (SEQ_BufferPosition, 2 ),
1710+ CALL (SEQ_Get_ChromRLE, 1 ),
16801711
16811712 CALL (SEQ_bgzip_create, 1 ),
16821713 CALL (SEQ_ToVCF_Init, 6 ), CALL (SEQ_ToVCF_Done, 0 ),
0 commit comments