1 /* 2 # Fast methods for sorted integers 3 # (c) 2016 - 2017 Jens Oehlschägel 4 # Licence: GPL2 5 # Provided 'as is', use at your own risk 6 */ 7 8 #ifndef ALREADY_DEFINED_merge 9 #define ALREADY_DEFINED_merge 10 11 #include <R.h> 12 //#include <Rdefines.h> 13 #include <Rinternals.h> 14 15 #undef DEBUG 16 #define NDEBUG 1 17 // #define DEBUG 18 // #undef NDEBUG 19 20 typedef int IndexT; 21 typedef int ValueT; 22 typedef struct RangeIndexTStruct { 23 IndexT min; 24 IndexT max; 25 } RangeIndexT; 26 27 #define MALLOC(n,typ) (typ *) Calloc((n),typ) 28 #define FREE(x) Free(x) 29 30 #ifdef NDEBUG 31 #define assert(EX) ((void)0) 32 #define debugprint(...)((void)0) 33 #else 34 #define assert(EX) (void)((EX) || (error("assert(" #EX ") file %s line %d", __FILE__, __LINE__), 0)) 35 #define debugprint(...) {Rprintf( __VA_ARGS__); R_FlushConsole();} 36 #endif /* NDEBUG */ 37 38 #define ABS(X)(X) 39 #define LT(A,B) (ABS(A) < ABS(B)) 40 #define LE(A,B) (ABS(A) <= ABS(B)) 41 #define GT(A, B) LT((B), (A)) 42 #define GE(A, B) LE((B), (A)) 43 #define EQ(A,B) (ABS(A) == ABS(B)) 44 #define NE(A,B) (ABS(A) != ABS(B)) 45 46 #define MOVE(TO,FROM) TO=FROM; 47 #define EXCH(A,B,t) {MOVE(t,A) MOVE(A,B) MOVE(B,t)} 48 #define COMPEXCH(A,B,t) if (LT(B,A)) EXCH(A,B,t) 49 50 #define INSERTIONSORT_LIMIT 32 51 52 53 void int_merge_match(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c, IndexT nomatch); 54 void int_merge_in(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 55 void int_merge_notin(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 56 void int_merge_union_all(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 57 int int_merge_union_exact(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 58 int int_merge_union_unique(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 59 int int_merge_intersect_exact(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 60 int int_merge_intersect_unique(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 61 int int_merge_symdiff_exact(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 62 int int_merge_symdiff_unique(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 63 int int_merge_setdiff_exact(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 64 int int_merge_setdiff_unique(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 65 int int_merge_setequal_exact(ValueT *a, IndexT na, ValueT *b, IndexT nb); 66 int int_merge_setequal_unique(ValueT *a, IndexT na, ValueT *b, IndexT nb); 67 int int_merge_posdiff_exact(IndexT na, ValueT *b, IndexT nb, ValueT *c); 68 int int_merge_posdiff_unique(IndexT na, ValueT *b, IndexT nb, ValueT *c); 69 int int_merge_negdiff_exact(IndexT na, ValueT *b, IndexT nb, ValueT *c); 70 int int_merge_negdiff_unique(IndexT na, ValueT *b, IndexT nb, ValueT *c); 71 72 void int_merge_match_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c, IndexT nomatch); 73 void int_merge_in_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 74 void int_merge_notin_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 75 void int_merge_union_all_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 76 int int_merge_union_exact_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 77 int int_merge_union_unique_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 78 int int_merge_intersect_exact_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 79 int int_merge_intersect_unique_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 80 int int_merge_symdiff_exact_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 81 int int_merge_symdiff_unique_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 82 int int_merge_setdiff_exact_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 83 int int_merge_setdiff_unique_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 84 int int_merge_setequal_exact_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb); 85 int int_merge_setequal_unique_revab(ValueT *a, IndexT na, ValueT *b, IndexT nb); 86 int int_merge_posdiff_exact_revab(IndexT na, ValueT *b, IndexT nb, ValueT *c); 87 int int_merge_posdiff_unique_revab(IndexT na, ValueT *b, IndexT nb, ValueT *c); 88 int int_merge_negdiff_exact_revab(IndexT na, ValueT *b, IndexT nb, ValueT *c); 89 int int_merge_negdiff_unique_revab(IndexT na, ValueT *b, IndexT nb, ValueT *c); 90 91 void int_merge_match_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c, IndexT nomatch); 92 void int_merge_in_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 93 void int_merge_notin_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 94 void int_merge_union_all_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 95 int int_merge_union_exact_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 96 int int_merge_union_unique_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 97 int int_merge_intersect_exact_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 98 int int_merge_intersect_unique_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 99 int int_merge_symdiff_exact_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 100 int int_merge_symdiff_unique_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 101 int int_merge_setdiff_exact_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 102 int int_merge_setdiff_unique_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 103 int int_merge_setequal_exact_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb); 104 int int_merge_setequal_unique_reva(ValueT *a, IndexT na, ValueT *b, IndexT nb); 105 int int_merge_posdiff_exact_reva(IndexT na, ValueT *b, IndexT nb, ValueT *c); 106 int int_merge_posdiff_unique_reva(IndexT na, ValueT *b, IndexT nb, ValueT *c); 107 int int_merge_negdiff_exact_reva(IndexT na, ValueT *b, IndexT nb, ValueT *c); 108 int int_merge_negdiff_unique_reva(IndexT na, ValueT *b, IndexT nb, ValueT *c); 109 110 void int_merge_match_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c, IndexT nomatch); 111 void int_merge_in_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 112 void int_merge_notin_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 113 void int_merge_union_all_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 114 int int_merge_union_exact_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 115 int int_merge_union_unique_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 116 int int_merge_intersect_exact_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 117 int int_merge_intersect_unique_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 118 int int_merge_symdiff_exact_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 119 int int_merge_symdiff_unique_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 120 int int_merge_setdiff_exact_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 121 int int_merge_setdiff_unique_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb, ValueT *c); 122 int int_merge_setequal_exact_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb); 123 int int_merge_setequal_unique_revb(ValueT *a, IndexT na, ValueT *b, IndexT nb); 124 int int_merge_posdiff_exact_revb(IndexT na, ValueT *b, IndexT nb, ValueT *c); 125 int int_merge_posdiff_unique_revb(IndexT na, ValueT *b, IndexT nb, ValueT *c); 126 int int_merge_negdiff_exact_revb(IndexT na, ValueT *b, IndexT nb, ValueT *c); 127 int int_merge_negdiff_unique_revb(IndexT na, ValueT *b, IndexT nb, ValueT *c); 128 129 #endif 130