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