LCOV - code coverage report
Current view: top level - include/formula - token.hxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 70 94 74.5 %
Date: 2014-11-03 Functions: 48 65 73.8 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #ifndef INCLUDED_FORMULA_TOKEN_HXX
      21             : #define INCLUDED_FORMULA_TOKEN_HXX
      22             : 
      23             : #include <sal/config.h>
      24             : 
      25             : #include <vector>
      26             : 
      27             : #include <string.h>
      28             : #include <formula/opcode.hxx>
      29             : #include <tools/mempool.hxx>
      30             : #include <formula/IFunctionDescription.hxx>
      31             : #include <formula/formuladllapi.h>
      32             : #include <formula/types.hxx>
      33             : #include <svl/sharedstring.hxx>
      34             : #include <osl/interlck.h>
      35             : 
      36             : class ScJumpMatrix;
      37             : class ScMatrix;
      38             : struct ScComplexRefData;
      39             : struct ScSingleRefData;
      40             : 
      41             : namespace formula
      42             : {
      43             : 
      44             : enum StackVarEnum
      45             : {
      46             :     svByte,
      47             :     svDouble,
      48             :     svString,
      49             :     svSingleRef,
      50             :     svDoubleRef,
      51             :     svMatrix,
      52             :     svIndex,
      53             :     svJump,
      54             :     svExternal,                         // Byte + String
      55             :     svFAP,                              // FormulaAutoPilot only, ever exported
      56             :     svJumpMatrix,                       // 2003-07-02
      57             :     svRefList,                          // ocUnion result
      58             :     svEmptyCell,                        // Result is an empty cell, e.g. in LOOKUP()
      59             : 
      60             :     svMatrixCell,                       // Result is a matrix with bells and
      61             :                                         // whistles as needed for _the_ matrix
      62             :                                         // formula result.
      63             : 
      64             :     svHybridCell,                       // A temporary condition of a formula
      65             :                                         // cell during import, having a double
      66             :                                         // and/or string result and a formula
      67             :                                         // string to be compiled.
      68             : 
      69             :     svHybridValueCell,                  // A temporary formula cell with an value
      70             :                                         // and possibily a string representation
      71             : 
      72             :     svExternalSingleRef,
      73             :     svExternalDoubleRef,
      74             :     svExternalName,
      75             :     svSingleVectorRef,
      76             :     svDoubleVectorRef,
      77             :     svSubroutine,                       // A token with a subroutine token array.
      78             :     svError,                            // error token
      79             :     svMissing = 0x70,                   // 0 or ""
      80             :     svSep,                              // separator, ocSep, ocOpen, ocClose
      81             :     svUnknown                           // unknown StackType
      82             : };
      83             : 
      84             : #ifndef DBG_UTIL
      85             : // save memory since compilers tend to int an enum
      86             : typedef sal_uInt8 StackVar;
      87             : #else
      88             : // have enum names in debugger
      89             : typedef StackVarEnum StackVar;
      90             : #endif
      91             : 
      92             : class FormulaTokenArray;
      93             : 
      94             : class FORMULA_DLLPUBLIC FormulaToken : public IFormulaToken
      95             : {
      96             :     OpCode                      eOp;
      97             :     // not implemented, prevent usage
      98             :             FormulaToken();
      99             :             FormulaToken&            operator=( const FormulaToken& );
     100             : protected:
     101             : 
     102             :             const StackVar      eType;          // type of data
     103             :             mutable oslInterlockedCount mnRefCnt;        // reference count
     104             : 
     105             : public:
     106             :     FormulaToken( StackVar eTypeP,OpCode e = ocPush );
     107             :     FormulaToken( const FormulaToken& r );
     108             : 
     109             :     virtual                     ~FormulaToken();
     110             : 
     111      217813 :     inline  void                Delete()                { delete this; }
     112     1466626 :     inline  StackVar            GetType() const         { return eType; }
     113             :             bool                IsFunction() const; // pure functions, no operators
     114             : 
     115             :     bool IsExternalRef() const;
     116             :     bool IsRef() const;
     117             : 
     118             :             sal_uInt8           GetParamCount() const;
     119             : 
     120      758981 :     inline void IncRef() const
     121             :     {
     122      758981 :         osl_atomic_increment(&mnRefCnt);
     123      758981 :     }
     124             : 
     125      758679 :     inline void DecRef() const
     126             :     {
     127      758679 :         if (!osl_atomic_decrement(&mnRefCnt))
     128      217813 :             const_cast<FormulaToken*>(this)->Delete();
     129      758679 :     }
     130             : 
     131       29903 :     inline oslInterlockedCount GetRef() const { return mnRefCnt; }
     132     3048404 :     inline OpCode               GetOpCode() const       { return eOp; }
     133             : 
     134             :     /**
     135             :         Dummy methods to avoid switches and casts where possible,
     136             :         the real token classes have to overload the appropriate method[s].
     137             :         The only methods valid anytime if not overloaded are:
     138             : 
     139             :         - GetByte() since this represents the count of parameters to a function
     140             :           which of course is 0 on non-functions. FormulaByteToken and ScExternal do
     141             :           overload it.
     142             : 
     143             :         - HasForceArray() since also this is only used for operators and
     144             :           functions and is 0 for other tokens.
     145             : 
     146             :         Any other non-overloaded method pops up an assertion.
     147             :      */
     148             : 
     149             :     virtual sal_uInt8           GetByte() const;
     150             :     virtual void                SetByte( sal_uInt8 n );
     151             :     virtual bool                HasForceArray() const;
     152             :     virtual void                SetForceArray( bool b );
     153             :     virtual double              GetDouble() const;
     154             :     virtual double&             GetDoubleAsReference();
     155             :     virtual svl::SharedString GetString() const;
     156             :     virtual sal_uInt16          GetIndex() const;
     157             :     virtual void                SetIndex( sal_uInt16 n );
     158             :     virtual bool                IsGlobal() const;
     159             :     virtual void                SetGlobal( bool b );
     160             :     virtual short*              GetJump() const;
     161             :     virtual const OUString&       GetExternal() const;
     162             :     virtual FormulaToken*       GetFAPOrigToken() const;
     163             :     virtual sal_uInt16          GetError() const;
     164             :     virtual void                SetError( sal_uInt16 );
     165             : 
     166             :     virtual const ScSingleRefData*    GetSingleRef() const;
     167             :     virtual ScSingleRefData*      GetSingleRef();
     168             :     virtual const ScComplexRefData* GetDoubleRef() const;
     169             :     virtual ScComplexRefData*       GetDoubleRef();
     170             :     virtual const ScSingleRefData*    GetSingleRef2() const;
     171             :     virtual ScSingleRefData*      GetSingleRef2();
     172             :     virtual const ScMatrix*     GetMatrix() const;
     173             :     virtual ScMatrix*           GetMatrix();
     174             :     virtual ScJumpMatrix*       GetJumpMatrix() const;
     175             :     virtual const std::vector<ScComplexRefData>* GetRefList() const;
     176             :     virtual       std::vector<ScComplexRefData>* GetRefList();
     177             : 
     178        9674 :     virtual FormulaToken*       Clone() const { return new FormulaToken(*this); }
     179             : 
     180             :     virtual bool                TextEqual( const formula::FormulaToken& rToken ) const;
     181             :     virtual bool                operator==( const FormulaToken& rToken ) const;
     182             : 
     183           0 :     virtual bool isFunction() const SAL_OVERRIDE
     184             :     {
     185           0 :         return IsFunction();
     186             :     }
     187             : 
     188           0 :     virtual sal_uInt32 getArgumentCount() const SAL_OVERRIDE
     189             :     {
     190           0 :         return GetParamCount();
     191             :     }
     192             : 
     193             :     /** This is dirty and only the compiler should use it! */
     194           0 :     struct PrivateAccess { friend class FormulaCompiler; private: PrivateAccess() { }  };
     195           0 :     inline  void                NewOpCode( OpCode e, const PrivateAccess&  ) { eOp = e; }
     196             : 
     197             :     static  sal_Int32           GetStrLenBytes( sal_Int32 nLen )
     198             :                                     { return nLen * sizeof(sal_Unicode); }
     199             :     static  sal_Int32           GetStrLenBytes( const OUString& rStr )
     200             :                                     { return GetStrLenBytes( rStr.getLength() ); }
     201             : };
     202             : 
     203      295424 : inline void intrusive_ptr_add_ref(const FormulaToken* p)
     204             : {
     205      295424 :     p->IncRef();
     206      295424 : }
     207             : 
     208      295424 : inline void intrusive_ptr_release(const FormulaToken* p)
     209             : {
     210      295424 :     p->DecRef();
     211      295424 : }
     212             : 
     213      100826 : class FORMULA_DLLPUBLIC FormulaByteToken : public FormulaToken
     214             : {
     215             : private:
     216             :             sal_uInt8           nByte;
     217             :             bool                bHasForceArray;
     218             : protected:
     219        1984 :                                 FormulaByteToken( OpCode e, sal_uInt8 n, StackVar v, bool b ) :
     220             :                                     FormulaToken( v,e ), nByte( n ),
     221        1984 :                                     bHasForceArray( b ) {}
     222             : public:
     223       23354 :                                 FormulaByteToken( OpCode e, sal_uInt8 n, bool b ) :
     224             :                                     FormulaToken( svByte,e ), nByte( n ),
     225       23354 :                                     bHasForceArray( b ) {}
     226           0 :                                 FormulaByteToken( OpCode e, sal_uInt8 n ) :
     227             :                                     FormulaToken( svByte,e ), nByte( n ),
     228           0 :                                     bHasForceArray( false ) {}
     229       26156 :                                 FormulaByteToken( OpCode e ) :
     230             :                                     FormulaToken( svByte,e ), nByte( 0 ),
     231       26156 :                                     bHasForceArray( false ) {}
     232        5472 :                                 FormulaByteToken( const FormulaByteToken& r ) :
     233             :                                     FormulaToken( r ), nByte( r.nByte ),
     234        5472 :                                     bHasForceArray( r.bHasForceArray ) {}
     235             : 
     236        5458 :     virtual FormulaToken*       Clone() const SAL_OVERRIDE { return new FormulaByteToken(*this); }
     237             :     virtual sal_uInt8           GetByte() const SAL_OVERRIDE;
     238             :     virtual void                SetByte( sal_uInt8 n ) SAL_OVERRIDE;
     239             :     virtual bool                HasForceArray() const SAL_OVERRIDE;
     240             :     virtual void                SetForceArray( bool b ) SAL_OVERRIDE;
     241             :     virtual bool                operator==( const FormulaToken& rToken ) const SAL_OVERRIDE;
     242             : 
     243             :     DECL_FIXEDMEMPOOL_NEWDEL_DLL( FormulaByteToken )
     244             : };
     245             : 
     246             : 
     247             : // A special token for the FormulaAutoPilot only. Keeps a reference pointer of
     248             : // the token of which it was created for comparison.
     249           4 : class FORMULA_DLLPUBLIC FormulaFAPToken : public FormulaByteToken
     250             : {
     251             : private:
     252             :             FormulaTokenRef     pOrigToken;
     253             : public:
     254           2 :                                 FormulaFAPToken( OpCode e, sal_uInt8 n, FormulaToken* p ) :
     255             :                                     FormulaByteToken( e, n, svFAP, false ),
     256           2 :                                     pOrigToken( p ) {}
     257           0 :                                 FormulaFAPToken( const FormulaFAPToken& r ) :
     258           0 :                                     FormulaByteToken( r ), pOrigToken( r.pOrigToken ) {}
     259             : 
     260           0 :     virtual FormulaToken*       Clone() const SAL_OVERRIDE { return new FormulaFAPToken(*this); }
     261             :     virtual FormulaToken*       GetFAPOrigToken() const SAL_OVERRIDE;
     262             :     virtual bool                operator==( const FormulaToken& rToken ) const SAL_OVERRIDE;
     263             : };
     264             : 
     265       83442 : class FORMULA_DLLPUBLIC FormulaDoubleToken : public FormulaToken
     266             : {
     267             : private:
     268             :             double              fDouble;
     269             : public:
     270       39151 :                                 FormulaDoubleToken( double f ) :
     271       39151 :                                     FormulaToken( svDouble ), fDouble( f ) {}
     272        2608 :                                 FormulaDoubleToken( const FormulaDoubleToken& r ) :
     273        2608 :                                     FormulaToken( r ), fDouble( r.fDouble ) {}
     274             : 
     275        2608 :     virtual FormulaToken*       Clone() const SAL_OVERRIDE { return new FormulaDoubleToken(*this); }
     276             :     virtual double              GetDouble() const SAL_OVERRIDE;
     277             :     virtual double&             GetDoubleAsReference() SAL_OVERRIDE;
     278             :     virtual bool                operator==( const FormulaToken& rToken ) const SAL_OVERRIDE;
     279             : 
     280             :     DECL_FIXEDMEMPOOL_NEWDEL_DLL( FormulaDoubleToken )
     281             : };
     282             : 
     283             : 
     284       16264 : class FORMULA_DLLPUBLIC FormulaStringToken : public FormulaToken
     285             : {
     286             :     svl::SharedString maString;
     287             : public:
     288             :     FormulaStringToken( const svl::SharedString& r );
     289             :     FormulaStringToken( const FormulaStringToken& r );
     290             : 
     291             :     virtual FormulaToken* Clone() const SAL_OVERRIDE;
     292             :     virtual svl::SharedString GetString() const SAL_OVERRIDE;
     293             :     virtual bool operator==( const FormulaToken& rToken ) const SAL_OVERRIDE;
     294             : 
     295             :     DECL_FIXEDMEMPOOL_NEWDEL_DLL( FormulaStringToken )
     296             : };
     297             : 
     298             : 
     299             : /** Identical to FormulaStringToken, but with explicit OpCode instead of implicit
     300             :     ocPush, and an optional sal_uInt8 for ocBad tokens. */
     301        3992 : class FORMULA_DLLPUBLIC FormulaStringOpToken : public FormulaByteToken
     302             : {
     303             :     svl::SharedString maString;
     304             : public:
     305             :     FormulaStringOpToken( OpCode e, const svl::SharedString& r );
     306             :     FormulaStringOpToken( const FormulaStringOpToken& r );
     307             : 
     308             :     virtual FormulaToken* Clone() const SAL_OVERRIDE;
     309             :     virtual svl::SharedString GetString() const SAL_OVERRIDE;
     310             :     virtual bool operator==( const FormulaToken& rToken ) const SAL_OVERRIDE;
     311             : };
     312             : 
     313         600 : class FORMULA_DLLPUBLIC FormulaIndexToken : public FormulaToken
     314             : {
     315             : private:
     316             :             sal_uInt16          nIndex;
     317             :             bool                mbGlobal;
     318             : public:
     319         176 :                                 FormulaIndexToken( OpCode e, sal_uInt16 n, bool bGlobal = true ) :
     320         176 :                                     FormulaToken(  svIndex, e ), nIndex( n ), mbGlobal( bGlobal ) {}
     321         124 :                                 FormulaIndexToken( const FormulaIndexToken& r ) :
     322         124 :                                     FormulaToken( r ), nIndex( r.nIndex ), mbGlobal( r.mbGlobal ) {}
     323             : 
     324         124 :     virtual FormulaToken*       Clone() const SAL_OVERRIDE { return new FormulaIndexToken(*this); }
     325             :     virtual sal_uInt16          GetIndex() const SAL_OVERRIDE;
     326             :     virtual void                SetIndex( sal_uInt16 n ) SAL_OVERRIDE;
     327             :     virtual bool                IsGlobal() const SAL_OVERRIDE;
     328             :     virtual void                SetGlobal( bool b ) SAL_OVERRIDE;
     329             :     virtual bool                operator==( const FormulaToken& rToken ) const SAL_OVERRIDE;
     330             : };
     331             : 
     332             : 
     333         348 : class FORMULA_DLLPUBLIC FormulaExternalToken : public FormulaToken
     334             : {
     335             : private:
     336             :             OUString              aExternal;
     337             :             sal_uInt8           nByte;
     338             : public:
     339         172 :                                 FormulaExternalToken( OpCode e, sal_uInt8 n, const OUString& r ) :
     340             :                                     FormulaToken( svExternal, e ), aExternal( r ),
     341         172 :                                     nByte( n ) {}
     342           2 :                                 FormulaExternalToken( OpCode e, const OUString& r ) :
     343             :                                     FormulaToken(svExternal, e ), aExternal( r ),
     344           2 :                                     nByte( 0 ) {}
     345           0 :                                 FormulaExternalToken( const FormulaExternalToken& r ) :
     346             :                                     FormulaToken( r ), aExternal( r.aExternal ),
     347           0 :                                     nByte( r.nByte ) {}
     348             : 
     349           0 :     virtual FormulaToken*       Clone() const SAL_OVERRIDE { return new FormulaExternalToken(*this); }
     350             :     virtual const OUString&       GetExternal() const SAL_OVERRIDE;
     351             :     virtual sal_uInt8           GetByte() const SAL_OVERRIDE;
     352             :     virtual void                SetByte( sal_uInt8 n ) SAL_OVERRIDE;
     353             :     virtual bool                operator==( const FormulaToken& rToken ) const SAL_OVERRIDE;
     354             : };
     355             : 
     356             : 
     357         100 : class FORMULA_DLLPUBLIC FormulaMissingToken : public FormulaToken
     358             : {
     359             : public:
     360          46 :                                 FormulaMissingToken() :
     361          46 :                                     FormulaToken( svMissing,ocMissing ) {}
     362           4 :                                 FormulaMissingToken( const FormulaMissingToken& r ) :
     363           4 :                                     FormulaToken( r ) {}
     364             : 
     365           4 :     virtual FormulaToken*       Clone() const SAL_OVERRIDE { return new FormulaMissingToken(*this); }
     366             :     virtual double              GetDouble() const SAL_OVERRIDE;
     367             :     virtual svl::SharedString GetString() const SAL_OVERRIDE;
     368             :     virtual bool                operator==( const FormulaToken& rToken ) const SAL_OVERRIDE;
     369             : };
     370             : 
     371             : class FORMULA_DLLPUBLIC FormulaJumpToken : public FormulaToken
     372             : {
     373             : private:
     374             :             short*              pJump;
     375             :             bool                bHasForceArray;
     376             : public:
     377         100 :                                 FormulaJumpToken( OpCode e, short* p ) :
     378             :                                     FormulaToken( formula::svJump , e),
     379         100 :                                     bHasForceArray( false)
     380             :                                 {
     381         100 :                                     pJump = new short[ p[0] + 1 ];
     382         100 :                                     memcpy( pJump, p, (p[0] + 1) * sizeof(short) );
     383         100 :                                 }
     384          40 :                                 FormulaJumpToken( const FormulaJumpToken& r ) :
     385             :                                     FormulaToken( r ),
     386          40 :                                     bHasForceArray( r.bHasForceArray)
     387             :                                 {
     388          40 :                                     pJump = new short[ r.pJump[0] + 1 ];
     389          40 :                                     memcpy( pJump, r.pJump, (r.pJump[0] + 1) * sizeof(short) );
     390          40 :                                 }
     391             :     virtual                     ~FormulaJumpToken();
     392             :     virtual short*              GetJump() const SAL_OVERRIDE;
     393             :     virtual bool                operator==( const formula::FormulaToken& rToken ) const SAL_OVERRIDE;
     394          40 :     virtual FormulaToken*       Clone() const SAL_OVERRIDE { return new FormulaJumpToken(*this); }
     395             :     virtual bool                HasForceArray() const SAL_OVERRIDE;
     396             :     virtual void                SetForceArray( bool b ) SAL_OVERRIDE;
     397             : };
     398             : 
     399             : 
     400             : class FORMULA_DLLPUBLIC FormulaSubroutineToken : public FormulaToken
     401             : {
     402             : public:
     403             :     /** Takes ownership of pArray and deletes it upon destruction! */
     404             :                                 FormulaSubroutineToken( const FormulaTokenArray* pArray ) :
     405             :                                     FormulaToken( svSubroutine, ocCall ), mpArray( pArray) {}
     406             :                                 FormulaSubroutineToken( const FormulaSubroutineToken& r );
     407             :     virtual                     ~FormulaSubroutineToken();
     408           0 :     virtual FormulaToken*       Clone() const SAL_OVERRIDE { return new FormulaSubroutineToken(*this); }
     409             :     virtual bool                operator==( const FormulaToken& rToken ) const SAL_OVERRIDE;
     410             : 
     411             : private:
     412             :     const FormulaTokenArray*    mpArray;
     413             : };
     414             : 
     415             : 
     416           0 : class FORMULA_DLLPUBLIC FormulaUnknownToken : public FormulaToken
     417             : {
     418             : public:
     419           0 :                                 FormulaUnknownToken( OpCode e ) :
     420           0 :                                     FormulaToken( svUnknown, e ) {}
     421           0 :                                 FormulaUnknownToken( const FormulaUnknownToken& r ) :
     422           0 :                                     FormulaToken( r ) {}
     423             : 
     424           0 :     virtual FormulaToken*       Clone() const SAL_OVERRIDE { return new FormulaUnknownToken(*this); }
     425             :     virtual bool                operator==( const FormulaToken& rToken ) const SAL_OVERRIDE;
     426             : };
     427             : 
     428             : 
     429        1088 : class FORMULA_DLLPUBLIC FormulaErrorToken : public FormulaToken
     430             : {
     431             :             sal_uInt16          nError;
     432             : public:
     433         544 :                                 FormulaErrorToken( sal_uInt16 nErr ) :
     434         544 :                                     FormulaToken( svError ), nError( nErr) {}
     435           0 :                                 FormulaErrorToken( const FormulaErrorToken& r ) :
     436           0 :                                     FormulaToken( r ), nError( r.nError) {}
     437             : 
     438           0 :     virtual FormulaToken*       Clone() const SAL_OVERRIDE { return new FormulaErrorToken(*this); }
     439             :     virtual sal_uInt16          GetError() const SAL_OVERRIDE;
     440             :     virtual void                SetError( sal_uInt16 nErr ) SAL_OVERRIDE;
     441             :     virtual bool                operator==( const FormulaToken& rToken ) const SAL_OVERRIDE;
     442             : };
     443             : 
     444             : 
     445             : } // formula
     446             : 
     447             : 
     448             : #endif
     449             : 
     450             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10