Changeset: 64196817100d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=64196817100d
Modified Files:
        clients/Tests/exports.stable.out
        monetdb5/modules/atoms/mtime.c
Branch: mtime
Log Message:

Reduce code size by using some macros.


diffs (truncated from 1179 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1485,34 +1485,34 @@ str MTIMEdate_add_msec_interval(date *re
 str MTIMEdate_addmonths(date *ret, const date *d, const int *m);
 str MTIMEdate_date(date *dst, const date *src);
 str MTIMEdate_diff(int *ret, const date *v1, const date *v2);
-str MTIMEdate_diff_bulk(bat *ret, bat *bid1, bat *bid2);
-str MTIMEdate_extract_century(int *ret, const date *d);
-str MTIMEdate_extract_century_bulk(bat *ret, bat *bid);
-str MTIMEdate_extract_day(int *ret, const date *d);
-str MTIMEdate_extract_day_bulk(bat *ret, bat *bid);
+str MTIMEdate_diff_bulk(bat *ret, const bat *bid1, const bat *bid2);
+str MTIMEdate_extract_century(int *ret, const date *src);
+str MTIMEdate_extract_century_bulk(bat *ret, const bat *bid);
+str MTIMEdate_extract_day(int *ret, const date *src);
+str MTIMEdate_extract_day_bulk(bat *ret, const bat *bid);
 str MTIMEdate_extract_dayofweek(int *ret, const date *d);
 str MTIMEdate_extract_dayofyear(int *ret, const date *d);
-str MTIMEdate_extract_decade(int *ret, const date *d);
-str MTIMEdate_extract_decade_bulk(bat *ret, bat *bid);
-str MTIMEdate_extract_month(int *ret, const date *d);
-str MTIMEdate_extract_month_bulk(bat *ret, bat *bid);
-str MTIMEdate_extract_quarter(int *ret, const date *d);
-str MTIMEdate_extract_quarter_bulk(bat *ret, bat *bid);
+str MTIMEdate_extract_decade(int *ret, const date *src);
+str MTIMEdate_extract_decade_bulk(bat *ret, const bat *bid);
+str MTIMEdate_extract_month(int *ret, const date *src);
+str MTIMEdate_extract_month_bulk(bat *ret, const bat *bid);
+str MTIMEdate_extract_quarter(int *ret, const date *src);
+str MTIMEdate_extract_quarter_bulk(bat *ret, const bat *bid);
 str MTIMEdate_extract_weekofyear(int *ret, const date *d);
-str MTIMEdate_extract_year(int *ret, const date *d);
-str MTIMEdate_extract_year_bulk(bat *ret, bat *bid);
+str MTIMEdate_extract_year(int *ret, const date *src);
+str MTIMEdate_extract_year_bulk(bat *ret, const bat *bid);
 str MTIMEdate_fromstr(date *ret, const char *const *s);
 str MTIMEdate_sub_msec_interval(date *ret, const date *d, const lng *ms);
 str MTIMEdate_submonths(date *ret, const date *d, const int *m);
 str MTIMEdate_to_str(str *ret, const date *d, const char *const *format);
 str MTIMEdaytime_daytime(daytime *dst, const daytime *src);
 str MTIMEdaytime_diff_msec(lng *ret, const daytime *t1, const daytime *t2);
-str MTIMEdaytime_extract_hours(int *ret, const daytime *t);
-str MTIMEdaytime_extract_hours_bulk(bat *ret, bat *bid);
-str MTIMEdaytime_extract_minutes(int *ret, const daytime *t);
-str MTIMEdaytime_extract_minutes_bulk(bat *ret, bat *bid);
-str MTIMEdaytime_extract_sql_seconds(int *ret, const daytime *t);
-str MTIMEdaytime_extract_sql_seconds_bulk(bat *ret, bat *bid);
+str MTIMEdaytime_extract_hours(int *ret, const daytime *src);
+str MTIMEdaytime_extract_hours_bulk(bat *ret, const bat *bid);
+str MTIMEdaytime_extract_minutes(int *ret, const daytime *src);
+str MTIMEdaytime_extract_minutes_bulk(bat *ret, const bat *bid);
+str MTIMEdaytime_extract_sql_seconds(int *ret, const daytime *src);
+str MTIMEdaytime_extract_sql_seconds_bulk(bat *ret, const bat *bid);
 str MTIMEdaytime_fromseconds(daytime *ret, const lng *secs);
 str MTIMEdaytime_fromseconds_bulk(bat *ret, bat *bid);
 str MTIMEdaytime_fromstr(daytime *ret, const char *const *s);
@@ -1536,25 +1536,25 @@ str MTIMEtimestamp_add_msec_interval(tim
 str MTIMEtimestamp_century(int *ret, const timestamp *t);
 str MTIMEtimestamp_day(int *ret, const timestamp *t);
 str MTIMEtimestamp_decade(int *ret, const timestamp *t);
-str MTIMEtimestamp_diff_msec(lng *ret, const timestamp *t1, const timestamp 
*t2);
-str MTIMEtimestamp_diff_msec_bulk(bat *ret, bat *bid1, bat *bid2);
-str MTIMEtimestamp_extract_date(date *ret, const timestamp *t);
-str MTIMEtimestamp_extract_date_bulk(bat *ret, bat *bid);
-str MTIMEtimestamp_extract_daytime(daytime *ret, const timestamp *t);
-str MTIMEtimestamp_extract_daytime_bulk(bat *ret, bat *bid);
-str MTIMEtimestamp_fromdate(timestamp *ret, const date *d);
-str MTIMEtimestamp_fromdate_bulk(bat *ret, bat *bid);
-str MTIMEtimestamp_frommsec(timestamp *ret, const lng *msecs);
-str MTIMEtimestamp_frommsec_bulk(bat *ret, bat *bid);
-str MTIMEtimestamp_fromsecond(timestamp *ret, const int *secs);
-str MTIMEtimestamp_fromsecond_bulk(bat *ret, bat *bid);
+str MTIMEtimestamp_diff_msec(lng *ret, const timestamp *v1, const timestamp 
*v2);
+str MTIMEtimestamp_diff_msec_bulk(bat *ret, const bat *bid1, const bat *bid2);
+str MTIMEtimestamp_extract_date(date *ret, const timestamp *src);
+str MTIMEtimestamp_extract_date_bulk(bat *ret, const bat *bid);
+str MTIMEtimestamp_extract_daytime(daytime *ret, const timestamp *src);
+str MTIMEtimestamp_extract_daytime_bulk(bat *ret, const bat *bid);
+str MTIMEtimestamp_fromdate(timestamp *ret, const date *src);
+str MTIMEtimestamp_fromdate_bulk(bat *ret, const bat *bid);
+str MTIMEtimestamp_frommsec(timestamp *ret, const lng *src);
+str MTIMEtimestamp_frommsec_bulk(bat *ret, const bat *bid);
+str MTIMEtimestamp_fromsecond(timestamp *ret, const int *src);
+str MTIMEtimestamp_fromsecond_bulk(bat *ret, const bat *bid);
 str MTIMEtimestamp_fromstr(timestamp *ret, const char *const *s);
 str MTIMEtimestamp_hours(int *ret, const timestamp *t);
 str MTIMEtimestamp_minutes(int *ret, const timestamp *t);
 str MTIMEtimestamp_month(int *ret, const timestamp *t);
 str MTIMEtimestamp_quarter(int *ret, const timestamp *t);
-str MTIMEtimestamp_sql_seconds(int *ret, const timestamp *t);
-str MTIMEtimestamp_sql_seconds_bulk(bat *ret, bat *bid);
+str MTIMEtimestamp_sql_seconds(int *ret, const timestamp *src);
+str MTIMEtimestamp_sql_seconds_bulk(bat *ret, const bat *bid);
 str MTIMEtimestamp_sub_month_interval(timestamp *ret, const timestamp *t, 
const int *m);
 str MTIMEtimestamp_sub_msec_interval(timestamp *ret, const timestamp *t, const 
lng *ms);
 str MTIMEtimestamp_timestamp(timestamp *dst, const timestamp *src);
diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c
--- a/monetdb5/modules/atoms/mtime.c
+++ b/monetdb5/modules/atoms/mtime.c
@@ -43,15 +43,22 @@ extern char *strptime(const char *, cons
 #define DTMONTH_WIDTH  21              /* enough for 174762 years */
 #define DTMONTH_SHIFT  (DTDAY_WIDTH+DTDAY_SHIFT)
 #define isdate(y, m, d)        ((m) > 0 && (m) <= 12 && (d) > 0 && (y) >= 
YEAR_MIN && (y) <= YEAR_MAX && (d) <= monthdays(y, m))
-#define mkdate(y, m, d)        (((((y) + YEAR_OFFSET) * 12 + (m) - 1) << 
DTMONTH_SHIFT) \
-                                                | ((d) << DTDAY_SHIFT))
-#define date_extract_day(dt)   (((dt) >> DTDAY_SHIFT) & ((1 << DTDAY_WIDTH) - 
1))
-#define date_extract_month(dt) ((((dt) >> DTMONTH_SHIFT) & ((1 << 
DTMONTH_WIDTH) - 1)) % 12 + 1)
-#define date_extract_year(dt)  ((((dt) >> DTMONTH_SHIFT) & ((1 << 
DTMONTH_WIDTH) - 1)) / 12 - YEAR_OFFSET)
+#define mkdate(y, m, d)        ((date) (((uint32_t) (((y) + YEAR_OFFSET) * 12 
+ (m) - 1) << DTMONTH_SHIFT) \
+                                                                | ((uint32_t) 
(d) << DTDAY_SHIFT)))
+#define date_extract_day(dt)   ((int) (((uint32_t) (dt) >> DTDAY_SHIFT) & ((1 
<< DTDAY_WIDTH) - 1)))
+#define date_extract_month(dt) ((int) ((((uint32_t) (dt) >> DTMONTH_SHIFT) & 
((1 << DTMONTH_WIDTH) - 1)) % 12 + 1))
+#define date_extract_year(dt)  ((int) ((((uint32_t) (dt) >> DTMONTH_SHIFT) & 
((1 << DTMONTH_WIDTH) - 1)) / 12 - YEAR_OFFSET))
+#define date_extract_century(dt)       (date_extract_year(dt) > 0 ? 
(date_extract_year(dt) - 1) / 100 + 1 : -((-date_extract_year(dt) - 1) / 100 + 
1))
+#define date_extract_decade(dt)                (date_extract_year(dt) / 10)
+#define date_extract_quarter(dt)       ((date_extract_month(dt) - 1) / 3 + 1)
 
 #define istime(h,m,s,u)        ((h) >= 0 && (h) < 24 && (m) >= 0 && (m) < 60 
&& (s) >= 0 && (s) <= 60 && (u) >= 0 && (u) < 1000000)
 #define mkdaytime(h,m,s,u)     (((((daytime) (h) * 60 + (m)) * 60) + (s)) * 
LL_CONSTANT(1000000) + (u))
 
+#define daytime_extract_hour(tm)       ((int) (tm / HOUR_USEC))
+#define daytime_extract_minute(tm)     ((int) ((tm / 60000000) % 60))
+#define daytime_extract_usecond(tm)    ((int) (tm % 60000000)) /* includes 
seconds */
+
 #define TSTIME_WIDTH   37              /* [0..24*60*60*1000000) */
 #define TSTIME_SHIFT   0
 #define TSDATE_WIDTH   (DTDAY_WIDTH+DTMONTH_WIDTH)
@@ -263,7 +270,7 @@ daytime_hour(daytime tm)
 {
        if (is_daytime_nil(tm))
                return int_nil;
-       return (int) (tm / HOUR_USEC);
+       return daytime_extract_hour(tm);
 }
 
 int
@@ -271,7 +278,7 @@ daytime_min(daytime tm)
 {
        if (is_daytime_nil(tm))
                return int_nil;
-       return (int) ((tm / 60000000) % 60);
+       return daytime_extract_minute(tm);
 }
 
 int
@@ -295,7 +302,7 @@ daytime_sec_usec(daytime tm)
 {
        if (is_daytime_nil(tm))
                return int_nil;
-       return (int) (tm % 60000000);
+       return daytime_extract_usecond(tm);
 }
 
 daytime
@@ -991,8 +998,6 @@ mal_export str MTIMEprelude(void *ret);
 mal_export str MTIMEcurrent_date(date *ret);
 mal_export str MTIMEcurrent_time(daytime *ret);
 mal_export str MTIMEcurrent_timestamp(timestamp *ret);
-mal_export str MTIMEdate_diff(int *ret, const date *v1, const date *v2);
-mal_export str MTIMEdate_diff_bulk(bat *ret, bat *bid1, bat *bid2);
 mal_export str MTIMEdate_sub_msec_interval(date *ret, const date *d, const lng 
*ms);
 mal_export str MTIMEdate_add_msec_interval(date *ret, const date *d, const lng 
*ms);
 mal_export str MTIMEtimestamp_sub_msec_interval(timestamp *ret, const 
timestamp *t, const lng *ms);
@@ -1002,31 +1007,11 @@ mal_export str MTIMEtimestamp_add_month_
 mal_export str MTIMEtime_sub_msec_interval(daytime *ret, const daytime *t, 
const lng *ms);
 mal_export str MTIMEtime_add_msec_interval(daytime *ret, const daytime *t, 
const lng *ms);
 mal_export str MTIMEdaytime_diff_msec(lng *ret, const daytime *t1, const 
daytime *t2);
-mal_export str MTIMEtimestamp_diff_msec_bulk(bat *ret, bat *bid1, bat *bid2);
 mal_export str MTIMEdate_submonths(date *ret, const date *d, const int *m);
 mal_export str MTIMEdate_addmonths(date *ret, const date *d, const int *m);
-mal_export str MTIMEdate_extract_century(int *ret, const date *d);
-mal_export str MTIMEdate_extract_century_bulk(bat *ret, bat *bid);
-mal_export str MTIMEdate_extract_decade(int *ret, const date *d);
-mal_export str MTIMEdate_extract_decade_bulk(bat *ret, bat *bid);
-mal_export str MTIMEdate_extract_year(int *ret, const date *d);
-mal_export str MTIMEdate_extract_year_bulk(bat *ret, bat *bid);
-mal_export str MTIMEdate_extract_quarter(int *ret, const date *d);
-mal_export str MTIMEdate_extract_quarter_bulk(bat *ret, bat *bid);
-mal_export str MTIMEdate_extract_month(int *ret, const date *d);
-mal_export str MTIMEdate_extract_month_bulk(bat *ret, bat *bid);
-mal_export str MTIMEdate_extract_day(int *ret, const date *d);
-mal_export str MTIMEdate_extract_day_bulk(bat *ret, bat *bid);
-mal_export str MTIMEdaytime_extract_hours(int *ret, const daytime *t);
-mal_export str MTIMEdaytime_extract_hours_bulk(bat *ret, bat *bid);
-mal_export str MTIMEdaytime_extract_minutes(int *ret, const daytime *t);
-mal_export str MTIMEdaytime_extract_minutes_bulk(bat *ret, bat *bid);
-mal_export str MTIMEdaytime_extract_sql_seconds(int *ret, const daytime *t);
-mal_export str MTIMEdaytime_extract_sql_seconds_bulk(bat *ret, bat *bid);
 mal_export str MTIMEdate_extract_dayofyear(int *ret, const date *d);
 mal_export str MTIMEdate_extract_weekofyear(int *ret, const date *d);
 mal_export str MTIMEdate_extract_dayofweek(int *ret, const date *d);
-mal_export str MTIMEtimestamp_diff_msec(lng *ret, const timestamp *t1, const 
timestamp *t2);
 mal_export str MTIMEtimestamp_century(int *ret, const timestamp *t);
 mal_export str MTIMEtimestamp_decade(int *ret, const timestamp *t);
 mal_export str MTIMEtimestamp_year(int *ret, const timestamp *t);
@@ -1035,8 +1020,6 @@ mal_export str MTIMEtimestamp_month(int 
 mal_export str MTIMEtimestamp_day(int *ret, const timestamp *t);
 mal_export str MTIMEtimestamp_hours(int *ret, const timestamp *t);
 mal_export str MTIMEtimestamp_minutes(int *ret, const timestamp *t);
-mal_export str MTIMEtimestamp_sql_seconds(int *ret, const timestamp *t);
-mal_export str MTIMEtimestamp_sql_seconds_bulk(bat *ret, bat *bid);
 mal_export str MTIMEsql_year(int *ret, const int *months);
 mal_export str MTIMEsql_month(int *ret, const int *months);
 mal_export str MTIMEsql_day(lng *ret, const lng *msecs);
@@ -1046,23 +1029,13 @@ mal_export str MTIMEsql_seconds(int *ret
 
 mal_export str MTIMEdate_fromstr(date *ret, const char *const *s);
 mal_export str MTIMEdate_date(date *dst, const date *src);
-mal_export str MTIMEtimestamp_extract_date(date *ret, const timestamp *t);
-mal_export str MTIMEtimestamp_extract_date_bulk(bat *ret, bat *bid);
 mal_export str MTIMEtimestamp_fromstr(timestamp *ret, const char *const *s);
 mal_export str MTIMEtimestamp_timestamp(timestamp *dst, const timestamp *src);
-mal_export str MTIMEtimestamp_fromdate(timestamp *ret, const date *d);
-mal_export str MTIMEtimestamp_fromdate_bulk(bat *ret, bat *bid);
 mal_export str MTIMEseconds_since_epoch(int *ret, const timestamp *t);
-mal_export str MTIMEtimestamp_fromsecond(timestamp *ret, const int *secs);
-mal_export str MTIMEtimestamp_fromsecond_bulk(bat *ret, bat *bid);
-mal_export str MTIMEtimestamp_frommsec(timestamp *ret, const lng *msecs);
-mal_export str MTIMEtimestamp_frommsec_bulk(bat *ret, bat *bid);
 mal_export str MTIMEdaytime_fromstr(daytime *ret, const char *const *s);
 mal_export str MTIMEdaytime_daytime(daytime *dst, const daytime *src);
 mal_export str MTIMEdaytime_fromseconds(daytime *ret, const lng *secs);
 mal_export str MTIMEdaytime_fromseconds_bulk(bat *ret, bat *bid);
-mal_export str MTIMEtimestamp_extract_daytime(daytime *ret, const timestamp 
*t);
-mal_export str MTIMEtimestamp_extract_daytime_bulk(bat *ret, bat *bid);
 mal_export str MTIMElocal_timezone_msec(lng *ret);
 mal_export str MTIMEstr_to_date(date *ret, const char *const *s, const char 
*const *format);
 mal_export str MTIMEdate_to_str(str *ret, const date *d, const char *const 
*format);
@@ -1103,59 +1076,124 @@ MTIMEcurrent_timestamp(timestamp *ret)
        return MAL_SUCCEED;
 }
 
-str
-MTIMEdate_diff(int *ret, const date *v1, const date *v2)
-{
-       *ret = date_diff(*v1, *v2);
-       return MAL_SUCCEED;
+#define COPYFLAGS      do { bn->tsorted = b->tsorted; bn->trevsorted = 
b->trevsorted; } while (0)
+#define SETFLAGS       do { bn->tsorted = bn->trevsorted = n < 2; } while (0)
+#define func1(NAME, NAMEBULK, MALFUNC, INTYPE, OUTYPE, FUNC, SETFLAGS) \
+mal_export str NAME(OUTYPE *ret, const INTYPE *src);                           
        \
+mal_export str NAMEBULK(bat *ret, const bat *bid);                             
                \
+str                                                                            
                                                                \
+NAME(OUTYPE *ret, const INTYPE *src)                                           
                        \
+{                                                                              
                                                                \
+       if (is_##INTYPE##_nil(*src)) {                                          
                                \
+               *ret = OUTYPE##_nil;                                            
                                        \
+       } else {                                                                
                                                        \
+               *ret = FUNC(*src);                                              
                                                \
+       }                                                                       
                                                                \
+       return MAL_SUCCEED;                                                     
                                                \
+}                                                                              
                                                                \
+str                                                                            
                                                                \
+NAMEBULK(bat *ret, const bat *bid)                                             
                                \
+{                                                                              
                                                                \
+       BAT *b, *bn;                                                            
                                                \
+       BUN n;                                                                  
                                                        \
+       const INTYPE *src;                                                      
                                                \
+       OUTYPE *dst;                                                            
                                                \
+                                                                               
                                                                \
+       if ((b = BATdescriptor(*bid)) == NULL)                                  
                        \
+               throw(MAL, "batmtime." MALFUNC,                                 
                                \
+                         SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);              
                        \
+       n = BATcount(b);                                                        
                                                \
+       if ((bn = COLnew(b->hseqbase, TYPE_##OUTYPE, n, TRANSIENT)) == NULL) { \
+               BBPunfix(b->batCacheid);                                        
                                        \
+               throw(MAL, "batmtime." MALFUNC, SQLSTATE(HY001) 
MAL_MALLOC_FAIL); \
+       }                                                                       
                                                                \
+       src = Tloc(b, 0);                                                       
                                                \
+       dst = Tloc(bn, 0);                                                      
                                                \
+       bn->tnil = false;                                                       
                                                \
+       for (BUN i = 0; i < n; i++) {                                           
                                \
+               if (is_##INTYPE##_nil(src[i])) {                                
                                \
+                       dst[i] = OUTYPE##_nil;                                  
                                        \
+                       bn->tnil = true;                                        
                                                \
+               } else {                                                        
                                                        \
+                       dst[i] = FUNC(src[i]);                                  
                                        \
+               }                                                               
                                                                \
+       }                                                                       
                                                                \
+       bn->tnonil = !bn->tnil;                                                 
                                        \
+       BATsetcount(bn, n);                                                     
                                                \
+       SETFLAGS;                                                               
                                                        \
+       bn->tkey = false;                                                       
                                                \
+       BBPunfix(b->batCacheid);                                                
                                        \
+       BBPkeepref(*ret = bn->batCacheid);                                      
                                \
+       return MAL_SUCCEED;                                                     
                                                \
 }
 
-str
-MTIMEdate_diff_bulk(bat *ret, bat *bid1, bat *bid2)
-{
-       BAT *b1, *b2, *bn;
-       BUN n;
-       const date *d1, *d2;
-       int *df;
+#define func2(NAME, NAMEBULK, MALFUNC, INTYPE1, INTYPE2, OUTTYPE, FUNC)        
\
+mal_export str NAME(OUTTYPE *ret, const INTYPE1 *v1, const INTYPE2 *v2); \
+mal_export str NAMEBULK(bat *ret, const bat *bid1, const bat *bid2);   \
+str                                                                            
                                                                \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to