00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 #ifndef XML_ABSTRACT_DOUBLE_FLOAT_HPP
00122 #define XML_ABSTRACT_DOUBLE_FLOAT_HPP
00123 
00124 #include <xercesc/util/XMLNumber.hpp>
00125 #include <xercesc/util/PlatformUtils.hpp>
00126 
00127 XERCES_CPP_NAMESPACE_BEGIN
00128 
00129 
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137 
00138 
00139 
00140 
00141 
00142 
00143 
00144 
00145 
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 
00158 
00159 class  XMLAbstractDoubleFloat : public XMLNumber
00160 {
00161 public:
00162 
00163     enum LiteralType
00164     {
00165         NegINF,
00166         PosINF,
00167         NaN,
00168         SpecialTypeNum,
00169         Normal
00170     };
00171 
00172     virtual ~XMLAbstractDoubleFloat();
00173 
00179     virtual XMLCh*        toString() const;
00180     
00181     virtual XMLCh*        getRawData() const;
00182 
00183     virtual const XMLCh*  getFormattedString() const;
00184 
00185     virtual int           getSign() const;
00186 
00187     MemoryManager*        getMemoryManager() const;
00188 
00189     
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197     void                  normalizeDecimalPoint(char* const toNormal);
00198 
00199     
00200 
00201 
00202     DECL_XSERIALIZABLE(XMLAbstractDoubleFloat)
00203 
00204 protected:
00205 
00206     
00207     
00208     
00209     XMLAbstractDoubleFloat(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00210 
00211     void                  init(const XMLCh* const strValue);
00212 
00225     static int            compareValues(const XMLAbstractDoubleFloat* const lValue
00226                                       , const XMLAbstractDoubleFloat* const rValue);
00227 
00228     
00229     
00230     
00231     virtual void          checkBoundary(const XMLCh* const strValue) = 0;
00232 
00233 private:
00234     
00235     
00236     
00237     
00238     
00239     
00240     XMLAbstractDoubleFloat(const XMLAbstractDoubleFloat& toCopy);
00241     XMLAbstractDoubleFloat& operator=(const XMLAbstractDoubleFloat& toAssign);
00242 
00243     void                  normalizeZero(XMLCh* const);
00244 
00245     inline bool           isSpecialValue() const;
00246 
00247     static int            compareSpecial(const XMLAbstractDoubleFloat* const specialValue
00248                                        , const XMLAbstractDoubleFloat* const normalValue);
00249 
00250     void                  formatString();
00251 
00252 protected:
00253     double                  fValue;
00254     LiteralType             fType;
00255     bool                    fDataConverted;
00256 
00257 private:
00258     int                     fSign;
00259     XMLCh*                  fRawData;
00260 
00261     
00262     
00263     
00264     
00265     
00266     
00267     
00268     
00269     XMLCh*                  fFormattedString;
00270     MemoryManager*          fMemoryManager;
00271 };
00272 
00273 inline bool XMLAbstractDoubleFloat::isSpecialValue() const
00274 {
00275     return (fType < SpecialTypeNum);
00276 }
00277 
00278 inline MemoryManager* XMLAbstractDoubleFloat::getMemoryManager() const
00279 {
00280     return fMemoryManager;
00281 }
00282 
00283 XERCES_CPP_NAMESPACE_END
00284 
00285 #endif