IntAE *_new_IntAE_from_INTEGER(SEXP x) { IntAE *ae; ae = _new_IntAE(LENGTH(x), 0, 0); copy_INTEGER_to_IntAE(x, ae); return ae; }
IntAE *_new_IntAE_from_CHARACTER(SEXP x, int keyshift) { IntAE *ae; int i, *elt; ae = _new_IntAE(LENGTH(x), 0, 0); _IntAE_set_nelt(ae, ae->_buflength); for (i = 0, elt = ae->elts; i < ae->_buflength; i++, elt++) { sscanf(CHAR(STRING_ELT(x, i)), "%d", elt); *elt += keyshift; } return ae; }
/* --- .Call ENTRY POINT --- */ SEXP CompressedIRangesList_gaps(SEXP x, SEXP start, SEXP end) { SEXP ans, ans_names, ans_unlistData, ans_partitioning, ans_partitioning_end; cachedCompressedIRangesList cached_x; cachedIRanges cached_ir; int max_in_length, x_length, start_length, *start_elt, *end_elt, i; RangeAE in_ranges, out_ranges; IntAE tmpbuf; cached_x = _cache_CompressedIRangesList(x); max_in_length = get_cachedCompressedIRangesList_max_eltLengths( &cached_x); in_ranges = _new_RangeAE(0, 0); out_ranges = _new_RangeAE(0, 0); tmpbuf = _new_IntAE(max_in_length, 0, 0); x_length = _get_cachedCompressedIRangesList_length(&cached_x); start_length = LENGTH(start); if ((start_length != 1 && start_length != x_length) || start_length != LENGTH(end)) error("'start' and 'end' should both be integer vectors of length 1 or length(x)"); PROTECT(ans_partitioning_end = NEW_INTEGER(x_length)); start_elt = INTEGER(start); end_elt = INTEGER(end); for (i = 0; i < x_length; i++) { cached_ir = _get_cachedCompressedIRangesList_elt(&cached_x, i); _RangeAE_set_nelt(&in_ranges, 0); append_cachedIRanges_to_RangeAE(&in_ranges, &cached_ir); _gaps_ranges(in_ranges.start.elts, in_ranges.width.elts, _RangeAE_get_nelt(&in_ranges), *start_elt, *end_elt, tmpbuf.elts, &out_ranges); INTEGER(ans_partitioning_end)[i] = _RangeAE_get_nelt(&out_ranges); if (start_length != 1) { start_elt++; end_elt++; } } PROTECT(ans_unlistData = _new_IRanges_from_RangeAE("IRanges", &out_ranges)); PROTECT(ans_names = duplicate(_get_CompressedList_names(x))); PROTECT(ans_partitioning = _new_PartitioningByEnd( "PartitioningByEnd", ans_partitioning_end, ans_names)); PROTECT(ans = _new_CompressedList(_get_classname(x), ans_unlistData, ans_partitioning)); UNPROTECT(5); return ans; }
/* --- .Call ENTRY POINT --- */ SEXP CompressedIRangesList_reduce(SEXP x, SEXP drop_empty_ranges, SEXP min_gapwidth) { SEXP ans, ans_names, ans_unlistData, ans_partitioning, ans_partitioning_end; cachedCompressedIRangesList cached_x; cachedIRanges cached_ir; int max_in_length, x_length, i; RangeAE in_ranges, out_ranges; IntAE tmpbuf; cached_x = _cache_CompressedIRangesList(x); max_in_length = get_cachedCompressedIRangesList_max_eltLengths( &cached_x); in_ranges = _new_RangeAE(0, 0); out_ranges = _new_RangeAE(0, 0); tmpbuf = _new_IntAE(max_in_length, 0, 0); x_length = _get_cachedCompressedIRangesList_length(&cached_x); PROTECT(ans_partitioning_end = NEW_INTEGER(x_length)); for (i = 0; i < x_length; i++) { cached_ir = _get_cachedCompressedIRangesList_elt(&cached_x, i); _RangeAE_set_nelt(&in_ranges, 0); append_cachedIRanges_to_RangeAE(&in_ranges, &cached_ir); _reduce_ranges(in_ranges.start.elts, in_ranges.width.elts, _RangeAE_get_nelt(&in_ranges), LOGICAL(drop_empty_ranges)[0], INTEGER(min_gapwidth)[0], tmpbuf.elts, &out_ranges, NULL); INTEGER(ans_partitioning_end)[i] = _RangeAE_get_nelt(&out_ranges); } PROTECT(ans_unlistData = _new_IRanges_from_RangeAE("IRanges", &out_ranges)); PROTECT(ans_names = duplicate(_get_CompressedList_names(x))); PROTECT(ans_partitioning = _new_PartitioningByEnd( "PartitioningByEnd", ans_partitioning_end, ans_names)); PROTECT(ans = _new_CompressedList(_get_classname(x), ans_unlistData, ans_partitioning)); UNPROTECT(5); return ans; }