From 8e2d1c7f2a099df5701a605ec884e786dcedae8b Mon Sep 17 00:00:00 2001 From: John Emmas Date: Fri, 19 Aug 2016 12:56:34 +0100 Subject: [PATCH] Move 'round()' / 'trunc()' etc so that they won't conflict with any versions already available in MSVC --- libs/pbd/msvc/msvc_pbd.cc | 100 +++++++++++----------- libs/pbd/pbd/msvc_pbd.h | 6 +- msvc_extra_headers/ardourext/misc.h.input | 6 +- 3 files changed, 56 insertions(+), 56 deletions(-) diff --git a/libs/pbd/msvc/msvc_pbd.cc b/libs/pbd/msvc/msvc_pbd.cc index 68596e3463..20065fff26 100644 --- a/libs/pbd/msvc/msvc_pbd.cc +++ b/libs/pbd/msvc/msvc_pbd.cc @@ -223,121 +223,121 @@ ssize_t ret; return (ret); } +#if defined(_MSC_VER) && (_MSC_VER < 1800) //*************************************************************** // -// roundf() +// expm1() // -// Emulates roundf() using floorf(). +// Emulates C99 expm1() using exp(). // // Returns: // -// On Success: The largest integer that is less than or -// equal to 'x'. -// On Failure: None +// On Success: (('e' raised to the power of 'x') - 1) +// (e.g. expm1(1) == 1.7182818). +// On Failure: None, except that calling exp(x) should generate +// an appropriate error for us (such as INF etc). // -LIBPBD_API float PBD_APICALLTYPE -roundf(float x) +LIBPBD_API double PBD_APICALLTYPE +expm1(double x) { - return (floorf(x)); + return (exp(x) - (double)1.0); } //*************************************************************** // -// round() +// log1p() // -// Emulates round() using floor(). +// Emulates C99 log1p() using log(). // // Returns: // -// On Success: The largest integer that is less than or -// equal to 'x'. -// On Failure: None +// On Success: The natural logarithm of (1 + x) +// (e.g. log1p(1) == 0.69314718). +// On Failure: None, except that calling log(x) should generate +// an appropriate error for us (such as ERANGE etc). // LIBPBD_API double PBD_APICALLTYPE -round(double x) +log1p(double x) { - return (floor(x)); + return (log(x + (double)1.0)); } //*************************************************************** // -// trunc() +// roundf() // -// Emulates trunc() using floor() and ceil(). +// Emulates roundf() using floorf(). // // Returns: // -// On Success: The largest integer whose magnitude is less -// than or equal to 'x' (regardless of sign). +// On Success: The largest integer that is less than or +// equal to 'x'. // On Failure: None // -LIBPBD_API double PBD_APICALLTYPE -trunc(double x) +LIBPBD_API float PBD_APICALLTYPE +roundf(float x) { - if (x < 0) - return (ceil(x)); - - return (floor(x)); + return (floorf(x)); } -#if defined(_MSC_VER) && (_MSC_VER < 1800) //*************************************************************** // -// expm1() +// round() // -// Emulates C99 expm1() using exp(). +// Emulates round() using floor(). // // Returns: // -// On Success: (('e' raised to the power of 'x') - 1) -// (e.g. expm1(1) == 1.7182818). -// On Failure: None, except that calling exp(x) should generate -// an appropriate error for us (such as INF etc). +// On Success: The largest integer that is less than or +// equal to 'x'. +// On Failure: None // LIBPBD_API double PBD_APICALLTYPE -expm1(double x) +round(double x) { - return (exp(x) - (double)1.0); + return (floor(x)); } +#endif +#if defined(_MSC_VER) && (_MSC_VER < 1900) //*************************************************************** // -// log1p() +// log2() // -// Emulates C99 log1p() using log(). +// Emulates C99 log2() using log(). // // Returns: // -// On Success: The natural logarithm of (1 + x) -// (e.g. log1p(1) == 0.69314718). +// On Success: The binary (base-2) logarithm of 'x' +// (e.g. log2(1024) == 10). // On Failure: None, except that calling log(x) should generate // an appropriate error for us (such as ERANGE etc). // LIBPBD_API double PBD_APICALLTYPE -log1p(double x) +log2(double x) { - return (log(x + (double)1.0)); + return (log(x) / log((double)2.0)); } -#endif -#if defined(_MSC_VER) && (_MSC_VER < 1900) //*************************************************************** // -// log2() +// trunc() // -// Emulates C99 log2() using log(). +// Emulates trunc() using floor() and ceil(). // // Returns: // -// On Success: The binary (base-2) logarithm of 'x' -// (e.g. log2(1024) == 10). -// On Failure: None, except that calling log(x) should generate -// an appropriate error for us (such as ERANGE etc). +// On Success: The largest integer whose magnitude is less +// than or equal to 'x' (regardless of sign). +// On Failure: None // LIBPBD_API double PBD_APICALLTYPE -log2(double x) +trunc(double x) { - return (log(x) / log((double)2.0)); + if (x < 0) + return (ceil(x)); + + return (floor(x)); } #endif diff --git a/libs/pbd/pbd/msvc_pbd.h b/libs/pbd/pbd/msvc_pbd.h index 1a017fcb8a..9a3c102662 100644 --- a/libs/pbd/pbd/msvc_pbd.h +++ b/libs/pbd/pbd/msvc_pbd.h @@ -230,17 +230,17 @@ LIBPBD_API int __cdecl gettimeofday(struct timeval *__restrict tv, __ LIBPBD_API ssize_t PBD_APICALLTYPE pread(int handle, void *buf, size_t nbytes, off_t offset); LIBPBD_API ssize_t PBD_APICALLTYPE pwrite(int handle, const void *buf, size_t nbytes, off_t offset); LIBPBD_API int PBD_APICALLTYPE poll(struct pollfd *fds, nfds_t nfds, int timeout); -LIBPBD_API float PBD_APICALLTYPE roundf(float x); -LIBPBD_API double PBD_APICALLTYPE round(double x); -LIBPBD_API double PBD_APICALLTYPE trunc(double x); #if defined(_MSC_VER) && (_MSC_VER < 1800) LIBPBD_API double PBD_APICALLTYPE expm1(double x); LIBPBD_API double PBD_APICALLTYPE log1p(double x); +LIBPBD_API double PBD_APICALLTYPE round(double x); +LIBPBD_API float PBD_APICALLTYPE roundf(float x); #endif #if defined(_MSC_VER) && (_MSC_VER < 1900) LIBPBD_API double PBD_APICALLTYPE log2 (double x); +LIBPBD_API double PBD_APICALLTYPE trunc(double x); #endif namespace PBD { diff --git a/msvc_extra_headers/ardourext/misc.h.input b/msvc_extra_headers/ardourext/misc.h.input index 6b6533b510..47cff56295 100644 --- a/msvc_extra_headers/ardourext/misc.h.input +++ b/msvc_extra_headers/ardourext/misc.h.input @@ -252,17 +252,17 @@ inline int64_t abs(int64_t val) throw() #endif #if !defined(LIBPBD_API) || defined(PBD_IS_IN_WIN_STATIC_LIB) -extern double round(double x); -extern float roundf(float x); - // Emulate some C99 math functions which MSVC itself didn't // implement until later in life. #if defined(_MSC_VER) && (_MSC_VER < 1800) extern double expm1(double x); extern double log1p(double x); +extern double round(double x); +extern float roundf(float x); #endif #if defined(_MSC_VER) && (_MSC_VER < 1900) extern double log2 (double x); +extern double trunc(double x); #endif #endif -- 2.30.2