You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
2.8 KiB
C++

/** \file DeciContext.cc
* Definitions for the class QDecContext.
*
* (C) Copyright by Semih Cemiloglu
* All rights reserved, see COPYRIGHT file for details.
*
* $Id$
*
*
*/
#include "QDecContext.hh"
//include <sstream>
#include <QtGlobal>
#include <QByteArray>
#include <QTextStream>
#include "QDecFwd.hh"
using namespace std;
QDecContext::QDecContext(int32_t kind)
{
switch(kind) {
case DEC_INIT_BASE:
case DEC_INIT_DECIMAL32:
case DEC_INIT_DECIMAL64:
case DEC_INIT_DECIMAL128:
// Above kinds must be specified
break;
default:
// Invalid kind
throw("Invalid QDecContext kind");
}
decContextDefault(&m_data, kind);
// No SIGFPE trap is allowed by default
// as this will disrupt most calculations.
m_data.traps = 0;
// By default allow maximum allowable precision
setDigits(QDecNumDigits);
}
QByteArray QDecContext::statusFlags() const
{
uint32_t status = m_data.status;
QByteArray str;
QTextStream os(&str);
//ostringstream os;
const char sep = '|'; // Separator
if(status & DEC_Conversion_syntax)
os << DEC_Condition_CS << sep;
if(status & DEC_Division_by_zero)
os << DEC_Condition_DZ << sep;
if(status & DEC_Division_impossible)
os << DEC_Condition_DI << sep;
if(status & DEC_Division_undefined)
os << DEC_Condition_DU << sep;
if(status & DEC_Inexact)
os << DEC_Condition_IE << sep;
if(status & DEC_Invalid_context)
os << DEC_Condition_IC << sep;
if(status & DEC_Insufficient_storage)
os << DEC_Condition_IS << sep;
if(status & DEC_Invalid_operation)
os << DEC_Condition_IO << sep;
#if DECSUBSET
if(status & DEC_Lost_digits)
os << DEC_Condition_LD << sep;
#endif
if(status & DEC_Overflow)
os << DEC_Condition_OV << sep;
if(status & DEC_Clamped)
os << DEC_Condition_PA << sep;
if(status & DEC_Rounded)
os << DEC_Condition_RO << sep;
if(status & DEC_Subnormal)
os << DEC_Condition_SU << sep;
if(status & DEC_Underflow)
os << DEC_Condition_UN << sep;
if(0==status)
os << DEC_Condition_ZE << sep;
os << "0x" << hex << status;
os.flush();
//return os.str().c_str();
return str;
}
uint8_t QDecContext::extended() const
{
#if DECSUBSET
return m_data.extended;
#else
return 0;
#endif
}
void QDecContext::setExtended(uint8_t ext)
{
#if DECSUBSET
m_data.extended = ext;
#else
(void)ext; // To disable compiler warning
#endif
}
QTextStream& operator<<(QTextStream& ts, const QDecContext ctx)
{
char c = ' ';
ts << "digits=" << ctx.digits()
<< c << "emax=" << ctx.emax()
<< c << "emin=" << ctx.emin()
<< c << "extended=" << ctx.extended()
<< c << "clamp=" << ctx.clamp()
<< c << "round=" << ctx.round()
<< c << "traps=" << ctx.traps()
<< c << "status=" << ctx.status()
<< c << ctx.statusToString();
return ts;
}