Exemple #1
0
IntAE *_new_IntAE_from_INTEGER(SEXP x)
{
	IntAE *ae;

	ae = _new_IntAE(LENGTH(x), 0, 0);
	copy_INTEGER_to_IntAE(x, ae);
	return ae;
}
Exemple #2
0
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;
}