service plugin and qdecimal library has been added
This commit is contained in:
@@ -0,0 +1,251 @@
|
||||
#ifndef QDECCONTEXT_HH
|
||||
#define QDECCONTEXT_HH
|
||||
|
||||
/** \file QDecContext.hh
|
||||
* Declarations for the class QDecContext.
|
||||
*
|
||||
* (C) Copyright Semih Cemiloglu
|
||||
* All rights reserved, see COPYRIGHT file for details.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
extern "C" {
|
||||
#include "decContext.h"
|
||||
}
|
||||
#include "QDecFwd.hh"
|
||||
|
||||
|
||||
// FORWARDS
|
||||
class QByteArray;
|
||||
class QTextStream;
|
||||
|
||||
/*! Default context type or kind, should be set to one of these:
|
||||
* DEC_INIT_BASE
|
||||
* DEC_INIT_DECIMAL32
|
||||
* DEC_INIT_DECIMAL64
|
||||
* DEC_INIT_DECIMAL128
|
||||
*/
|
||||
const int QDecContextDefKind = DEC_INIT_BASE;
|
||||
|
||||
|
||||
//! Maximum precision allowed in precision (digits) field
|
||||
const int32_t QDecMaxPrecision = 999999999;
|
||||
const int32_t QDecMaxExponent = 999999999;
|
||||
const int32_t QDecMinExponent = -999999999;
|
||||
|
||||
/*!
|
||||
\class QDecContext
|
||||
QDecContext encapsulates decContext structure as member and
|
||||
exposes free-standing functions as member functions.
|
||||
Most functions in the decNumber module take as an argument a
|
||||
decContext structure, which provides the context for operations
|
||||
(precision, rounding mode, etc.) and also controls the handling of
|
||||
exceptional conditions (corresponding to the flags and trap enablers
|
||||
in a hardware floating-point implementation).
|
||||
*/
|
||||
class QDECIMAL_EXPORT QDecContext
|
||||
{
|
||||
// MEMBERS
|
||||
//! Embedded decContext structure
|
||||
decContext m_data;
|
||||
|
||||
public:
|
||||
// TYPES
|
||||
typedef decContext* decContextPtr_t;
|
||||
typedef enum rounding Rounding_e;
|
||||
|
||||
// CREATORS
|
||||
//! Default constructor
|
||||
QDecContext(int32_t kind = QDecContextDefKind);
|
||||
QDecContext(const decContext* cptr) : m_data(*cptr) {}
|
||||
QDecContext(const decContext& data) : m_data(data) {}
|
||||
// Default Copy Ctor and Dtor and Copy assignment are ok
|
||||
|
||||
|
||||
// ACCESSORS
|
||||
//! Get decContext member
|
||||
const decContext* data() const
|
||||
{ return &m_data; }
|
||||
|
||||
//! Get clamp flag of the context (IEEE exponent clamp)
|
||||
uint8_t clamp() const
|
||||
{ return m_data.clamp; }
|
||||
|
||||
//! Get digits field of the context (working precision)
|
||||
int32_t digits() const
|
||||
{ return m_data.digits; }
|
||||
|
||||
//! Get emax field of the context (maximum positive exponent)
|
||||
int32_t emax() const
|
||||
{ return m_data.emax; }
|
||||
|
||||
//! Get emin field of the context (minimum negative exponent)
|
||||
int32_t emin() const
|
||||
{ return m_data.emin; }
|
||||
|
||||
//! Get extended flag of the context (special values)
|
||||
uint8_t extended() const;
|
||||
|
||||
//! Get round field of the context (rounding mode)
|
||||
Rounding_e round() const
|
||||
{ return m_data.round; }
|
||||
|
||||
//! Get status flags of the context
|
||||
uint32_t status() const
|
||||
{ return m_data.status; }
|
||||
|
||||
//! Get trap-enabler flags of the context
|
||||
uint32_t traps() const
|
||||
{ return m_data.traps; }
|
||||
|
||||
|
||||
// MODIFIERS
|
||||
//! Get decContext member
|
||||
decContext* data()
|
||||
{ return &m_data; }
|
||||
|
||||
//! Set clamp flag of the context (IEEE exponent clamp)
|
||||
void setClamp(uint32_t clamp)
|
||||
{ m_data.clamp = clamp; }
|
||||
|
||||
//! Set digits field of the context (working precision)
|
||||
void setDigits(int32_t digits)
|
||||
{ m_data.digits = digits; }
|
||||
|
||||
//! Set emax field of the context (maximum positive exponent)
|
||||
void setEmax(int32_t emax)
|
||||
{ m_data.emax = emax; }
|
||||
|
||||
//! Set emin field of the context (minimum negative exponent)
|
||||
void setEmin(int32_t emin)
|
||||
{ m_data.emin = emin; }
|
||||
|
||||
//! Set extended flag of the context (special values)
|
||||
void setExtended(uint8_t ext);
|
||||
|
||||
//! This function is used to return the round (rounding mode) field
|
||||
//! of a decContext.
|
||||
void setRound(Rounding_e round)
|
||||
{ m_data.round = round; }
|
||||
|
||||
void setTraps(uint32_t traps)
|
||||
{ m_data.traps = traps; }
|
||||
|
||||
/*!
|
||||
This function is used to set one or more status bits in the status
|
||||
field of a decContext. If any of the bits being set have the
|
||||
corresponding bit set in the traps field, a trap is raised
|
||||
(regardless of whether the bit is already set in the status field).
|
||||
Only one trap is raised even if more than one bit is being set.
|
||||
*/
|
||||
void setStatus(uint32_t status = 0)
|
||||
{ m_data.status = status; }
|
||||
|
||||
//! This function is identical to setStatus except that
|
||||
//! the context traps field is ignored (i.e., no trap is raised).
|
||||
void setStatusQuiet(uint32_t status = 0)
|
||||
{ decContextSetStatusQuiet(&m_data, status); }
|
||||
|
||||
// ROUTINES
|
||||
//! This function is used to clear (set to zero) one or more status
|
||||
//! bits in the status field of a decContext.
|
||||
QDecContext& clearStatus(uint32_t status)
|
||||
{ decContextClearStatus(&m_data, status); return *this; }
|
||||
|
||||
//! This function is used to restore one or more status bits in
|
||||
//! the status field of a decContext from a saved status field.
|
||||
QDecContext& restoreStatus(uint32_t status, uint32_t mask)
|
||||
{ decContextRestoreStatus(&m_data, status, mask); return *this; }
|
||||
|
||||
/*!
|
||||
This function is used to initialize a decContext structure to
|
||||
default values. It is stongly recommended that this function always
|
||||
be used to initialize a decContext structure, even if most or all
|
||||
of the fields are to be set explicitly (in case new fields are added
|
||||
to a later version of the structure).
|
||||
*/
|
||||
QDecContext& setDefault(int32_t kind = QDecContextDefKind)
|
||||
{ decContextDefault(&m_data, kind); return *this; }
|
||||
|
||||
//! This function is used to save one or more status bits from
|
||||
//! the status field of a decContext.
|
||||
uint32_t saveStatus(uint32_t mask)
|
||||
{ return decContextSaveStatus(&m_data, mask); }
|
||||
|
||||
/*!
|
||||
This function is used to set a status bit in the status field of a
|
||||
decContext, using the name of the bit as returned by the
|
||||
decContextStatusToString function. If the bit being set has the
|
||||
corresponding bit set in the traps field, a trap is raised
|
||||
(regardless of whether the bit is already set in the status field).
|
||||
*/
|
||||
QDecContext& setStatusFromString(const char* str)
|
||||
{ decContextSetStatusFromString(&m_data, str); return *this; }
|
||||
|
||||
//! This function is identical to setStatusFromString except
|
||||
//! that the context traps field is ignored (i.e., no trap is raised).
|
||||
QDecContext& setStatusFromStringQuiet(const char* str)
|
||||
{ decContextSetStatusFromStringQuiet(&m_data, str); return *this; }
|
||||
|
||||
//! This function returns a pointer (char *) to a human-readable
|
||||
//! description of a status bit. The string pointed to will be a constant.
|
||||
const char* statusToString() const
|
||||
{ return decContextStatusToString(&m_data); }
|
||||
|
||||
//! This function is used to test one or more status bits in a context.
|
||||
uint32_t testStatus(uint32_t mask) //const
|
||||
{ return decContextTestStatus(&m_data, mask); }
|
||||
|
||||
//! This function is used to clear (set to zero) all the
|
||||
//! status bits in the status field of a decContext.
|
||||
QDecContext& zeroStatus()
|
||||
{ decContextZeroStatus(&m_data); return *this; }
|
||||
|
||||
|
||||
// UTILITY ROUTINES
|
||||
//! Get status flags (fields) in string form
|
||||
//! separated by | character
|
||||
QByteArray statusFlags() const;
|
||||
|
||||
//! Throw exception if status flags are set.
|
||||
void throwOnError() const
|
||||
{ if(m_data.status) throw(statusToString()); }
|
||||
|
||||
//! Type conversion operator to decContext*
|
||||
operator decContextPtr_t() { return &m_data; }
|
||||
|
||||
|
||||
// STATIC FUNCTIONS
|
||||
//! This function checks that the DECLITEND tuning
|
||||
//! parameter is set correctly.
|
||||
//! Returns 0 if the DECLITEND parameter is correct,
|
||||
//! 1 if it is incorrect and should be set to 1, and
|
||||
//! -1 if it is incorrect and should be set to 0.
|
||||
static int TestEndian()
|
||||
{ return decContextTestEndian(1 /*Quiet*/); }
|
||||
|
||||
//! This function is used to test one or more status
|
||||
//! bits in a saved status field.
|
||||
static uint32_t TestSavedStatus(uint32_t status, uint32_t mask)
|
||||
{ return decContextTestSavedStatus(status, mask); }
|
||||
|
||||
|
||||
}; // end class
|
||||
|
||||
|
||||
/*!
|
||||
QTextStream inserter to pretty-print QDecContext objects
|
||||
in the debug stream.
|
||||
*/
|
||||
QDECIMAL_EXPORT
|
||||
QTextStream& operator<<(QTextStream& ts, const QDecContext);
|
||||
|
||||
|
||||
//! Convience macro to extract decContext structure or
|
||||
//! create one on stack to comply with callee signature.
|
||||
#define CXT(cptr) ( cptr ? cptr->data() : QDecContext().data() )
|
||||
|
||||
#endif /* Include guard */
|
||||
Reference in New Issue
Block a user