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.

201 lines
4.8 KiB
C++

#ifndef QDECSINGLE_HH
#define QDECSINGLE_HH
/** \file QDecSingle.hh
* Declarations for the class QDecSingle.
*
* (C) Copyright by Semih Cemiloglu
* All rights reserved, see COPYRIGHT file for details.
*
* $Id$
*
*
*/
#include <QByteArray>
#include <QMetaType>
#include "QDecFwd.hh"
#include "QDecContext.hh"
extern "C" {
#include "decSingle.h"
}
// FORWARDS
QT_BEGIN_NAMESPACE
class QTextStream;
QT_END_NAMESPACE
/*!
\class QDecSingle
QDecSingle encapsulates decSingle and provides decNumber
library functions that operates upon decSingle as member functions
with the same name.
decimal32 is a 32-bit decimal floating-point representation which
provides 7 decimal digits of precision in a compressed format.
decSingle module provides the functions for the decimal32 format;
this format is intended for storage and interchange only and so
the module provides utilities and conversions but no arithmetic functions.
*/
class QDECIMAL_EXPORT QDecSingle
{
// MEMBERS
//! Embedded decSingle structure
decSingle m_data;
public:
// TYPES
typedef decSingle* decSinglePtr_t;
enum {
MaxStrSize = QDECMAXSTRSIZE
};
// CREATORS
//! Default constructor
QDecSingle() { decSingleZero(&m_data); }
// Default Dtor and Copy Ctor are ok
// Constructors using decSingle structure
QDecSingle(decSingle d) : m_data(d) {}
QDecSingle(const decSingle* p) : m_data(*p) {}
// Conversion constructors using simple types
QDecSingle(const char* str) { fromString(str); }
QDecSingle(double d) { fromDouble(d); }
// Conversion constructors using composite types
QDecSingle(const QDecDouble& d) { fromQDecDouble(d); }
QDecSingle(const QDecPacked& p) { fromQDecPacked(p); }
QDecSingle(const QDecNumber& n) { fromQDecNumber(n); }
//! Copy assignment
QDecSingle& operator=(const QDecSingle& o)
{ if(this != &o) m_data = o.m_data; return *this; }
//! Conversion operator to decSingle*
operator decSinglePtr_t() { return &m_data; }
// ACCESSORS
const decSingle* data() const
{ return &m_data; }
// MODIFIERS
decSingle* data()
{ return &m_data; }
// UTILITIES & CONVERSIONS
QDecSingle& fromBCD(int32_t exp, const QByteArray& bcd, int32_t sign) {
decSingleFromBCD(&m_data, exp, (const uint8_t*)bcd.data(), sign);
return *this;
}
QDecSingle& fromDouble(double d);
QDecSingle& fromPacked(int32_t exp, const QByteArray& pack) {
decSingleFromPacked(&m_data, exp, (const uint8_t*)pack.data());
return *this;
}
QDecSingle& fromPackedChecked(int32_t exp, const QByteArray& pack) {
decSingleFromPackedChecked(&m_data, exp, (const uint8_t*)pack.data());
return *this;
}
QDecSingle& fromString(const char* str, QDecContext* c = 0) {
decSingleFromString(&m_data, str, CXT(c));
return *this;
}
//! Hexadecimal string in network byte order
QDecSingle& fromHexString(const char* str);
QDecSingle& fromQDecDouble(const QDecDouble& d, QDecContext* c = 0)
{ return fromWider(d,c); }
QDecSingle& fromQDecNumber(const QDecNumber& n, QDecContext* c = 0);
QDecSingle& fromQDecPacked(const QDecPacked& p);
QDecSingle& fromWider(const QDecDouble& d, QDecContext* c = 0);
int32_t getCoefficient(QByteArray& bcd) const {
bcd.resize(DECSINGLE_Pmax);
return decSingleGetCoefficient(&m_data, (uint8_t*)bcd.data());
}
int32_t getExponent() const
{ return decSingleGetExponent(&m_data); }
QDecSingle& setCoefficient(const QByteArray& bcd, int32_t sign) {
decSingleSetCoefficient(&m_data, (const uint8_t*)bcd.data(), sign);
return *this;
}
QDecSingle& setExponent(int32_t exp, QDecContext* c = 0 ) {
decSingleSetExponent(&m_data, CXT(c), exp);
return *this;
}
int32_t toBCD(int32_t& exp, QByteArray& bcd) {
bcd.resize(DECSINGLE_Pmax);
return decSingleToBCD(&m_data, &exp, (uint8_t*)bcd.data());
}
double toDouble() const;
QByteArray toEngString() const {
char str[MaxStrSize] = { 0 };
return decSingleToEngString(&m_data, str);
}
QByteArray toString() const {
char str[MaxStrSize] = { 0 };
return decSingleToString(&m_data, str);
}
int32_t toPacked(int32_t& exp, QByteArray& pack) {
pack.resize(DECSINGLE_Pmax);
return decSingleToPacked(&m_data, &exp, (uint8_t*)pack.data());
}
QDecDouble toQDecDouble() const;
QDecPacked toQDecPacked() const;
QDecNumber toQDecNumber() const;
QDecDouble toWider() const;
QDecSingle& zero()
{ decSingleZero(&m_data); return *this; }
// ARITHMETIC
// No arithmetic routines defines for QDecSingle
// NON-COMPUTATIONAL
uint32_t radix() const
{ return decSingleRadix(&m_data); }
const char* version() const
{ return decSingleVersion(); }
}; // end class
Q_DECLARE_METATYPE(QDecSingle);
QDECIMAL_EXPORT
QTextStream& operator<<(QTextStream& ts, const QDecSingle& d);
#endif /* Include guard */