source: icXML/icXML-devel/src/xercesc/util/XMLBigInteger.hpp @ 2722

Last change on this file since 2722 was 2722, checked in by cameron, 6 years ago

Original Xerces files with import mods for icxercesc

File size: 5.9 KB
Line 
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/*
19 * $Id: XMLBigInteger.hpp 932887 2010-04-11 13:04:59Z borisk $
20 */
21
22#if !defined(XERCESC_INCLUDE_GUARD_XML_BIGINTEGER_HPP)
23#define XERCESC_INCLUDE_GUARD_XML_BIGINTEGER_HPP
24
25#include <xercesc/util/XMemory.hpp>
26#include <icxercesc/util/XMLString.hpp>
27
28XERCES_CPP_NAMESPACE_BEGIN
29
30class XMLUTIL_EXPORT XMLBigInteger : public XMemory
31{
32public:
33
34    /**
35     * Constructs a newly allocated <code>XMLBigInteger</code> object that
36     * represents the value represented by the string. The string is
37     * converted to an int value as if by the <code>valueOf</code> method.
38     *
39     * @param      strValue   the <code>String</code> to be converted to an
40     *                       <code>XMLBigInteger</code>.
41     * @param manager    Pointer to the memory manager to be used to
42     *                   allocate objects.
43     * @exception  NumberFormatException  if the <code>String</code> does not
44     *               contain a parsable XMLBigInteger.
45     */
46
47    XMLBigInteger
48    (
49        const XMLCh* const strValue
50        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
51    );
52    ~XMLBigInteger();
53
54    XMLBigInteger(const XMLBigInteger& toCopy);
55
56    static XMLCh* getCanonicalRepresentation
57                        (
58                          const XMLCh*         const rawData
59                        ,       MemoryManager* const memMgr = XMLPlatformUtils::fgMemoryManager
60                        ,       bool                 isNonPositiveInteger = false
61                        );
62
63    static void parseBigInteger(const XMLCh* const toConvert
64                              , XMLCh* const       retBuffer
65                              , int&   signValue
66                              , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
67
68    static int  compareValues(const XMLBigInteger* const lValue
69                             ,const XMLBigInteger* const rValue
70                             , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
71
72
73    static int  compareValues(const XMLCh*         const lString
74                            , const int&                 lSign
75                            , const XMLCh*         const rString
76                            , const int&                 rSign
77                            ,       MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
78
79    void        multiply(const unsigned int byteToShift);
80
81    void        divide(const unsigned int byteToShift);
82
83    unsigned int       getTotalDigit() const;
84   
85    /**
86     *  Return a copy of the fMagnitude.
87     *  This is similar to toString, except the internal buffer is returned directly
88     *  Caller is not required to delete the returned memory.
89     */
90    inline XMLCh*      getRawData() const;
91
92    /**
93     * Compares this object to the specified object.
94     * The result is <code>true</code> if and only if the argument is not
95     * <code>null</code> and is an <code>XMLBigInteger</code> object that contains
96     * the same <code>int</code> value as this object.
97     *
98     * @param   toCompare   the object to compare with.
99     * @return  <code>true</code> if the objects are the same;
100     *          <code>false</code> otherwise.
101     */
102    bool operator==(const XMLBigInteger& toCompare) const;
103
104    /**
105     * Returns the signum function of this number (i.e., -1, 0 or 1 as
106     * the value of this number is negative, zero or positive).
107     */
108    int getSign() const;
109
110    int intValue() const;
111
112private:
113    // -----------------------------------------------------------------------
114    //  Unimplemented constructors and operators
115    // -----------------------------------------------------------------------   
116    XMLBigInteger& operator=(const XMLBigInteger&);
117
118
119    void setSign(int);
120
121    /*
122     * The number is internally stored in "minimal" sign-fMagnitude format
123     * (i.e., no BigIntegers have a leading zero byte in their magnitudes).
124     * Zero is represented with a signum of 0 (and a zero-length fMagnitude).
125     * Thus, there is exactly one representation for each value.
126     */
127    // -----------------------------------------------------------------------
128    //  Private data members
129    //
130    //  fSign
131    //     to represent the sign of the number.
132    //
133    //  fMagnitude
134    //     the buffer holding the number.
135    //
136    //  fRawData
137    //     to preserve the original string used to construct this object,
138    //     needed for pattern matching.
139    //
140    // -----------------------------------------------------------------------
141
142    int         fSign;
143    XMLCh*      fMagnitude;  //null terminated
144    XMLCh*      fRawData;
145    MemoryManager* fMemoryManager;
146};
147
148inline int XMLBigInteger::getSign() const
149{   
150    return fSign;
151}
152
153inline unsigned int XMLBigInteger::getTotalDigit() const
154{
155    return ((getSign() ==0) ? 0 : (unsigned int)XMLString::stringLen(fMagnitude));
156}
157
158inline bool XMLBigInteger::operator==(const XMLBigInteger& toCompare) const
159{
160    return ( compareValues(this, &toCompare, fMemoryManager) ==0 ? true : false);
161}
162
163inline void XMLBigInteger::setSign(int newSign)
164{
165    fSign = newSign;
166}
167
168inline XMLCh*  XMLBigInteger::getRawData() const
169{
170    return fRawData;
171}
172
173XERCES_CPP_NAMESPACE_END
174
175#endif
Note: See TracBrowser for help on using the repository browser.