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

Generated by: LCOV version 1.10