-
Notifications
You must be signed in to change notification settings - Fork 154
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add separate FPEnvironment implementation for QNX; QNX changes to C99…
… impl make problems with some Clang versions
- Loading branch information
1 parent
59464ba
commit e22e5a9
Showing
5 changed files
with
229 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
// | ||
// FPEnvironment_C99.h | ||
// | ||
// $Id: //poco/1.4/Foundation/include/Poco/FPEnvironment_C99.h#1 $ | ||
// | ||
// Library: Foundation | ||
// Package: Core | ||
// Module: FPEnvironment | ||
// | ||
// Definitions of class FPEnvironmentImpl for C99. | ||
// | ||
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. | ||
// and Contributors. | ||
// | ||
// SPDX-License-Identifier: BSL-1.0 | ||
// | ||
|
||
|
||
#ifndef Foundation_FPEnvironment_C99_INCLUDED | ||
#define Foundation_FPEnvironment_C99_INCLUDED | ||
|
||
|
||
#include "Poco/Foundation.h" | ||
#include <fenv.h> | ||
#include <cmath> | ||
|
||
|
||
namespace Poco { | ||
|
||
|
||
class FPEnvironmentImpl | ||
{ | ||
protected: | ||
enum RoundingModeImpl | ||
{ | ||
FP_ROUND_DOWNWARD_IMPL = FE_DOWNWARD, | ||
FP_ROUND_UPWARD_IMPL = FE_UPWARD, | ||
FP_ROUND_TONEAREST_IMPL = FE_TONEAREST, | ||
FP_ROUND_TOWARDZERO_IMPL = FE_TOWARDZERO | ||
}; | ||
enum FlagImpl | ||
{ | ||
FP_DIVIDE_BY_ZERO_IMPL = FE_DIVBYZERO, | ||
FP_INEXACT_IMPL = FE_INEXACT, | ||
FP_OVERFLOW_IMPL = FE_OVERFLOW, | ||
FP_UNDERFLOW_IMPL = FE_UNDERFLOW, | ||
FP_INVALID_IMPL = FE_INVALID | ||
}; | ||
FPEnvironmentImpl(); | ||
FPEnvironmentImpl(const FPEnvironmentImpl& env); | ||
~FPEnvironmentImpl(); | ||
FPEnvironmentImpl& operator = (const FPEnvironmentImpl& env); | ||
void keepCurrentImpl(); | ||
static void clearFlagsImpl(); | ||
static bool isFlagImpl(FlagImpl flag); | ||
static void setRoundingModeImpl(RoundingModeImpl mode); | ||
static RoundingModeImpl getRoundingModeImpl(); | ||
static bool isInfiniteImpl(float value); | ||
static bool isInfiniteImpl(double value); | ||
static bool isInfiniteImpl(long double value); | ||
static bool isNaNImpl(float value); | ||
static bool isNaNImpl(double value); | ||
static bool isNaNImpl(long double value); | ||
static float copySignImpl(float target, float source); | ||
static double copySignImpl(double target, double source); | ||
static long double copySignImpl(long double target, long double source); | ||
|
||
private: | ||
fenv_t _env; | ||
}; | ||
|
||
|
||
// | ||
// inlines | ||
// | ||
inline bool FPEnvironmentImpl::isInfiniteImpl(float value) | ||
{ | ||
using namespace std; | ||
return isinf(value) != 0; | ||
} | ||
|
||
|
||
inline bool FPEnvironmentImpl::isInfiniteImpl(double value) | ||
{ | ||
using namespace std; | ||
return isinf(value) != 0; | ||
} | ||
|
||
|
||
inline bool FPEnvironmentImpl::isInfiniteImpl(long double value) | ||
{ | ||
using namespace std; | ||
return isinf((double) value) != 0; | ||
} | ||
|
||
|
||
inline bool FPEnvironmentImpl::isNaNImpl(float value) | ||
{ | ||
using namespace std; | ||
return isnan(value) != 0; | ||
} | ||
|
||
|
||
inline bool FPEnvironmentImpl::isNaNImpl(double value) | ||
{ | ||
using namespace std; | ||
return isnan(value) != 0; | ||
} | ||
|
||
|
||
inline bool FPEnvironmentImpl::isNaNImpl(long double value) | ||
{ | ||
using namespace std; | ||
return isnan((double) value) != 0; | ||
} | ||
|
||
|
||
inline float FPEnvironmentImpl::copySignImpl(float target, float source) | ||
{ | ||
using namespace std; | ||
return copysignf(target, source); | ||
} | ||
|
||
|
||
inline double FPEnvironmentImpl::copySignImpl(double target, double source) | ||
{ | ||
using namespace std; | ||
return copysign(target, source); | ||
} | ||
|
||
|
||
} // namespace Poco | ||
|
||
|
||
#endif // Foundation_FPEnvironment_C99_INCLUDED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
// | ||
// FPEnvironment_C99.cpp | ||
// | ||
// $Id: //poco/1.4/Foundation/src/FPEnvironment_C99.cpp#1 $ | ||
// | ||
// Library: Foundation | ||
// Package: Core | ||
// Module: FPEnvironment | ||
// | ||
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. | ||
// and Contributors. | ||
// | ||
// SPDX-License-Identifier: BSL-1.0 | ||
// | ||
|
||
|
||
#include "Poco/FPEnvironment_C99.h" | ||
|
||
|
||
namespace Poco { | ||
|
||
|
||
FPEnvironmentImpl::FPEnvironmentImpl() | ||
{ | ||
fegetenv(&_env); | ||
} | ||
|
||
|
||
FPEnvironmentImpl::FPEnvironmentImpl(const FPEnvironmentImpl& env) | ||
{ | ||
_env = env._env; | ||
} | ||
|
||
|
||
FPEnvironmentImpl::~FPEnvironmentImpl() | ||
{ | ||
fesetenv(&_env); | ||
} | ||
|
||
|
||
FPEnvironmentImpl& FPEnvironmentImpl::operator = (const FPEnvironmentImpl& env) | ||
{ | ||
_env = env._env; | ||
return *this; | ||
} | ||
|
||
|
||
void FPEnvironmentImpl::keepCurrentImpl() | ||
{ | ||
fegetenv(&_env); | ||
} | ||
|
||
|
||
void FPEnvironmentImpl::clearFlagsImpl() | ||
{ | ||
feclearexcept(FE_ALL_EXCEPT); | ||
} | ||
|
||
|
||
bool FPEnvironmentImpl::isFlagImpl(FlagImpl flag) | ||
{ | ||
return fetestexcept(flag) != 0; | ||
} | ||
|
||
|
||
void FPEnvironmentImpl::setRoundingModeImpl(RoundingModeImpl mode) | ||
{ | ||
fesetround(mode); | ||
} | ||
|
||
|
||
FPEnvironmentImpl::RoundingModeImpl FPEnvironmentImpl::getRoundingModeImpl() | ||
{ | ||
return (RoundingModeImpl) fegetround(); | ||
} | ||
|
||
|
||
long double FPEnvironmentImpl::copySignImpl(long double target, long double source) | ||
{ | ||
return (source >= 0 && target >= 0) || (source < 0 && target < 0) ? target : -target; | ||
} | ||
|
||
|
||
} // namespace Poco |