blob: 3dbdedb9503eb8bc302a65038d43caf55e3f86b9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* $Id: XMLBigInteger.hpp 568078 2007-08-21 11:43:25Z amassari $
*/
#ifndef XML_BIGINTEGER_HPP
#define XML_BIGINTEGER_HPP
#include <xercesc/util/XMemory.hpp>
#include <xercesc/util/XMLString.hpp>
XERCES_CPP_NAMESPACE_BEGIN
class XMLUTIL_EXPORT XMLBigInteger : public XMemory
{
public:
/**
* Constructs a newly allocated <code>XMLBigInteger</code> object that
* represents the value represented by the string. The string is
* converted to an int value as if by the <code>valueOf</code> method.
*
* @param strValue the <code>String</code> to be converted to an
* <code>XMLBigInteger</code>.
* @param manager Pointer to the memory manager to be used to
* allocate objects.
* @exception NumberFormatException if the <code>String</code> does not
* contain a parsable XMLBigInteger.
*/
XMLBigInteger
(
const XMLCh* const strValue
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
);
~XMLBigInteger();
XMLBigInteger(const XMLBigInteger& toCopy);
static XMLCh* getCanonicalRepresentation
(
const XMLCh* const rawData
, MemoryManager* const memMgr = XMLPlatformUtils::fgMemoryManager
, bool isNonPositiveInteger = false
);
static void parseBigInteger(const XMLCh* const toConvert
, XMLCh* const retBuffer
, int& signValue
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
static int compareValues(const XMLBigInteger* const lValue
,const XMLBigInteger* const rValue
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
static int compareValues(const XMLCh* const lString
, const int& lSign
, const XMLCh* const rString
, const int& rSign
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
void multiply(const unsigned int byteToShift);
void divide(const unsigned int byteToShift);
int getTotalDigit() const;
/**
*
* Deprecated: please use getRawData
*
* Return a copy of the fMagnitue.
* A leading sign is ALWAYS in place and the caller of this method
* is responsible for the de-allocation of the memory.
*/
inline XMLCh* toString() const;
/**
* Return a copy of the fMagnitue.
* This is similar to toString, except the internal buffer is returned directly
* Caller is not required to delet the returned memory.
*/
inline XMLCh* getRawData() const;
/**
* Compares this object to the specified object.
* The result is <code>true</code> if and only if the argument is not
* <code>null</code> and is an <code>XMLBigInteger</code> object that contains
* the same <code>int</code> value as this object.
*
* @param toCompare the object to compare with.
* @return <code>true</code> if the objects are the same;
* <code>false</code> otherwise.
*/
bool operator==(const XMLBigInteger& toCompare) const;
/**
* Returns the signum function of this number (i.e., -1, 0 or 1 as
* the value of this number is negative, zero or positive).
*/
int getSign() const;
int intValue() const;
private:
// -----------------------------------------------------------------------
// Unimplemented constructors and operators
// -----------------------------------------------------------------------
XMLBigInteger& operator=(const XMLBigInteger&);
void setSign(int);
/*
* The number is internally stored in "minimal" sign-fMagnitude format
* (i.e., no BigIntegers have a leading zero byte in their magnitudes).
* Zero is represented with a signum of 0 (and a zero-length fMagnitude).
* Thus, there is exactly one representation for each value.
*/
// -----------------------------------------------------------------------
// Private data members
//
// fSign
// to represent the sign of the number.
//
// fMagnitude
// the buffer holding the number.
//
// fRawData
// to preserve the original string used to construct this object,
// needed for pattern matching.
//
// -----------------------------------------------------------------------
int fSign;
XMLCh* fMagnitude; //null terminated
XMLCh* fRawData;
MemoryManager* fMemoryManager;
};
inline int XMLBigInteger::getSign() const
{
return fSign;
}
inline int XMLBigInteger::getTotalDigit() const
{
return ((getSign() ==0) ? 0 : XMLString::stringLen(fMagnitude));
}
inline bool XMLBigInteger::operator==(const XMLBigInteger& toCompare) const
{
return ( compareValues(this, &toCompare, fMemoryManager) ==0 ? true : false);
}
inline void XMLBigInteger::setSign(int newSign)
{
fSign = newSign;
}
inline XMLCh* XMLBigInteger::getRawData() const
{
return fRawData;
}
//
// The caller needs to de-allocate the memory allocated by this function
//
inline XMLCh* XMLBigInteger::toString() const
{
// Return data using global operator new
return XMLString::replicate(fRawData, fMemoryManager);
}
XERCES_CPP_NAMESPACE_END
#endif