introduce FormulaTypedDoubleToken to carry type information of a double

Change-Id: I88b4964ca95eefa41d415ed66fc106c834a686b6
diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx
index 360449f..a32853c 100644
--- a/formula/source/core/api/token.cxx
+++ b/formula/source/core/api/token.cxx
@@ -42,6 +42,8 @@ namespace formula

// Need a lot of FormulaDoubleToken
IMPL_FIXEDMEMPOOL_NEWDEL_DLL( FormulaDoubleToken )
// Need quite some FormulaTypedDoubleToken
IMPL_FIXEDMEMPOOL_NEWDEL_DLL( FormulaTypedDoubleToken )
// Need a lot of FormulaByteToken
IMPL_FIXEDMEMPOOL_NEWDEL_DLL( FormulaByteToken )
// Need several FormulaStringToken
@@ -199,6 +201,12 @@ double & FormulaToken::GetDoubleAsReference()
    return fVal;
}

short FormulaToken::GetDoubleType() const
{
    SAL_WARN( "formula.core", "FormulaToken::GetDoubleType: virtual dummy called" );
    return 0;
}

svl::SharedString FormulaToken::GetString() const
{
    SAL_WARN( "formula.core", "FormulaToken::GetString: virtual dummy called" );
@@ -1656,11 +1664,29 @@ bool FormulaTokenIterator::IsEndOfPath() const

double      FormulaDoubleToken::GetDouble() const            { return fDouble; }
double &    FormulaDoubleToken::GetDoubleAsReference()       { return fDouble; }

short FormulaDoubleToken::GetDoubleType() const
{
    // This is a plain double value without type information, don't emit a
    // warning via FormulaToken::GetDoubleType().
    return 0;
}

bool FormulaDoubleToken::operator==( const FormulaToken& r ) const
{
    return FormulaToken::operator==( r ) && fDouble == r.GetDouble();
}

short FormulaTypedDoubleToken::GetDoubleType() const
{
    return mnType;
}

bool FormulaTypedDoubleToken::operator==( const FormulaToken& r ) const
{
    return FormulaDoubleToken::operator==( r ) && mnType == r.GetDoubleType();
}

FormulaStringToken::FormulaStringToken( const svl::SharedString& r ) :
    FormulaToken( svString ), maString( r )
{
diff --git a/include/formula/token.hxx b/include/formula/token.hxx
index 3d265f6..f195b68 100644
--- a/include/formula/token.hxx
+++ b/include/formula/token.hxx
@@ -151,6 +151,7 @@ public:
    virtual void                SetInForceArray( bool b );
    virtual double              GetDouble() const;
    virtual double&             GetDoubleAsReference();
    virtual short               GetDoubleType() const;
    virtual svl::SharedString   GetString() const;
    virtual void                SetString( const svl::SharedString& rStr );
    virtual sal_uInt16          GetIndex() const;
@@ -270,11 +271,32 @@ public:
    virtual FormulaToken*       Clone() const override { return new FormulaDoubleToken(*this); }
    virtual double              GetDouble() const override;
    virtual double&             GetDoubleAsReference() override;
    virtual short               GetDoubleType() const override;     ///< always returns 0 for "not typed"
    virtual bool                operator==( const FormulaToken& rToken ) const override;

    DECL_FIXEDMEMPOOL_NEWDEL_DLL( FormulaDoubleToken )
};

class FORMULA_DLLPUBLIC FormulaTypedDoubleToken : public FormulaDoubleToken
{
private:
            short               mnType;     /**< Can hold, for example, a value
                                              of css::util::NumberFormat, or by
                                              contract any other
                                              classification. */
public:
                                FormulaTypedDoubleToken( double f, short nType ) :
                                    FormulaDoubleToken( f ), mnType( nType ) {}
                                FormulaTypedDoubleToken( const FormulaTypedDoubleToken& r ) :
                                    FormulaDoubleToken( r ), mnType( r.mnType ) {}

    virtual FormulaToken*       Clone() const override { return new FormulaTypedDoubleToken(*this); }
    virtual short               GetDoubleType() const override;
    virtual bool                operator==( const FormulaToken& rToken ) const override;

    DECL_FIXEDMEMPOOL_NEWDEL_DLL( FormulaTypedDoubleToken )
};


class FORMULA_DLLPUBLIC FormulaStringToken : public FormulaToken
{