LCOV - code coverage report
Current view: top level - libreoffice/autodoc/source/display/toolkit - out_position.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 58 77 75.3 %
Date: 2012-12-27 Functions: 13 15 86.7 %
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 <precomp.h>
      21             : #include <toolkit/out_position.hxx>
      22             : 
      23             : 
      24             : // NOT FULLY DEFINED SERVICES
      25             : 
      26             : 
      27             : 
      28             : namespace output
      29             : {
      30             : 
      31             : 
      32             : 
      33             : namespace
      34             : {
      35             : 
      36             : const int       C_nAssumedMaxLinkLength = 500;
      37             : 
      38             : void                move_ToParent(
      39             :                         Node * &            io_node,
      40             :                         intt                i_levels = 1 );
      41             : 
      42             : void
      43      276675 : move_ToParent( Node * &   io_node,
      44             :                intt       i_levels )
      45             : {
      46      684576 :     for ( intt n = 0; n < i_levels; ++n )
      47             :     {
      48             :         csv_assert(io_node != 0);
      49      407901 :         io_node = io_node->Parent();
      50             :     }
      51      276675 : }
      52             : 
      53             : 
      54             : 
      55             : }   // namepace anonymous
      56             : 
      57             : 
      58             : 
      59           1 : Position::Position()
      60             :     :   sFile(),
      61           1 :         pDirectory(&Node::Null_())
      62             : {
      63           1 : }
      64             : 
      65             : 
      66      116386 : Position::Position( Node &              i_directory,
      67             :                     const String &      i_file )
      68             :     :   sFile(i_file),
      69      116386 :         pDirectory(&i_directory)
      70             : {
      71      116386 : }
      72             : 
      73       19040 : Position::Position( const Position &    i_directory,
      74             :                     const String &      i_sDifferentFile )
      75             :     :   sFile(i_sDifferentFile),
      76       19040 :         pDirectory(i_directory.pDirectory)
      77             : {
      78       19040 : }
      79             : 
      80             : 
      81      143258 : Position::~Position()
      82             : {
      83      143258 : }
      84             : 
      85             : 
      86             : Position &
      87           0 : Position::operator=( Node & i_node )
      88             : {
      89           0 :     pDirectory = &i_node;
      90           0 :     sFile.clear();
      91           0 :     return *this;
      92             : }
      93             : 
      94             : Position &
      95         118 : Position::operator+=( const String & i_nodeName )
      96             : {
      97             :     csv_assert(pDirectory != 0);
      98             : 
      99         118 :     pDirectory = &pDirectory->Provide_Child(i_nodeName);
     100         118 :     sFile.clear();
     101             : 
     102         118 :     return *this;
     103             : }
     104             : 
     105             : Position &
     106         118 : Position::operator-=( intt i_levels )
     107             : {
     108             :     csv_assert(pDirectory != 0);
     109             : 
     110         236 :     for ( intt i = i_levels; i > 0; --i )
     111             :     {
     112         118 :         pDirectory = pDirectory->Parent();
     113         118 :         if (pDirectory == 0)
     114             :         {
     115           0 :             pDirectory = &Node::Null_();
     116           0 :             i = 0;
     117             :         }
     118             :     }
     119         118 :     sFile.clear();
     120             : 
     121         118 :     return *this;
     122             : }
     123             : 
     124             : String
     125        7804 : Position::LinkToRoot() const
     126             : {
     127        7804 :     StreamLock sl(C_nAssumedMaxLinkLength);
     128        7804 :     return sl() << get_UpLink(Depth()) << c_str;
     129             : }
     130             : 
     131             : void
     132      168403 : Position::Get_LinkTo( StreamStr &         o_result,
     133             :                       const Position &    i_destination,
     134             :                       const String &      i_localLabel ) const
     135             : {
     136      168403 :     Node * p1 = pDirectory;
     137      168403 :     Node * p2 = i_destination.pDirectory;
     138             : 
     139      168403 :     intt diff = Depth() - i_destination.Depth();
     140      168403 :     intt pathLength1 = 0;
     141      168403 :     intt pathLength2 = 0;
     142             : 
     143      168403 :     if ( diff > 0 )
     144             :     {
     145       37133 :         pathLength1 = diff;
     146       37133 :         move_ToParent(p1,pathLength1);
     147             :     }
     148      131270 :     else if ( diff < 0 )
     149             :     {
     150       46218 :         pathLength2 = -diff;
     151       46218 :         move_ToParent(p2,pathLength2);
     152             :     }
     153             : 
     154      433468 :     while ( p1 != p2 )
     155             :     {
     156       96662 :         move_ToParent(p1);
     157       96662 :         move_ToParent(p2);
     158       96662 :         ++pathLength1;
     159       96662 :         ++pathLength2;
     160             :     }
     161             : 
     162      168403 :     o_result << get_UpLink(pathLength1);
     163      168403 :     i_destination.pDirectory->Get_Path(o_result, pathLength2);
     164      168403 :     o_result << i_destination.sFile;
     165      168403 :     if (i_localLabel.length())
     166           0 :         o_result << "#" << i_localLabel;
     167      168403 : }
     168             : 
     169             : void
     170           0 : Position::Get_LinkToRoot( StreamStr & o_result ) const
     171             : {
     172           0 :     o_result << get_UpLink(Depth());
     173           0 : }
     174             : 
     175             : void
     176           1 : Position::Set( Node &           i_node,
     177             :                const String &   i_file )
     178             : {
     179           1 :     sFile = i_file;
     180           1 :     pDirectory = &i_node;
     181           1 : }
     182             : 
     183             : 
     184             : 
     185             : 
     186             : const char *
     187      176207 : get_UpLink(uintt i_depth)
     188             : {
     189             :     static const uintt
     190             :         C_nMaxDepth = 30;
     191             :     static const char
     192             :         C_sUpLinkArray[3*C_nMaxDepth+1] =
     193             :                         "../../../../../../../../../../"
     194             :                         "../../../../../../../../../../"
     195             :                         "../../../../../../../../../../";
     196             :     static const char *
     197             :         C_sUpLink = &C_sUpLinkArray[0];
     198             : 
     199      176207 :     if ( i_depth <= C_nMaxDepth )
     200             :     {
     201      176207 :         return C_sUpLink + 3*(C_nMaxDepth - i_depth);
     202             :     }
     203             :     else
     204             :     {   // not THREAD fast
     205             :         static std::vector<char>
     206           0 :             aRet;
     207           0 :         uintt nNeededSize = i_depth * 3 + 1;
     208             : 
     209           0 :         if (aRet.size() < nNeededSize)
     210             :         {
     211           0 :             aRet.resize(nNeededSize);
     212           0 :             char * pEnd = &aRet[nNeededSize-1];
     213           0 :             *pEnd = '\0';
     214             : 
     215           0 :             for ( char * pFill = &(*aRet.begin());
     216             :                   pFill != pEnd;
     217             :                   pFill += 3 )
     218             :             {
     219           0 :                 memcpy(pFill, C_sUpLink, 3);
     220             :             }
     221             :         }   // end if
     222             : 
     223           0 :         return &aRet[aRet.size() - 1 - 3*i_depth];
     224             :     }
     225             : }
     226             : 
     227             : 
     228             : 
     229             : 
     230           3 : }   // namespace output
     231             : 
     232             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10