Changeset: ac4d2dd9fb12 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ac4d2dd9fb12
Modified Files:
        gdk/gdk_analytic.c
Branch: analytics
Log Message:

Continuing the code cleanup.

The range overlap now becomes easier to implement.


diffs (truncated from 1742 to 300 lines):

diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -38,10 +38,10 @@ gdk_return
 GDKanalyticaldiff(BAT *r, BAT *b, BAT *c, int tpe)
 {
        BUN i, cnt = BATcount(b);
-       bit *rb = (bit*)Tloc(r, 0), *rp = c ? (bit*)Tloc(c, 0) : NULL;
+       bit *restrict rb = (bit*)Tloc(r, 0), *restrict rp = c ? (bit*)Tloc(c, 
0) : NULL;
        int (*atomcmp)(const void *, const void *);
 
-       switch(ATOMstorage(tpe)) {
+       switch(tpe) {
                case TYPE_bit:
                        ANALYTICAL_DIFF_IMP(bit)
                        break;
@@ -266,8 +266,8 @@ GDKanalyticalfirst(BAT *r, BAT *b, BAT *
        bit *np, *pnp, *end;
        gdk_return gdk_res = GDK_SUCCEED;
 
-       (void)o;
-       switch(ATOMstorage(tpe)) {
+       (void) o;
+       switch(tpe) {
                case TYPE_bit:
                        ANALYTICAL_FIRST_IMP(bit)
                        break;
@@ -386,8 +386,8 @@ GDKanalyticallast(BAT *r, BAT *b, BAT *p
        bit *np, *pnp, *end;
        gdk_return gdk_res = GDK_SUCCEED;
 
-       (void)o;
-       switch(ATOMstorage(tpe)) {
+       (void) o;
+       switch(tpe) {
                case TYPE_bit:
                        ANALYTICAL_LAST_IMP(bit)
                        break;
@@ -877,7 +877,7 @@ finish:
 #undef LEAD_CALC
 #undef ANALYTICAL_LEAD_OTHERS
 
-#define ANALYTICAL_LIMIT_IMP_NO_OVERLAP(TPE, IMP) \
+#define ANALYTICAL_MIN_MAX_IMP_NO_OVERLAP(TPE, IMP) \
        do {                                          \
                curval = *pbp;                            \
                pbp++;                                    \
@@ -896,7 +896,7 @@ finish:
                        has_nils = true;                      \
        } while(0);
 
-#define ANALYTICAL_LIMIT_IMP_OVERLAP(TPE, IMP)        \
+#define ANALYTICAL_MIN_MAX_IMP_ROWS(TPE, IMP)         \
        do {                                              \
                TPE *bs, *bl, *be;                            \
                bl = pbp;                                     \
@@ -921,7 +921,7 @@ finish:
                }                                             \
        } while(0);
 
-#define ANALYTICAL_LIMIT_IMP(TPE, IMP, REAL)       \
+#define ANALYTICAL_MIN_MAX_CALC(TPE, IMP, REAL)    \
        do {                                           \
                TPE *rp, *rb, *pbp, *bp, *rend, curval, v; \
                rb = rp = (TPE*)Tloc(r, 0);                \
@@ -959,15 +959,15 @@ finish:
        } while(0);
 
 #ifdef HAVE_HUGE
-#define ANALYTICAL_LIMIT_IMP_HUGE(IMP, REAL) \
-       case TYPE_hge:                           \
-               ANALYTICAL_LIMIT_IMP(hge, IMP, REAL) \
+#define ANALYTICAL_MIN_MAX_LIMIT(IMP, REAL)     \
+       case TYPE_hge:                              \
+               ANALYTICAL_MIN_MAX_CALC(hge, IMP, REAL) \
        break;
 #else
-#define ANALYTICAL_LIMIT_IMP_HUGE(IMP, REAL)
+#define ANALYTICAL_MIN_MAX_LIMIT(IMP, REAL)
 #endif
 
-#define ANALYTICAL_LIMIT_IMP_OTHERS_NO_OVERLAP(SIGN_OP)                       \
+#define ANALYTICAL_MIN_MAX_OTHERS_IMP_NO_OVERLAP(SIGN_OP)                     \
        do {                                                                    
  \
                l = j;                                                          
      \
                curval = BUNtail(bpi, j);                                       
      \
@@ -990,7 +990,7 @@ finish:
                        has_nils = true;                                        
          \
        } while(0);
 
-#define ANALYTICAL_LIMIT_IMP_OTHERS_OVERLAP(SIGN_OP)                           
   \
+#define ANALYTICAL_MIN_MAX_OTHERS_IMP_ROWS(SIGN_OP)                            
   \
        do {                                                                    
      \
                m = k;                                                          
          \
                for(;k<i;k++) {                                                 
          \
@@ -1014,7 +1014,7 @@ finish:
                }                                                               
          \
        } while(0);
 
-#define ANALYTICAL_LIMIT_IMP_OTHERS(SIGN_OP, REAL)                        \
+#define ANALYTICAL_MIN_MAX_OTHERS_CALC(SIGN_OP, REAL)                     \
        do {                                                                  \
                BATiter bpi = bat_iterator(b);                                  
  \
                void *restrict curval = BUNtail(bpi, 0);                        
  \
@@ -1046,98 +1046,77 @@ finish:
                }                                                               
  \
        } while(0);
 
-#define ANALYTICAL_LIMIT(OP, IMP, SIGN_OP)                                     
              \
-gdk_return                                                                     
              \
+#define ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, FRAME) \
+       switch(tpe) { \
+               case TYPE_bit: \
+                       ANALYTICAL_MIN_MAX_CALC(bit, IMP, 
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+                       break; \
+               case TYPE_bte: \
+                       ANALYTICAL_MIN_MAX_CALC(bte, IMP, 
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+                       break; \
+               case TYPE_sht: \
+                       ANALYTICAL_MIN_MAX_CALC(sht, IMP, 
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+                       break; \
+               case TYPE_int: \
+                       ANALYTICAL_MIN_MAX_CALC(int, IMP, 
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+                       break; \
+               case TYPE_lng: \
+                       ANALYTICAL_MIN_MAX_CALC(lng, IMP, 
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+                       break; \
+               ANALYTICAL_MIN_MAX_LIMIT(IMP, ANALYTICAL_MIN_MAX_IMP##FRAME) \
+               case TYPE_flt: \
+                       ANALYTICAL_MIN_MAX_CALC(flt, IMP, 
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+                       break; \
+               case TYPE_dbl: \
+                       ANALYTICAL_MIN_MAX_CALC(dbl, IMP, 
ANALYTICAL_MIN_MAX_IMP##FRAME) \
+                       break; \
+               default: \
+                       ANALYTICAL_MIN_MAX_OTHERS_CALC(SIGN_OP, 
ANALYTICAL_MIN_MAX_OTHERS_IMP##FRAME) \
+       }
+
+#define ANALYTICAL_MIN_MAX(OP, IMP, SIGN_OP) \
+gdk_return \
 GDKanalytical##OP(BAT *r, BAT *b, BAT *p, BAT *o, bit force_order, int tpe, 
BUN start, BUN end) \
-{                                                                              
              \
-       int (*atomcmp)(const void *, const void *);                             
                 \
-       const void* restrict nil;                                               
                 \
-       bool has_nils = false;                                                  
                 \
-       BUN i = 0, j = 0, l = 0, k = 0, m = 0, ncnt, cnt = BATcount(b);         
                 \
-       bit *np, *pnp, *nend;                                                   
                 \
-       gdk_return gdk_res = GDK_SUCCEED;                                       
                 \
-                                                                               
              \
-       if(start == 0 && end == 0) {                                            
                 \
-               switch(ATOMstorage(tpe)) {                                      
                     \
-                       case TYPE_bit:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(bit, IMP, 
ANALYTICAL_LIMIT_IMP_NO_OVERLAP)              \
-                               break;                                          
                             \
-                       case TYPE_bte:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(bte, IMP, 
ANALYTICAL_LIMIT_IMP_NO_OVERLAP)              \
-                               break;                                          
                             \
-                       case TYPE_sht:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(sht, IMP, 
ANALYTICAL_LIMIT_IMP_NO_OVERLAP)              \
-                               break;                                          
                             \
-                       case TYPE_int:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(int, IMP, 
ANALYTICAL_LIMIT_IMP_NO_OVERLAP)              \
-                               break;                                          
                             \
-                       case TYPE_lng:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(lng, IMP, 
ANALYTICAL_LIMIT_IMP_NO_OVERLAP)              \
-                               break;                                          
                             \
-                       ANALYTICAL_LIMIT_IMP_HUGE(IMP, 
ANALYTICAL_LIMIT_IMP_NO_OVERLAP)                  \
-                       case TYPE_flt:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(flt, IMP, 
ANALYTICAL_LIMIT_IMP_NO_OVERLAP)              \
-                               break;                                          
                             \
-                       case TYPE_dbl:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(dbl, IMP, 
ANALYTICAL_LIMIT_IMP_NO_OVERLAP)              \
-                               break;                                          
                             \
-                       default:                                                
                         \
-                               ANALYTICAL_LIMIT_IMP_OTHERS(SIGN_OP, 
ANALYTICAL_LIMIT_IMP_OTHERS_NO_OVERLAP) \
-               }                                                               
                     \
-       } else {                                                                
                 \
-               switch(ATOMstorage(tpe)) {                                      
                     \
-                       case TYPE_bit:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(bit, IMP, 
ANALYTICAL_LIMIT_IMP_OVERLAP)                 \
-                               break;                                          
                             \
-                       case TYPE_bte:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(bte, IMP, 
ANALYTICAL_LIMIT_IMP_OVERLAP)                 \
-                               break;                                          
                             \
-                       case TYPE_sht:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(sht, IMP, 
ANALYTICAL_LIMIT_IMP_OVERLAP)                 \
-                               break;                                          
                             \
-                       case TYPE_int:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(int, IMP, 
ANALYTICAL_LIMIT_IMP_OVERLAP)                 \
-                               break;                                          
                             \
-                       case TYPE_lng:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(lng, IMP, 
ANALYTICAL_LIMIT_IMP_OVERLAP)                 \
-                               break;                                          
                             \
-                       ANALYTICAL_LIMIT_IMP_HUGE(IMP, 
ANALYTICAL_LIMIT_IMP_OVERLAP)                     \
-                       case TYPE_flt:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(flt, IMP, 
ANALYTICAL_LIMIT_IMP_OVERLAP)                 \
-                               break;                                          
                             \
-                       case TYPE_dbl:                                          
                         \
-                               ANALYTICAL_LIMIT_IMP(dbl, IMP, 
ANALYTICAL_LIMIT_IMP_OVERLAP)                 \
-                               break;                                          
                             \
-                       default:                                                
                         \
-                               ANALYTICAL_LIMIT_IMP_OTHERS(SIGN_OP, 
ANALYTICAL_LIMIT_IMP_OTHERS_OVERLAP)    \
-               }                                                               
                     \
-       }                                                                       
                 \
-finish:                                                                        
              \
-       BATsetcount(r, cnt);                                                    
                 \
-       r->tnonil = !has_nils;                                                  
                 \
-       r->tnil = has_nils;                                                     
                 \
-       return gdk_res;                                                         
                 \
+{ \
+       int (*atomcmp)(const void *, const void *); \
+       const void* restrict nil; \
+       bool has_nils = false; \
+       BUN i = 0, j = 0, l = 0, k = 0, m = 0, ncnt, cnt = BATcount(b); \
+       bit *np, *pnp, *nend; \
+       gdk_return gdk_res = GDK_SUCCEED; \
+ \
+       if(start == 0 && end == 0) { \
+               ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, _NO_OVERLAP) \
+       } else { \
+               ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, _ROWS) \
+       } \
+finish: \
+       BATsetcount(r, cnt); \
+       r->tnonil = !has_nils; \
+       r->tnil = has_nils; \
+       return gdk_res; \
 }
 
-ANALYTICAL_LIMIT(min, MIN, >)
-ANALYTICAL_LIMIT(max, MAX, <)
+ANALYTICAL_MIN_MAX(min, MIN, >)
+ANALYTICAL_MIN_MAX(max, MAX, <)
 
-#undef ANALYTICAL_LIMIT
-#undef ANALYTICAL_LIMIT_IMP_HUGE
-#undef ANALYTICAL_LIMIT_IMP
-#undef ANALYTICAL_LIMIT_IMP_OVERLAP
-#undef ANALYTICAL_LIMIT_IMP_NO_OVERLAP
-#undef ANALYTICAL_LIMIT_IMP_OTHERS
-#undef ANALYTICAL_LIMIT_IMP_OTHERS_OVERLAP
-#undef ANALYTICAL_LIMIT_IMP_OTHERS_NO_OVERLAP
+#undef ANALYTICAL_MIN_MAX_CALC
+#undef ANALYTICAL_MIN_MAX_IMP_ROWS
+#undef ANALYTICAL_MIN_MAX_IMP_NO_OVERLAP
+#undef ANALYTICAL_MIN_MAX_OTHERS_CALC
+#undef ANALYTICAL_MIN_MAX_OTHERS_IMP_ROWS
+#undef ANALYTICAL_MIN_MAX_OTHERS_IMP_NO_OVERLAP
+#undef ANALYTICAL_MIN_MAX
+#undef ANALYTICAL_MIN_MAX_BRANCHES
+#undef ANALYTICAL_MIN_MAX_LIMIT
 
-#define ANALYTICAL_COUNT_IGNORE_NILS_NO_OVERLAP \
-       do {                                        \
-               for (;rb < rp; rb++)                    \
-                       *rb = curval;                       \
+#define ANALYTICAL_COUNT_IGNORE_NILS_IMP_NO_OVERLAP \
+       do {                                            \
+               for (;rb < rp; rb++)                        \
+                       *rb = curval;                           \
        } while(0);
 
-#define ANALYTICAL_COUNT_IGNORE_NILS_OVERLAP        \
+#define ANALYTICAL_COUNT_IGNORE_NILS_IMP_ROWS       \
        do {                                            \
                lng *rs = rb, *fs, *fe;                     \
                for(; rb<rp;rb++) {                         \
@@ -1147,32 +1126,32 @@ ANALYTICAL_LIMIT(max, MAX, <)
                }                                           \
        } while(0);
 
-#define ANALYTICAL_COUNT_IGNORE_NILS_IMP(IMP) \
-       do {                                      \
-               lng *rp, *rb, curval = 0;             \
-               rb = rp = (lng*)Tloc(r, 0);           \
-               if (p) {                              \
-                       np = pnp = (bit*)Tloc(p, 0);      \
-                       nend = np + cnt;                  \
-                       for(; np < nend; np++) {          \
-                               if (*np) {                    \
-                                       curval = np - pnp;        \
-                                       rp += curval;             \
-                                       IMP                       \
-                                       pnp = np;                 \
-                               }                             \
-                       }                                 \
-                       curval = np - pnp;                \
-                       rp += curval;                     \
-                       IMP                               \
-               } else {                              \
-                       curval = cnt;                     \
-                       rp += curval;                     \
-                       IMP                               \
-               }                                     \
+#define ANALYTICAL_COUNT_IGNORE_NILS_CALC(FRAME)            \
+       do {                                                    \
+               lng *rp, *rb, curval = 0;                           \
+               rb = rp = (lng*)Tloc(r, 0);                         \
+               if (p) {                                            \
+                       np = pnp = (bit*)Tloc(p, 0);                    \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to