/* --- .Call ENTRY POINT --- * 'query_start', 'query_width', 'query_space': integer vectors of the same * length M (or NULL for 'query_space'). * 'query_break': single integer. * 'subject_start', 'subject_width', 'subject_space': integer vectors of the * same length N (or NULL for 'subject_space'). * Integer vectors 'query_start', 'query_width', 'subject_start' and * 'subject_width' are assumed to be NA free. 'query_width' and 'subject_width' * are assumed to contain non-negative values. For efficiency reasons, those * assumptions are not checked. * Return the matrix of 1-letter codes (if 'as_matrix' is TRUE), otherwise a * named list with the 3 following components: * 1. Loffset: single integer; * 2. Roffset: single integer; * 3. encoding: the compact encoding as a single string (if 'as_raw' is * FALSE) or a raw vector (if 'as_raw' is TRUE). */ SEXP encode_overlaps1(SEXP query_start, SEXP query_width, SEXP query_space, SEXP query_break, SEXP flip_query, SEXP subject_start, SEXP subject_width, SEXP subject_space, SEXP as_matrix, SEXP as_raw) { int query_break0, flip_query0, as_matrix0, as_raw0, Loffset, Roffset; CharAE buf; SEXP encoding, ans_Loffset, ans_Roffset, ans; query_break0 = INTEGER(query_break)[0]; flip_query0 = LOGICAL(flip_query)[0]; as_matrix0 = as_matrix != R_NilValue && LOGICAL(as_matrix)[0]; as_raw0 = as_raw != R_NilValue && LOGICAL(as_raw)[0]; buf = _new_CharAE(0); overlap_encoding( query_start, query_width, query_space, query_break0, flip_query0, subject_start, subject_width, subject_space, as_matrix0, &Loffset, &Roffset, &buf); PROTECT(encoding = make_encoding_from_CharAE(&buf, as_raw0 ? 2 : 1, as_matrix0, LENGTH(query_start), query_break0, LENGTH(subject_start))); if (as_matrix0) { UNPROTECT(1); return encoding; } PROTECT(ans_Loffset = ScalarInteger(Loffset)); PROTECT(ans_Roffset = ScalarInteger(Roffset)); PROTECT(ans = make_LIST_from_ovenc_parts(ans_Loffset, ans_Roffset, encoding)); UNPROTECT(4); return ans; }
CharAE *_new_CharAE_from_string(const char *string) { CharAE *ae; ae = _new_CharAE(strlen(string)); _CharAE_set_nelt(ae, ae->_buflength); memcpy(ae->elts, string, ae->_buflength); return ae; }
/* --- .Call ENTRY POINT ---/ * Same arguments as RangesList_encode_overlaps() plus: * 'query_hits', 'subject_hits': integer vectors of the same length. * 'flip_query': logical vector of the same length as 'query_hits'. */ SEXP Hits_encode_overlaps(SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces, SEXP query_hits, SEXP subject_hits, SEXP flip_query) { int q_len, s_len, ans_len, i, j, k; const int *q_hits, *s_hits; SEXP ans_Loffset, ans_Roffset, ans_encoding, ans_encoding_elt, ans; CharAE buf; /* TODO: Add some basic checking of the input values. */ q_len = LENGTH(query_starts); s_len = LENGTH(subject_starts); ans_len = _check_integer_pairs(query_hits, subject_hits, &q_hits, &s_hits, "queryHits(hits)", "subjectHits(hits)"); PROTECT(ans_Loffset = NEW_INTEGER(ans_len)); PROTECT(ans_Roffset = NEW_INTEGER(ans_len)); PROTECT(ans_encoding = NEW_CHARACTER(ans_len)); buf = _new_CharAE(0); for (k = 0; k < ans_len; k++) { i = q_hits[k]; j = s_hits[k]; if (i == NA_INTEGER || i < 1 || i > q_len || j == NA_INTEGER || j < 1 || j > s_len) { UNPROTECT(3); error("'queryHits(hits)' or 'subjectHits(hits)' " "contain invalid indices"); } i--; j--; PROTECT(ans_encoding_elt = RangesList_encode_overlaps_ij( query_starts, query_widths, query_spaces, query_breaks, subject_starts, subject_widths, subject_spaces, i, j, LOGICAL(flip_query)[k], INTEGER(ans_Loffset) + k, INTEGER(ans_Roffset) + k, &buf)); SET_STRING_ELT(ans_encoding, k, ans_encoding_elt); UNPROTECT(1); _CharAE_set_nelt(&buf, 0); } PROTECT(ans = make_LIST_from_ovenc_parts(ans_Loffset, ans_Roffset, ans_encoding)); UNPROTECT(4); return ans; }
/* --- .Call ENTRY POINT ---/ * 'query_starts', 'query_widths', 'query_spaces': lists of integer vectors. * The 3 lists are assumed to have the same length (M) and shape. * 'query_breaks': NULL or integer vector of length M. * 'subject_starts', 'subject_widths', 'subject_spaces': lists of integer * vectors. The 3 lists are assumed to have the same length (N) and shape. * Return a named list with the 3 following components (all of the same * length): * 1. Loffset: integer vector; * 2. Roffset: integer vector; * 3. encoding: character vector containing the compact encodings (type * II). */ SEXP RangesList_encode_overlaps(SEXP query_starts, SEXP query_widths, SEXP query_spaces, SEXP query_breaks, SEXP subject_starts, SEXP subject_widths, SEXP subject_spaces) { int q_len, s_len, ans_len, i, j, k; SEXP ans_Loffset, ans_Roffset, ans_encoding, ans_encoding_elt, ans; CharAE buf; /* TODO: Add some basic checking of the input values. */ q_len = LENGTH(query_starts); s_len = LENGTH(subject_starts); if (q_len == 0 || s_len == 0) ans_len = 0; else ans_len = q_len >= s_len ? q_len : s_len; PROTECT(ans_Loffset = NEW_INTEGER(ans_len)); PROTECT(ans_Roffset = NEW_INTEGER(ans_len)); PROTECT(ans_encoding = NEW_CHARACTER(ans_len)); buf = _new_CharAE(0); for (i = j = k = 0; k < ans_len; i++, j++, k++) { if (i >= q_len) i = 0; /* recycle i */ if (j >= s_len) j = 0; /* recycle j */ PROTECT(ans_encoding_elt = RangesList_encode_overlaps_ij( query_starts, query_widths, query_spaces, query_breaks, subject_starts, subject_widths, subject_spaces, i, j, 0, INTEGER(ans_Loffset) + k, INTEGER(ans_Roffset) + k, &buf)); SET_STRING_ELT(ans_encoding, k, ans_encoding_elt); UNPROTECT(1); _CharAE_set_nelt(&buf, 0); } if (ans_len != 0 && (i != q_len || j != s_len)) warning("longer object length is not a multiple " "of shorter object length"); PROTECT(ans = make_LIST_from_ovenc_parts(ans_Loffset, ans_Roffset, ans_encoding)); UNPROTECT(4); return ans; }