LCOV - code coverage report
Current view: top level - sc/source/core/tool - refdata.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 139 153 90.8 %
Date: 2014-11-03 Functions: 34 36 94.4 %
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             : #include "refdata.hxx"
      21             : 
      22       16374 : void ScSingleRefData::InitAddress( const ScAddress& rAdr )
      23             : {
      24       16374 :     InitAddress( rAdr.Col(), rAdr.Row(), rAdr.Tab());
      25       16374 : }
      26             : 
      27       16374 : void ScSingleRefData::InitAddress( SCCOL nColP, SCROW nRowP, SCTAB nTabP )
      28             : {
      29       16374 :     InitFlags();
      30       16374 :     mnCol = nColP;
      31       16374 :     mnRow = nRowP;
      32       16374 :     mnTab = nTabP;
      33       16374 : }
      34             : 
      35           4 : void ScSingleRefData::InitAddressRel( const ScAddress& rAdr, const ScAddress& rPos )
      36             : {
      37           4 :     InitFlags();
      38           4 :     SetColRel(true);
      39           4 :     SetRowRel(true);
      40           4 :     SetTabRel(true);
      41           4 :     SetAddress(rAdr, rPos);
      42           4 : }
      43             : 
      44       14890 : void ScSingleRefData::SetAbsCol( SCCOL nVal )
      45             : {
      46       14890 :     Flags.bColRel = false;
      47       14890 :     mnCol = nVal;
      48       14890 : }
      49             : 
      50       18216 : void ScSingleRefData::SetRelCol( SCCOL nVal )
      51             : {
      52       18216 :     Flags.bColRel = true;
      53       18216 :     mnCol = nVal;
      54       18216 : }
      55             : 
      56          12 : void ScSingleRefData::IncCol( SCCOL nInc )
      57             : {
      58          12 :     mnCol += nInc;
      59          12 : }
      60             : 
      61       15038 : void ScSingleRefData::SetAbsRow( SCROW nVal )
      62             : {
      63       15038 :     Flags.bRowRel = false;
      64       15038 :     mnRow = nVal;
      65       15038 : }
      66             : 
      67       18120 : void ScSingleRefData::SetRelRow( SCROW nVal )
      68             : {
      69       18120 :     Flags.bRowRel = true;
      70       18120 :     mnRow = nVal;
      71       18120 : }
      72             : 
      73          26 : void ScSingleRefData::IncRow( SCROW nInc )
      74             : {
      75          26 :     mnRow += nInc;
      76          26 : }
      77             : 
      78       18146 : void ScSingleRefData::SetAbsTab( SCTAB nVal )
      79             : {
      80       18146 :     Flags.bTabRel = false;
      81       18146 :     mnTab = nVal;
      82       18146 : }
      83             : 
      84       15102 : void ScSingleRefData::SetRelTab( SCTAB nVal )
      85             : {
      86       15102 :     Flags.bTabRel = true;
      87       15102 :     mnTab = nVal;
      88       15102 : }
      89             : 
      90           6 : void ScSingleRefData::IncTab( SCTAB nInc )
      91             : {
      92           6 :     mnTab += nInc;
      93           6 : }
      94             : 
      95         302 : void ScSingleRefData::SetColDeleted( bool bVal )
      96             : {
      97         302 :     Flags.bColDeleted = bVal;
      98         302 : }
      99             : 
     100         300 : void ScSingleRefData::SetRowDeleted( bool bVal )
     101             : {
     102         300 :     Flags.bRowDeleted = bVal;
     103         300 : }
     104             : 
     105         358 : void ScSingleRefData::SetTabDeleted( bool bVal )
     106             : {
     107         358 :     Flags.bTabDeleted = bVal;
     108         358 : }
     109             : 
     110        3084 : bool ScSingleRefData::IsDeleted() const
     111             : {
     112        3084 :     return IsColDeleted() || IsRowDeleted() || IsTabDeleted();
     113             : }
     114             : 
     115       23220 : bool ScSingleRefData::Valid() const
     116             : {
     117       23220 :     return ColValid() && RowValid() && TabValid();
     118             : }
     119             : 
     120       23220 : bool ScSingleRefData::ColValid() const
     121             : {
     122       23220 :     if (Flags.bColRel)
     123             :     {
     124        4850 :         if (mnCol < -MAXCOL || MAXCOL < mnCol)
     125           0 :             return false;
     126             :     }
     127             :     else
     128             :     {
     129       18370 :         if (mnCol < 0 || MAXCOL < mnCol)
     130           0 :             return false;
     131             :     }
     132             : 
     133       23220 :     return true;
     134             : }
     135             : 
     136       23220 : bool ScSingleRefData::RowValid() const
     137             : {
     138       23220 :     if (Flags.bRowRel)
     139             :     {
     140        4856 :         if (mnRow < -MAXROW || MAXROW < mnRow)
     141           0 :             return false;
     142             :     }
     143             :     else
     144             :     {
     145       18364 :         if (mnRow < 0 || MAXROW < mnRow)
     146           0 :             return false;
     147             :     }
     148             : 
     149       23220 :     return true;
     150             : }
     151             : 
     152       23220 : bool ScSingleRefData::TabValid() const
     153             : {
     154       23220 :     if (Flags.bTabRel)
     155             :     {
     156        6478 :         if (mnTab < -MAXTAB || MAXTAB < mnTab)
     157           0 :             return false;
     158             :     }
     159             :     else
     160             :     {
     161       16742 :         if (mnTab < 0 || MAXTAB < mnTab)
     162           0 :             return false;
     163             :     }
     164             : 
     165       23220 :     return true;
     166             : }
     167             : 
     168           0 : bool ScSingleRefData::ValidExternal() const
     169             : {
     170           0 :     return ColValid() && RowValid() && mnTab == -1;
     171             : }
     172             : 
     173      291330 : ScAddress ScSingleRefData::toAbs( const ScAddress& rPos ) const
     174             : {
     175      291330 :     SCCOL nRetCol = Flags.bColRel ? mnCol + rPos.Col() : mnCol;
     176      291330 :     SCROW nRetRow = Flags.bRowRel ? mnRow + rPos.Row() : mnRow;
     177      291330 :     SCTAB nRetTab = Flags.bTabRel ? mnTab + rPos.Tab() : mnTab;
     178             : 
     179      291330 :     ScAddress aAbs(ScAddress::INITIALIZE_INVALID);
     180             : 
     181      291330 :     if (ValidCol(nRetCol))
     182      291294 :         aAbs.SetCol(nRetCol);
     183             : 
     184      291330 :     if (ValidRow(nRetRow))
     185      291308 :         aAbs.SetRow(nRetRow);
     186             : 
     187      291330 :     if (ValidTab(nRetTab))
     188      291190 :         aAbs.SetTab(nRetTab);
     189             : 
     190      291330 :     return aAbs;
     191             : }
     192             : 
     193       67538 : void ScSingleRefData::SetAddress( const ScAddress& rAddr, const ScAddress& rPos )
     194             : {
     195       67538 :     if (Flags.bColRel)
     196       30932 :         mnCol = rAddr.Col() - rPos.Col();
     197             :     else
     198       36606 :         mnCol = rAddr.Col();
     199             : 
     200       67538 :     if (Flags.bRowRel)
     201       30822 :         mnRow = rAddr.Row() - rPos.Row();
     202             :     else
     203       36716 :         mnRow = rAddr.Row();
     204             : 
     205       67538 :     if (Flags.bTabRel)
     206       29742 :         mnTab = rAddr.Tab() - rPos.Tab();
     207             :     else
     208       37796 :         mnTab = rAddr.Tab();
     209       67538 : }
     210             : 
     211       58910 : SCROW ScSingleRefData::Row() const
     212             : {
     213       58910 :     if (Flags.bRowDeleted)
     214          12 :         return -1;
     215       58898 :     return mnRow;
     216             : }
     217             : 
     218       59082 : SCCOL ScSingleRefData::Col() const
     219             : {
     220       59082 :     if (Flags.bColDeleted)
     221          18 :         return -1;
     222       59064 :     return mnCol;
     223             : }
     224             : 
     225       58752 : SCTAB ScSingleRefData::Tab() const
     226             : {
     227       58752 :     if (Flags.bTabDeleted)
     228           0 :         return -1;
     229       58752 :     return mnTab;
     230             : }
     231             : 
     232       21682 : bool ScSingleRefData::operator==( const ScSingleRefData& r ) const
     233             : {
     234       21682 :     return mnFlagValue == r.mnFlagValue && mnCol == r.mnCol && mnRow == r.mnRow && mnTab == r.mnTab;
     235             : }
     236             : 
     237       21616 : bool ScSingleRefData::operator!=( const ScSingleRefData& r ) const
     238             : {
     239       21616 :     return !operator==(r);
     240             : }
     241             : 
     242             : #if DEBUG_FORMULA_COMPILER
     243             : void ScSingleRefData::Dump( int nIndent ) const
     244             : {
     245             :     std::string aIndent;
     246             :     for (int i = 0; i < nIndent; ++i)
     247             :         aIndent += "  ";
     248             : 
     249             :     cout << aIndent << "address type column: " << (IsColRel()?"relative":"absolute")
     250             :          << "  row : " << (IsRowRel()?"relative":"absolute") << "  sheet: "
     251             :          << (IsTabRel()?"relative":"absolute") << endl;
     252             :     cout << aIndent << "deleted column: " << (IsColDeleted()?"yes":"no")
     253             :          << "  row : " << (IsRowDeleted()?"yes":"no") << "  sheet: "
     254             :          << (IsTabDeleted()?"yes":"no") << endl;
     255             :     cout << aIndent << "column: " << mnCol << "  row: " << mnRow << "  sheet: " << mnTab << endl;
     256             :     cout << aIndent << "3d ref: " << (IsFlag3D()?"yes":"no") << endl;
     257             : }
     258             : #endif
     259             : 
     260           6 : ScComplexRefData& ScComplexRefData::Extend( const ScSingleRefData & rRef, const ScAddress & rPos )
     261             : {
     262           6 :     ScRange aAbsRange = toAbs(rPos);
     263           6 :     ScAddress aAbs = rRef.toAbs(rPos);
     264             : 
     265           6 :     if (aAbs.Col() < aAbsRange.aStart.Col())
     266           2 :         aAbsRange.aStart.SetCol(aAbs.Col());
     267             : 
     268           6 :     if (aAbs.Row() < aAbsRange.aStart.Row())
     269           0 :         aAbsRange.aStart.SetRow(aAbs.Row());
     270             : 
     271           6 :     if (aAbs.Tab() < aAbsRange.aStart.Tab())
     272           0 :         aAbsRange.aStart.SetTab(aAbs.Tab());
     273             : 
     274           6 :     if (aAbsRange.aEnd.Col() < aAbs.Col())
     275           4 :         aAbsRange.aEnd.SetCol(aAbs.Col());
     276             : 
     277           6 :     if (aAbsRange.aEnd.Row() < aAbs.Row())
     278           4 :         aAbsRange.aEnd.SetRow(aAbs.Row());
     279             : 
     280           6 :     if (aAbsRange.aEnd.Tab() < aAbs.Tab())
     281           0 :         aAbsRange.aEnd.SetTab(aAbs.Tab());
     282             : 
     283           6 :     SetRange(aAbsRange, rPos);
     284             : 
     285           6 :     return *this;
     286             : }
     287             : 
     288           2 : ScComplexRefData& ScComplexRefData::Extend( const ScComplexRefData & rRef, const ScAddress & rPos )
     289             : {
     290           2 :     return Extend( rRef.Ref1, rPos).Extend( rRef.Ref2, rPos);
     291             : }
     292             : 
     293        7458 : bool ScComplexRefData::Valid() const
     294             : {
     295        7458 :     return Ref1.Valid() && Ref2.Valid();
     296             : }
     297             : 
     298           0 : bool ScComplexRefData::ValidExternal() const
     299             : {
     300           0 :     return Ref1.ValidExternal() && Ref2.ColValid() && Ref2.RowValid() && Ref1.Tab() <= Ref2.Tab();
     301             : }
     302             : 
     303       49107 : ScRange ScComplexRefData::toAbs( const ScAddress& rPos ) const
     304             : {
     305       49107 :     return ScRange(Ref1.toAbs(rPos), Ref2.toAbs(rPos));
     306             : }
     307             : 
     308       22068 : void ScComplexRefData::SetRange( const ScRange& rRange, const ScAddress& rPos )
     309             : {
     310       22068 :     Ref1.SetAddress(rRange.aStart, rPos);
     311       22068 :     Ref2.SetAddress(rRange.aEnd, rPos);
     312       22296 : }
     313             : 
     314             : #if DEBUG_FORMULA_COMPILER
     315             : void ScComplexRefData::Dump( int nIndent ) const
     316             : {
     317             :     std::string aIndent;
     318             :     for (int i = 0; i < nIndent; ++i)
     319             :         aIndent += "  ";
     320             : 
     321             :     cout << aIndent << "ref 1" << endl;
     322             :     Ref1.Dump(nIndent+1);
     323             :     cout << aIndent << "ref 2" << endl;
     324             :     Ref2.Dump(nIndent+1);
     325             : }
     326             : #endif
     327             : 
     328             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10