726 lines
10 KiB
C
Raw Permalink Normal View History

2025-01-12 00:52:51 +08:00
/*****************************************************************************
S4Vectors C interface: prototypes
---------------------------------
The S4Vectors C interface is split in 2 files:
1. S4Vectors_defines.h (in this directory): contains the typedefs and
defines of the interface.
2. S4Vectors_interface.h (this file): contains the prototypes of the
S4Vectors C routines that are part of the interface.
*****************************************************************************/
#include "S4Vectors_defines.h"
/*
* Safe signed integer arithmetic.
* (see safe_arithm.c)
*/
void reset_ovflow_flag(void);
int get_ovflow_flag(void);
int safe_int_add(
int x,
int y
);
int safe_int_mult(
int x,
int y
);
int as_int(
const char *val,
int val_len
);
long long int safe_llint_add(
long long int x,
long long int y
);
long long int safe_llint_mult(
long long int x,
long long int y
);
/*
* Low-level sorting utilities.
* (see sort_utils.c)
*/
void sort_int_array(
int *x,
size_t nelt,
int desc
);
void get_order_of_int_array(
const int *x,
int nelt,
int desc,
int *out,
int out_shift
);
int sort_ints(
int *base,
int base_len,
const int *x,
int desc,
int use_radix,
unsigned short int *rxbuf1,
int *rxbuf2
);
void get_order_of_int_pairs(
const int *a,
const int *b,
int nelt,
int a_desc,
int b_desc,
int *out,
int out_shift
);
int sort_int_pairs(
int *base,
int base_len,
const int *a,
const int *b,
int a_desc,
int b_desc,
int use_radix,
unsigned short int *rxbuf1,
int *rxbuf2
);
void get_matches_of_ordered_int_pairs(
const int *a1,
const int *b1,
const int *o1,
int nelt1,
const int *a2,
const int *b2,
const int *o2,
int nelt2,
int nomatch,
int *out,
int out_shift
);
void get_order_of_int_quads(
const int *a,
const int *b,
const int *c,
const int *d,
int nelt,
int a_desc,
int b_desc,
int c_desc,
int d_desc,
int *out,
int out_shift
);
int sort_int_quads(
int *base,
int base_len,
const int *a,
const int *b,
const int *c,
const int *d,
int a_desc,
int b_desc,
int c_desc,
int d_desc,
int use_radix,
unsigned short int *rxbuf1,
int *rxbuf2
);
void get_matches_of_ordered_int_quads(
const int *a1,
const int *b1,
const int *c1,
const int *d1,
const int *o1,
int nelt1,
const int *a2,
const int *b2,
const int *c2,
const int *d2,
const int *o2,
int nelt2,
int nomatch,
int *out,
int out_shift
);
/*
* Hash table management.
* (see hash_utils.c)
*/
struct htab new_htab(int n);
int get_hbucket_val(
const struct htab *htab,
int bucket_idx
);
void set_hbucket_val(
struct htab *htab,
int bucket_idx,
int val
);
/*
* Low-level manipulation of the Auto-Extending buffers.
* (see AEbufs.c)
*/
size_t increase_buflength(size_t buflength);
size_t IntAE_get_nelt(const IntAE *ae);
size_t IntAE_set_nelt(
IntAE *ae,
size_t nelt
);
void IntAE_set_val(
const IntAE *ae,
int val
);
void IntAE_extend(
IntAE *ae,
size_t new_buflength
);
void IntAE_insert_at(
IntAE *ae,
size_t at,
int val
);
IntAE *new_IntAE(
size_t buflength,
size_t nelt,
int val
);
void IntAE_append(
IntAE *ae,
const int *newvals,
size_t nnewval
);
void IntAE_delete_at(
IntAE *ae,
size_t at,
size_t nelt
);
void IntAE_shift(
const IntAE *ae,
size_t offset,
int shift
);
void IntAE_sum_and_shift(
const IntAE *ae1,
const IntAE *ae2,
int shift
);
void IntAE_qsort(
const IntAE *ae,
size_t offset,
int desc
);
void IntAE_uniq(
IntAE *ae,
size_t offset
);
SEXP new_INTEGER_from_IntAE(const IntAE *ae);
SEXP new_LOGICAL_from_IntAE(const IntAE *ae);
IntAE *new_IntAE_from_INTEGER(SEXP x);
IntAE *new_IntAE_from_CHARACTER(
SEXP x,
int keyshift
);
size_t IntAEAE_get_nelt(const IntAEAE *aeae);
size_t IntAEAE_set_nelt(
IntAEAE *aeae,
size_t nelt
);
void IntAEAE_extend(
IntAEAE *aeae,
size_t new_buflength
);
void IntAEAE_insert_at(
IntAEAE *aeae,
size_t at,
IntAE *ae
);
IntAEAE *new_IntAEAE(
size_t buflength,
size_t nelt
);
void IntAEAE_pappend(
const IntAEAE *aeae1,
const IntAEAE *aeae2
);
void IntAEAE_shift(
const IntAEAE *aeae,
int shift
);
void IntAEAE_sum_and_shift(
const IntAEAE *aeae1,
const IntAEAE *aeae2,
int shift
);
SEXP new_LIST_from_IntAEAE(
const IntAEAE *aeae,
int mode
);
IntAEAE *new_IntAEAE_from_LIST(SEXP x);
SEXP IntAEAE_toEnvir(
const IntAEAE *aeae,
SEXP envir,
int keyshift
);
size_t IntPairAE_get_nelt(const IntPairAE *ae);
size_t IntPairAE_set_nelt(
IntPairAE *ae,
size_t nelt
);
void IntPairAE_extend(
IntPairAE *ae,
size_t new_buflength
);
void IntPairAE_insert_at(
IntPairAE *ae,
size_t at,
int a,
int b
);
IntPairAE *new_IntPairAE(
size_t buflength,
size_t nelt
);
size_t IntPairAEAE_get_nelt(const IntPairAEAE *aeae);
size_t IntPairAEAE_set_nelt(
IntPairAEAE *aeae,
size_t nelt
);
void IntPairAEAE_extend(
IntPairAEAE *aeae,
size_t new_buflength
);
void IntPairAEAE_insert_at(
IntPairAEAE *aeae,
size_t at,
IntPairAE *ae
);
IntPairAEAE *new_IntPairAEAE(
size_t buflength,
size_t nelt
);
size_t LLongAE_get_nelt(const LLongAE *ae);
size_t LLongAE_set_nelt(
LLongAE *ae,
size_t nelt
);
void LLongAE_set_val(
const LLongAE *ae,
long long val
);
void LLongAE_extend(
LLongAE *ae,
size_t new_buflength
);
void LLongAE_insert_at(
LLongAE *ae,
size_t at,
long long val
);
LLongAE *new_LLongAE(
size_t buflength,
size_t nelt,
long long val
);
size_t LLongAEAE_get_nelt(const LLongAEAE *aeae);
size_t LLongAEAE_set_nelt(
LLongAEAE *aeae,
size_t nelt
);
void LLongAEAE_extend(
LLongAEAE *aeae,
size_t new_buflength
);
void LLongAEAE_insert_at(
LLongAEAE *aeae,
size_t at,
LLongAE *ae
);
LLongAEAE *new_LLongAEAE(
size_t buflength,
size_t nelt
);
size_t DoubleAE_get_nelt(const DoubleAE *ae);
size_t DoubleAE_set_nelt(
DoubleAE *ae,
size_t nelt
);
void DoubleAE_set_val(
const DoubleAE *ae,
double val
);
void DoubleAE_extend(
DoubleAE *ae,
size_t new_buflength
);
void DoubleAE_insert_at(
DoubleAE *ae,
size_t at,
double val
);
DoubleAE *new_DoubleAE(
size_t buflength,
size_t nelt,
double val
);
void DoubleAE_append(
DoubleAE *ae,
const double *newvals,
size_t nnewval
);
void DoubleAE_delete_at(
DoubleAE *ae,
size_t at,
size_t nelt
);
SEXP new_NUMERIC_from_DoubleAE(const DoubleAE *ae);
DoubleAE *new_DoubleAE_from_NUMERIC(SEXP x);
size_t CharAE_get_nelt(const CharAE *ae);
size_t CharAE_set_nelt(
CharAE *ae,
size_t nelt
);
void CharAE_extend(
CharAE *ae,
size_t new_buflength
);
void CharAE_insert_at(
CharAE *ae,
size_t at,
char c
);
CharAE *new_CharAE(size_t buflength);
CharAE *new_CharAE_from_string(const char *string);
void CharAE_append_string(
CharAE *ae,
const char *string
);
void CharAE_delete_at(
CharAE *ae,
size_t at,
size_t nelt
);
SEXP new_CHARSXP_from_CharAE(const CharAE *ae);
SEXP new_RAW_from_CharAE(const CharAE *ae);
SEXP new_LOGICAL_from_CharAE(const CharAE *ae);
size_t CharAEAE_get_nelt(const CharAEAE *aeae);
size_t CharAEAE_set_nelt(
CharAEAE *aeae,
size_t nelt
);
void CharAEAE_extend(
CharAEAE *aeae,
size_t new_buflength
);
void CharAEAE_insert_at(
CharAEAE *aeae,
size_t at,
CharAE *ae
);
CharAEAE *new_CharAEAE(
size_t buflength,
size_t nelt
);
void CharAEAE_append_string(
CharAEAE *aeae,
const char *string
);
SEXP new_CHARACTER_from_CharAEAE(const CharAEAE *aeae);
/*
* SEXP_utils.c
*/
const char *get_classname(SEXP x);
/*
* LLint_class.c
*/
int is_LLint(SEXP x);
R_xlen_t get_LLint_length(SEXP x);
long long int *get_LLint_dataptr(SEXP x);
SEXP alloc_LLint(const char *classname, R_xlen_t length);
/*
* subsetting_utils.c
*/
long long int copy_vector_block(
SEXP dest,
long long int dest_offset,
SEXP src,
long long int src_offset,
long long int block_nelt
);
int copy_vector_positions(
SEXP dest,
int dest_offset,
SEXP src,
const int *pos,
int npos
);
int copy_vector_ranges(
SEXP dest,
int dest_offset,
SEXP src,
const int *start,
const int *width,
int nranges
);
/*
* vector_utils.c
*/
int vector_memcmp(
SEXP x1,
int x1_offset,
SEXP x2,
int x2_offset,
int nelt
);
SEXP list_as_data_frame(
SEXP x,
int nrow
);
/*
* integer_utils.c
*/
int check_integer_pairs(
SEXP a,
SEXP b,
const int **a_p,
const int **b_p,
const char *a_argname,
const char *b_argname
);
SEXP find_interv_and_start_from_width(
const int *x,
int x_len,
const int *width,
int width_len
);
/*
* raw_utils.c
*/
SEXP extract_bytes_by_positions(
const char *x,
int x_len,
const int *pos,
int npos,
int collapse,
SEXP lkup
);
SEXP extract_bytes_by_ranges(
const char *x,
int x_len,
const int *start,
const int *width,
int nranges,
int collapse,
SEXP lkup
);
/*
* Low-level manipulation of Hits objects.
* (see Hits_class.c)
*/
SEXP new_Hits(
const char *Class,
int *from,
const int *to,
int nhit,
int nLnode,
int nRnode,
int already_sorted
);
int get_select_mode(SEXP select);
/*
* Low-level manipulation of Rle objects.
* (see Rle_class.c)
*/
SEXP construct_logical_Rle(
R_xlen_t nrun_in,
const int *values_in,
const void *lengths_in,
int lengths_in_is_L
);
SEXP construct_integer_Rle(
R_xlen_t nrun_in,
const int *values_in,
const void *lengths_in,
int lengths_in_is_L
);
SEXP construct_numeric_Rle(
R_xlen_t nrun_in,
const double *values_in,
const void *lengths_in,
int lengths_in_is_L
);
SEXP construct_complex_Rle(
R_xlen_t nrun_in,
const Rcomplex *values_in,
const void *lengths_in,
int lengths_in_is_L
);
SEXP construct_character_Rle(
SEXP values_in,
const void *lengths_in,
int lengths_in_is_L
);
SEXP construct_raw_Rle(
R_xlen_t nrun_in,
const Rbyte *values_in,
const void *lengths_in,
int lengths_in_is_L
);
SEXP construct_Rle(
SEXP values_in,
const void *lengths_in,
int lengths_in_is_L
);
/*
* Low-level manipulation of Vector objects.
* (see List_class.c)
*/
const char *get_List_elementType(SEXP x);
void set_List_elementType(SEXP x, const char *type);
/*
* Low-level manipulation of SimpleList objects.
* (see SimpleList_class.c)
*/
SEXP new_SimpleList(const char *classname, SEXP listData);
/*
* Low-level manipulation of DataFrame objects.
* (see DataFrame_class.c)
*/
SEXP new_DataFrame(const char *classname, SEXP vars, SEXP rownames, SEXP nrows);