Changeset: 23f938b48bec for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=23f938b48bec
Modified Files:
        gdk/gdk_group.c
Branch: Feb2013
Log Message:

move type-switch out of loop


diffs (170 lines):

diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -99,47 +99,57 @@
 
 #define GRPhashloop(TYPE)                                              \
        do {                                                            \
-               v = BUNtail(bi, p);                                     \
-               if (gc) {                                               \
-                       prb = hash_##TYPE(hs, v);                       \
-                       for (hb = hs->hash[prb];                        \
-                            hb != BUN_NONE && grps[hb - r] == grps[p - r]; \
-                            hb = hs->link[hb]) {                       \
-                               if (*(TYPE *) v == *(TYPE *) BUNtail(bi, hb)){ \
-                                       ngrps[p - r] = ngrps[hb - r];   \
-                                       if (histo)                      \
-                                               cnts[ngrps[hb - r]]++;  \
-                                       break;                          \
-                               }                                       \
-                       }                                               \
-               } else if (grps) {                                      \
-                       BUN hv = hash_##TYPE(hs, v);                    \
-                       BUN hg = hash_oid(hs, &grps[p-r]);              \
-                       prb = ((hv << bits) ^ hg) & hs->mask;           \
-                       for (hb = hs->hash[prb];                        \
-                            hb != BUN_NONE;                            \
-                            hb = hs->link[hb]) {                       \
-                               if (grps[hb - r] == grps[p - r] &&      \
-                                   *(TYPE *) v == *(TYPE *) BUNtail(bi, hb)){ \
-                                       ngrps[p - r] = ngrps[hb - r];   \
-                                       if (histo)                      \
-                                               cnts[ngrps[hb - r]]++;  \
-                                       break;                          \
-                               }                                       \
-                       }                                               \
-               } else {                                                \
-                       prb = hash_##TYPE(hs, v);                       \
-                       for (hb = hs->hash[prb];                        \
-                            hb != BUN_NONE;                            \
-                            hb = hs->link[hb]) {                       \
-                               if (*(TYPE *) v == *(TYPE *) BUNtail(bi, hb)){ \
-                                       ngrps[p - r] = ngrps[hb - r];   \
-                                       if (histo)                      \
-                                               cnts[ngrps[hb - r]]++;  \
-                                       break;                          \
-                               }                                       \
-                       }                                               \
-               }                                                       \
+               TYPE *w = (TYPE *) Tloc(b, 0);                                  
\
+               for (r = BUNfirst(b), p = r, q = r + BATcount(b); p < q; p++) { 
\
+                       if (gc) {                                               
\
+                               prb = hash_##TYPE(hs, &w[p]);                   
\
+                               for (hb = hs->hash[prb];                        
\
+                                    hb != BUN_NONE &&                          
\
+                                     grps[hb - r] == grps[p - r];              
\
+                                    hb = hs->link[hb]) {                       
\
+                                       if (w[p] == w[hb]) {                    
\
+                                               ngrps[p - r] = ngrps[hb - r];   
\
+                                               if (histo)                      
\
+                                                       cnts[ngrps[hb - r]]++;  
\
+                                               break;                          
\
+                                       }                                       
\
+                               }                                               
\
+                       } else if (grps) {                                      
\
+                               BUN hv = hash_##TYPE(hs, &w[p]);                
\
+                               BUN hg = hash_oid(hs, &grps[p-r]);              
\
+                               prb = ((hv << bits) ^ hg) & hs->mask;           
\
+                               for (hb = hs->hash[prb];                        
\
+                                    hb != BUN_NONE;                            
\
+                                    hb = hs->link[hb]) {                       
\
+                                       if (grps[hb - r] == grps[p - r] &&      
\
+                                           w[p] == w[hb]) {                    
\
+                                               ngrps[p - r] = ngrps[hb - r];   
\
+                                               if (histo)                      
\
+                                                       cnts[ngrps[hb - r]]++;  
\
+                                               break;                          
\
+                                       }                                       
\
+                               }                                               
\
+                       } else {                                                
\
+                               prb = hash_##TYPE(hs, &w[p]);                   
\
+                               for (hb = hs->hash[prb];                        
\
+                                    hb != BUN_NONE;                            
\
+                                    hb = hs->link[hb]) {                       
\
+                                       if (w[p] == w[hb]) {                    
\
+                                               ngrps[p - r] = ngrps[hb - r];   
\
+                                               if (histo)                      
\
+                                                       cnts[ngrps[hb - r]]++;  
\
+                                               break;                          
\
+                                       }                                       
\
+                               }                                               
\
+                       }                                                       
\
+                       if (hb == BUN_NONE ||                                   
\
+                           (gc && grps[hb - r] != grps[p - r])) {              
\
+                               GRPnotfound;                                    
\
+                               /* enter new group into hash table */           
\
+                               hs->link[p] = hs->hash[prb];                    
\
+                               hs->hash[prb] = p;                              
\
+                       }                                                       
\
+               }                                                               
\
        } while (0)
 
 gdk_return
@@ -584,27 +594,27 @@ BATgroup_internal(BAT **groups, BAT **ex
                        goto error;
                }
 
-               for (r = BUNfirst(b), p = r, q = r + BATcount(b); p < q; p++) {
-                       switch (ATOMstorage(hs->type)) {
-                       case TYPE_bte:
-                               GRPhashloop(bte);
-                               break;
-                       case TYPE_sht:
-                               GRPhashloop(sht);
-                               break;
-                       case TYPE_int:
-                               GRPhashloop(int);
-                               break;
-                       case TYPE_lng:
-                               GRPhashloop(lng);
-                               break;
-                       case TYPE_flt:
-                               GRPhashloop(flt);
-                               break;
-                       case TYPE_dbl:
-                               GRPhashloop(dbl);
-                               break;
-                       default:
+               switch (ATOMstorage(hs->type)) {
+               case TYPE_bte:
+                       GRPhashloop(bte);
+                       break;
+               case TYPE_sht:
+                       GRPhashloop(sht);
+                       break;
+               case TYPE_int:
+                       GRPhashloop(int);
+                       break;
+               case TYPE_lng:
+                       GRPhashloop(lng);
+                       break;
+               case TYPE_flt:
+                       GRPhashloop(flt);
+                       break;
+               case TYPE_dbl:
+                       GRPhashloop(dbl);
+                       break;
+               default:
+                       for (r = BUNfirst(b), p = r, q = r + BATcount(b); p < 
q; p++) {
                                v = BUNtail(bi, p);
                                if (gc) {
                                        prb = hash_any(hs, v);
@@ -646,12 +656,12 @@ BATgroup_internal(BAT **groups, BAT **ex
                                                }
                                        }
                                }
-                       }
-                       if (hb == BUN_NONE || (gc && grps[hb - r] != grps[p - 
r])) {
-                               GRPnotfound;
-                               /* enter new group into hash table */
-                               hs->link[p] = hs->hash[prb];
-                               hs->hash[prb] = p;
+                               if (hb == BUN_NONE || (gc && grps[hb - r] != 
grps[p - r])) {
+                                       GRPnotfound;
+                                       /* enter new group into hash table */
+                                       hs->link[p] = hs->hash[prb];
+                                       hs->hash[prb] = p;
+                               }
                        }
                }
                if (hp->storage == STORE_MEM)
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to