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