LCOV - code coverage report
Current view: top level - solver/unxlngi6.pro/inc/comphelper - sequence.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 42 68 61.8 %
Date: 2012-08-25 Functions: 26 79 32.9 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 18 102 17.6 %

           Branch data     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 _COMPHELPER_SEQUENCE_HXX_
      21                 :            : #define _COMPHELPER_SEQUENCE_HXX_
      22                 :            : 
      23                 :            : #include <algorithm> // copy algorithm
      24                 :            : #include <com/sun/star/uno/Sequence.hxx>
      25                 :            : #include <osl/diagnose.h>
      26                 :            : #include "comphelper/comphelperdllapi.h"
      27                 :            : 
      28                 :            : #include <vector>
      29                 :            : 
      30                 :            : //.........................................................................
      31                 :            : namespace comphelper
      32                 :            : {
      33                 :            : //.........................................................................
      34                 :            : 
      35                 :            :     namespace staruno   = ::com::sun::star::uno;
      36                 :            : 
      37                 :            :     //-------------------------------------------------------------------------
      38                 :            :     /** search the given string within the given sequence, return the positions where it was found.
      39                 :            :         if _bOnlyFirst is sal_True, only the first occurrence will be returned.
      40                 :            :     */
      41                 :            :     COMPHELPER_DLLPUBLIC staruno::Sequence<sal_Int16> findValue(const staruno::Sequence< ::rtl::OUString >& _rList, const ::rtl::OUString& _rValue, sal_Bool _bOnlyFirst = sal_False);
      42                 :            : 
      43                 :            :     /** Checks if the name exists
      44                 :            :      *
      45                 :            :      * \param Value   The value to search for.
      46                 :            :      * \param _aList  The list in which to search for the value.
      47                 :            :      * \return <TRUE/> if the value can be found, otherwise <FALSE/>.
      48                 :            :      */
      49                 :            :     COMPHELPER_DLLPUBLIC sal_Bool existsValue(const ::rtl::OUString& Value,const ::com::sun::star::uno::Sequence< ::rtl::OUString >& _aList);
      50                 :            : 
      51                 :            : 
      52                 :            :     //-------------------------------------------------------------------------
      53                 :            :     namespace internal
      54                 :            :     {
      55                 :            :         template <class T>
      56                 :       7168 :         void implCopySequence(const T* _pSource, T*& _pDest, sal_Int32 _nSourceLen)
      57                 :            :         {
      58 [ +  + ][ +  + ]:      79120 :             for (sal_Int32 i=0; i<_nSourceLen; ++i, ++_pSource, ++_pDest)
         [ #  # ][ #  # ]
                 [ #  # ]
      59                 :      71950 :                 *_pDest = *_pSource;
      60                 :       7168 :         }
      61                 :            :     }
      62                 :            :     //-------------------------------------------------------------------------
      63                 :            :     /// concat two sequences
      64                 :            :     template <class T>
      65                 :       3140 :      staruno::Sequence<T> concatSequences(const staruno::Sequence<T>& _rLeft, const staruno::Sequence<T>& _rRight)
      66                 :            :     {
      67                 :       3140 :         sal_Int32 nLeft(_rLeft.getLength()), nRight(_rRight.getLength());
      68                 :       3140 :         const T* pLeft = _rLeft.getConstArray();
      69                 :       3140 :         const T* pRight = _rRight.getConstArray();
      70                 :            : 
      71                 :       3140 :         sal_Int32 nReturnLen(nLeft + nRight);
      72   [ +  -  #  # ]:       3140 :         staruno::Sequence<T> aReturn(nReturnLen);
      73 [ +  - ][ #  # ]:       3140 :         T* pReturn = aReturn.getArray();
      74                 :            : 
      75         [ #  # ]:       3140 :         internal::implCopySequence(pLeft, pReturn, nLeft);
      76         [ #  # ]:       3140 :         internal::implCopySequence(pRight, pReturn, nRight);
      77                 :            : 
      78                 :       3140 :         return aReturn;
      79                 :            :     }
      80                 :            : 
      81                 :            :     //-------------------------------------------------------------------------
      82                 :            :     /// concat three sequences
      83                 :            :     template <class T>
      84                 :        296 :     staruno::Sequence<T> concatSequences(const staruno::Sequence<T>& _rLeft, const staruno::Sequence<T>& _rMiddle, const staruno::Sequence<T>& _rRight)
      85                 :            :     {
      86                 :        296 :         sal_Int32 nLeft(_rLeft.getLength()), nMiddle(_rMiddle.getLength()), nRight(_rRight.getLength());
      87                 :        296 :         const T* pLeft = _rLeft.getConstArray();
      88                 :        296 :         const T* pMiddle = _rMiddle.getConstArray();
      89                 :        296 :         const T* pRight = _rRight.getConstArray();
      90                 :            : 
      91                 :        296 :         sal_Int32 nReturnLen(nLeft + nMiddle + nRight);
      92         [ +  - ]:        296 :         staruno::Sequence<T> aReturn(nReturnLen);
      93         [ +  - ]:        296 :         T* pReturn = aReturn.getArray();
      94                 :            : 
      95                 :        296 :         internal::implCopySequence(pLeft, pReturn, nLeft);
      96                 :        296 :         internal::implCopySequence(pMiddle, pReturn, nMiddle);
      97                 :        296 :         internal::implCopySequence(pRight, pReturn, nRight);
      98                 :            : 
      99                 :        296 :         return aReturn;
     100                 :            :     }
     101                 :            : 
     102                 :            :     //-------------------------------------------------------------------------
     103                 :            :     /// remove a specified element from a sequences
     104                 :            :     template<class T>
     105                 :       5485 :     void removeElementAt(staruno::Sequence<T>& _rSeq, sal_Int32 _nPos)
     106                 :            :     {
     107                 :       5485 :         sal_uInt32 nLength = _rSeq.getLength();
     108                 :            : 
     109                 :            :         OSL_ENSURE(0 <= _nPos && (sal_uInt32)_nPos < nLength, "invalid index");
     110                 :            : 
     111 [ +  + ][ +  + ]:      73798 :         for (sal_uInt32 i = (sal_uInt32)_nPos + 1; i < nLength; ++i)
                 [ -  + ]
     112                 :            :         {
     113                 :      68313 :             _rSeq[i-1] = _rSeq[i];
     114                 :            :         }
     115                 :            : 
     116                 :       5485 :         _rSeq.realloc(nLength-1);
     117                 :       5485 :     }
     118                 :            : 
     119                 :            :     //=====================================================================
     120                 :            :     //= iterating through sequences
     121                 :            :     //=====================================================================
     122                 :            :     /** a helper class for iterating through a sequence
     123                 :            :     */
     124                 :            :     template <class TYPE>
     125                 :            :     class OSequenceIterator
     126                 :            :     {
     127                 :            :         const TYPE* m_pElements;
     128                 :            :         sal_Int32   m_nLen;
     129                 :            :         const TYPE* m_pCurrent;
     130                 :            : 
     131                 :            :     public:
     132                 :            :         /** contrcuct a sequence iterator from a sequence
     133                 :            :         */
     134                 :            :         OSequenceIterator(const ::com::sun::star::uno::Sequence< TYPE >& _rSeq);
     135                 :            :         /** contrcuct a sequence iterator from a Any containing a sequence
     136                 :            :         */
     137                 :            :         OSequenceIterator(const ::com::sun::star::uno::Any& _rSequenceAny);
     138                 :            : 
     139                 :            :         sal_Bool hasMoreElements() const;
     140                 :            :         ::com::sun::star::uno::Any  nextElement();
     141                 :            : 
     142                 :            :     private:
     143                 :            :         void construct(const ::com::sun::star::uno::Sequence< TYPE >& _rSeq);
     144                 :            :     };
     145                 :            : 
     146                 :            :     //---------------------------------------------------------------------
     147                 :            :     template <class TYPE>
     148                 :            :     OSequenceIterator<TYPE>::OSequenceIterator(const ::com::sun::star::uno::Sequence< TYPE >& _rSeq)
     149                 :            :         :m_pElements(NULL)
     150                 :            :         ,m_nLen(0)
     151                 :            :         ,m_pCurrent(NULL)
     152                 :            :     {
     153                 :            :         construct(_rSeq);
     154                 :            :     }
     155                 :            : 
     156                 :            :     //---------------------------------------------------------------------
     157                 :            :     template <class TYPE>
     158                 :          0 :     OSequenceIterator<TYPE>::OSequenceIterator(const ::com::sun::star::uno::Any& _rSequenceAny)
     159                 :            :         :m_pElements(NULL)
     160                 :            :         ,m_nLen(0)
     161                 :          0 :         ,m_pCurrent(NULL)
     162                 :            :     {
     163 [ #  # ][ #  # ]:          0 :         ::com::sun::star::uno::Sequence< TYPE > aContainer;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     164 [ #  # ][ #  # ]:          0 :         sal_Bool bSuccess = _rSequenceAny >>= aContainer;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     165                 :            :         OSL_ENSURE(bSuccess, "OSequenceIterator::OSequenceIterator: invalid Any!");
     166                 :            :         (void)bSuccess;
     167 [ #  # ][ #  # ]:          0 :         construct(aContainer);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     168                 :          0 :     }
     169                 :            : 
     170                 :            :     //---------------------------------------------------------------------
     171                 :            :     template <class TYPE>
     172                 :          0 :     void OSequenceIterator<TYPE>::construct(const ::com::sun::star::uno::Sequence< TYPE >& _rSeq)
     173                 :            :     {
     174                 :          0 :         m_pElements = _rSeq.getConstArray();
     175                 :          0 :         m_nLen = _rSeq.getLength();
     176                 :          0 :         m_pCurrent = m_pElements;
     177                 :          0 :     }
     178                 :            : 
     179                 :            :     //---------------------------------------------------------------------
     180                 :            :     template <class TYPE>
     181                 :          0 :     sal_Bool OSequenceIterator<TYPE>::hasMoreElements() const
     182                 :            :     {
     183                 :          0 :         return m_pCurrent - m_pElements < m_nLen;
     184                 :            :     }
     185                 :            : 
     186                 :            :     //---------------------------------------------------------------------
     187                 :            :     template <class TYPE>
     188                 :          0 :     ::com::sun::star::uno::Any OSequenceIterator<TYPE>::nextElement()
     189                 :            :     {
     190                 :          0 :         return ::com::sun::star::uno::makeAny(*m_pCurrent++);
     191                 :            :     }
     192                 :            : 
     193                 :            :     //-------------------------------------------------------------------------
     194                 :            :     /** Copy from a plain C/C++ array into a Sequence.
     195                 :            : 
     196                 :            :         @tpl SrcType
     197                 :            :         Array element type. Must be assignable to DstType
     198                 :            : 
     199                 :            :         @tpl DstType
     200                 :            :         Sequence element type. Must be assignable from SrcType
     201                 :            : 
     202                 :            :         @param i_pArray
     203                 :            :         Valid pointer to at least num elements of type SrcType
     204                 :            : 
     205                 :            :         @param nNum
     206                 :            :         Number of array elements to copy
     207                 :            : 
     208                 :            :         @return the resulting Sequence
     209                 :            : 
     210                 :            :         @attention when copying from e.g. a double array to a
     211                 :            :         Sequence<int>, no proper rounding will be performed, but the
     212                 :            :         values will be truncated. There's currently no measure to
     213                 :            :         prevent or detect precision loss, overflow or truncation.
     214                 :            :      */
     215                 :            :     template < typename DstType, typename SrcType >
     216                 :          0 :     ::com::sun::star::uno::Sequence< DstType > arrayToSequence( const SrcType* i_pArray, sal_Int32 nNum )
     217                 :            :     {
     218                 :          0 :         ::com::sun::star::uno::Sequence< DstType > result( nNum );
     219 [ #  # ][ #  # ]:          0 :         ::std::copy( i_pArray, i_pArray+nNum, result.getArray() );
     220                 :          0 :         return result;
     221                 :            :     }
     222                 :            : 
     223                 :            :     //-------------------------------------------------------------------------
     224                 :            :     /** Copy from a Sequence into a plain C/C++ array
     225                 :            : 
     226                 :            :         @tpl SrcType
     227                 :            :         Sequence element type. Must be assignable to DstType
     228                 :            : 
     229                 :            :         @tpl DstType
     230                 :            :         Array element type. Must be assignable from SrcType
     231                 :            : 
     232                 :            :         @param io_pArray
     233                 :            :         Valid pointer to at least i_Sequence.getLength() elements of
     234                 :            :         type DstType
     235                 :            : 
     236                 :            :         @param i_Sequence
     237                 :            :         Reference to a Sequence of SrcType elements
     238                 :            : 
     239                 :            :         @return a pointer to the array
     240                 :            : 
     241                 :            :         @attention when copying from e.g. a Sequence<double> to an int
     242                 :            :         array, no proper rounding will be performed, but the values
     243                 :            :         will be truncated. There's currently no measure to prevent or
     244                 :            :         detect precision loss, overflow or truncation.
     245                 :            :      */
     246                 :            :     template < typename DstType, typename SrcType >
     247                 :          0 :     DstType* sequenceToArray( DstType* io_pArray, const ::com::sun::star::uno::Sequence< SrcType >& i_Sequence )
     248                 :            :     {
     249                 :          0 :         ::std::copy( i_Sequence.getConstArray(), i_Sequence.getConstArray()+i_Sequence.getLength(), io_pArray );
     250                 :          0 :         return io_pArray;
     251                 :            :     }
     252                 :            : 
     253                 :            :     //-------------------------------------------------------------------------
     254                 :            :     /** Copy from a container into a Sequence
     255                 :            : 
     256                 :            :         @tpl SrcType
     257                 :            :         Container type. This type must fulfill the STL container
     258                 :            :         concept, in particular, the size(), begin() and end() methods
     259                 :            :         must be available and have the usual semantics.
     260                 :            : 
     261                 :            :         @tpl DstType
     262                 :            :         Sequence element type. Must be assignable from SrcType's
     263                 :            :         elements
     264                 :            : 
     265                 :            :         @param i_Container
     266                 :            :         Reference to the input contain with elements of type SrcType
     267                 :            : 
     268                 :            :         @return the generated Sequence
     269                 :            : 
     270                 :            :         @attention this function always performs a copy. Furthermore,
     271                 :            :         when copying from e.g. a vector<double> to a Sequence<int>, no
     272                 :            :         proper rounding will be performed, but the values will be
     273                 :            :         truncated. There's currently no measure to prevent or detect
     274                 :            :         precision loss, overflow or truncation.
     275                 :            :      */
     276                 :            :     template < typename DstType, typename SrcType >
     277                 :          8 :     ::com::sun::star::uno::Sequence< DstType > containerToSequence( const SrcType& i_Container )
     278                 :            :     {
     279                 :          8 :         ::com::sun::star::uno::Sequence< DstType > result( i_Container.size() );
     280   [ +  -  #  # ]:          8 :         ::std::copy( i_Container.begin(), i_Container.end(), result.getArray() );
         [ #  # ][ +  - ]
     281                 :          8 :         return result;
     282                 :            :     }
     283                 :            : 
     284                 :            :     template <typename T>
     285                 :      74345 :     inline ::com::sun::star::uno::Sequence<T> containerToSequence(
     286                 :            :         ::std::vector<T> const& v )
     287                 :            :     {
     288                 :            :         return ::com::sun::star::uno::Sequence<T>(
     289 [ +  + ][ -  + ]:      74345 :             v.empty() ? 0 : &v[0], static_cast<sal_Int32>(v.size()) );
     290                 :            :     }
     291                 :            : 
     292                 :            :     //-------------------------------------------------------------------------
     293                 :            :     /** Copy from a Sequence into a container
     294                 :            : 
     295                 :            :         @tpl SrcType
     296                 :            :         Sequence element type. Must be assignable to SrcType's
     297                 :            :         elements
     298                 :            : 
     299                 :            :         @tpl DstType
     300                 :            :         Container type. This type must fulfill the STL container and
     301                 :            :         sequence concepts, in particular, the begin(), end() and the
     302                 :            :         unary constructor DstType(int) methods must be available and
     303                 :            :         have the usual semantics.
     304                 :            : 
     305                 :            :         @param i_Sequence
     306                 :            :         Reference to a Sequence of SrcType elements
     307                 :            : 
     308                 :            :         @return the generated container
     309                 :            : 
     310                 :            :         @attention this function always performs a copy. Furthermore,
     311                 :            :         when copying from e.g. a Sequence<double> to a vector<int>, no
     312                 :            :         proper rounding will be performed, but the values will be
     313                 :            :         truncated. There's currently no measure to prevent or detect
     314                 :            :         precision loss, overflow or truncation.
     315                 :            :      */
     316                 :            :     template < typename DstType, typename SrcType >
     317                 :          0 :     DstType sequenceToContainer( const ::com::sun::star::uno::Sequence< SrcType >& i_Sequence )
     318                 :            :     {
     319                 :          0 :         DstType result( i_Sequence.getLength() );
     320                 :          0 :         ::std::copy( i_Sequence.getConstArray(), i_Sequence.getConstArray()+i_Sequence.getLength(), result.begin() );
     321                 :          0 :         return result;
     322                 :            :     }
     323                 :            :     //-------------------------------------------------------------------------
     324                 :            :     /** Copy from a Sequence into an existing container
     325                 :            : 
     326                 :            :         This potentially saves a needless extra copy operation over
     327                 :            :         the whole container, as it passes the target object by
     328                 :            :         reference.
     329                 :            : 
     330                 :            :         @tpl SrcType
     331                 :            :         Sequence element type. Must be assignable to SrcType's
     332                 :            :         elements
     333                 :            : 
     334                 :            :         @tpl DstType
     335                 :            :         Container type. This type must fulfill the STL container and
     336                 :            :         sequence concepts, in particular, the begin(), end() and
     337                 :            :         resize(int) methods must be available and have the usual
     338                 :            :         semantics.
     339                 :            : 
     340                 :            :         @param o_Output
     341                 :            :         Reference to the target container
     342                 :            : 
     343                 :            :         @param i_Sequence
     344                 :            :         Reference to a Sequence of SrcType elements
     345                 :            : 
     346                 :            :         @return a non-const reference to the given container
     347                 :            : 
     348                 :            :         @attention this function always performs a copy. Furthermore,
     349                 :            :         when copying from e.g. a Sequence<double> to a vector<int>, no
     350                 :            :         proper rounding will be performed, but the values will be
     351                 :            :         truncated. There's currently no measure to prevent or detect
     352                 :            :         precision loss, overflow or truncation.
     353                 :            :      */
     354                 :            :     template < typename DstType, typename SrcType >
     355                 :         15 :     DstType& sequenceToContainer( DstType& o_Output, const ::com::sun::star::uno::Sequence< SrcType >& i_Sequence )
     356                 :            :     {
     357                 :         15 :         o_Output.resize( i_Sequence.getLength() );
     358                 :         15 :         ::std::copy( i_Sequence.getConstArray(), i_Sequence.getConstArray()+i_Sequence.getLength(), o_Output.begin() );
     359                 :         15 :         return o_Output;
     360                 :            :     }
     361                 :            : 
     362                 :            : //.........................................................................
     363                 :            : }   // namespace comphelper
     364                 :            : //.........................................................................
     365                 :            : 
     366                 :            : 
     367                 :            : #endif // _COMPHELPER_SEQUENCE_HXX_
     368                 :            : 
     369                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10