LCOV - code coverage report
Current view: top level - media/libstagefright/system/core/include/utils - SortedVector.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 45 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 20 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (C) 2005 The Android Open Source Project
       3             :  *
       4             :  * Licensed under the Apache License, Version 2.0 (the "License");
       5             :  * you may not use this file except in compliance with the License.
       6             :  * You may obtain a copy of the License at
       7             :  *
       8             :  *      http://www.apache.org/licenses/LICENSE-2.0
       9             :  *
      10             :  * Unless required by applicable law or agreed to in writing, software
      11             :  * distributed under the License is distributed on an "AS IS" BASIS,
      12             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      13             :  * See the License for the specific language governing permissions and
      14             :  * limitations under the License.
      15             :  */
      16             : 
      17             : #ifndef ANDROID_SORTED_VECTOR_H
      18             : #define ANDROID_SORTED_VECTOR_H
      19             : 
      20             : #include <assert.h>
      21             : #include <stdint.h>
      22             : #include <sys/types.h>
      23             : 
      24             : #include <cutils/log.h>
      25             : 
      26             : #include <utils/Vector.h>
      27             : #include <utils/VectorImpl.h>
      28             : #include <utils/TypeHelpers.h>
      29             : 
      30             : // ---------------------------------------------------------------------------
      31             : 
      32             : namespace stagefright {
      33             : 
      34             : template <class TYPE>
      35             : class SortedVector : private SortedVectorImpl
      36             : {
      37             :     friend class Vector<TYPE>;
      38             : 
      39             : public:
      40             :             typedef TYPE    value_type;
      41             :     
      42             :     /*! 
      43             :      * Constructors and destructors
      44             :      */
      45             :     
      46             :                             SortedVector();
      47             :                             SortedVector(const SortedVector<TYPE>& rhs);
      48             :     virtual                 ~SortedVector();
      49             : 
      50             :     /*! copy operator */
      51             :     SortedVector<TYPE>&         operator = (const SortedVector<TYPE>& rhs);    
      52             : 
      53             :     /*
      54             :      * empty the vector
      55             :      */
      56             : 
      57           0 :     inline  void            clear()             { VectorImpl::clear(); }
      58             : 
      59             :     /*! 
      60             :      * vector stats
      61             :      */
      62             : 
      63             :     //! returns number of items in the vector
      64           0 :     inline  size_t          size() const                { return VectorImpl::size(); }
      65             :     //! returns whether or not the vector is empty
      66             :     inline  bool            isEmpty() const             { return VectorImpl::isEmpty(); }
      67             :     //! returns how many items can be stored without reallocating the backing store
      68             :     inline  size_t          capacity() const            { return VectorImpl::capacity(); }
      69             :     //! sets the capacity. capacity can never be reduced less than size()
      70             :     inline  ssize_t         setCapacity(size_t size)    { return VectorImpl::setCapacity(size); }
      71             : 
      72             :     /*! 
      73             :      * C-style array access
      74             :      */
      75             :      
      76             :     //! read-only C-style access 
      77             :     inline  const TYPE*     array() const;
      78             : 
      79             :     //! read-write C-style access. BE VERY CAREFUL when modifying the array
      80             :     //! you must keep it sorted! You usually don't use this function.
      81             :             TYPE*           editArray();
      82             : 
      83             :             //! finds the index of an item
      84             :             ssize_t         indexOf(const TYPE& item) const;
      85             :             
      86             :             //! finds where this item should be inserted
      87             :             size_t          orderOf(const TYPE& item) const;
      88             :             
      89             :     
      90             :     /*! 
      91             :      * accessors
      92             :      */
      93             : 
      94             :     //! read-only access to an item at a given index
      95             :     inline  const TYPE&     operator [] (size_t index) const;
      96             :     //! alternate name for operator []
      97             :     inline  const TYPE&     itemAt(size_t index) const;
      98             :     //! stack-usage of the vector. returns the top of the stack (last element)
      99             :             const TYPE&     top() const;
     100             : 
     101             :     /*!
     102             :      * modifying the array
     103             :      */
     104             : 
     105             :             //! add an item in the right place (and replace the one that is there)
     106             :             ssize_t         add(const TYPE& item);
     107             :             
     108             :             //! editItemAt() MUST NOT change the order of this item
     109           0 :             TYPE&           editItemAt(size_t index) {
     110           0 :                 return *( static_cast<TYPE *>(VectorImpl::editItemLocation(index)) );
     111             :             }
     112             : 
     113             :             //! merges a vector into this one
     114             :             ssize_t         merge(const Vector<TYPE>& vector);
     115             :             ssize_t         merge(const SortedVector<TYPE>& vector);
     116             :             
     117             :             //! removes an item
     118             :             ssize_t         remove(const TYPE&);
     119             : 
     120             :     //! remove several items
     121             :     inline  ssize_t         removeItemsAt(size_t index, size_t count = 1);
     122             :     //! remove one item
     123             :     inline  ssize_t         removeAt(size_t index)  { return removeItemsAt(index); }
     124             :             
     125             : protected:
     126             :     virtual void    do_construct(void* storage, size_t num) const;
     127             :     virtual void    do_destroy(void* storage, size_t num) const;
     128             :     virtual void    do_copy(void* dest, const void* from, size_t num) const;
     129             :     virtual void    do_splat(void* dest, const void* item, size_t num) const;
     130             :     virtual void    do_move_forward(void* dest, const void* from, size_t num) const;
     131             :     virtual void    do_move_backward(void* dest, const void* from, size_t num) const;
     132             :     virtual int     do_compare(const void* lhs, const void* rhs) const;
     133             : };
     134             : 
     135             : // SortedVector<T> can be trivially moved using memcpy() because moving does not
     136             : // require any change to the underlying SharedBuffer contents or reference count.
     137             : template<typename T> struct trait_trivial_move<SortedVector<T> > { enum { value = true }; };
     138             : 
     139             : // ---------------------------------------------------------------------------
     140             : // No user serviceable parts from here...
     141             : // ---------------------------------------------------------------------------
     142             : 
     143             : template<class TYPE> inline
     144           0 : SortedVector<TYPE>::SortedVector()
     145             :     : SortedVectorImpl(sizeof(TYPE),
     146             :                 ((traits<TYPE>::has_trivial_ctor   ? HAS_TRIVIAL_CTOR   : 0)
     147             :                 |(traits<TYPE>::has_trivial_dtor   ? HAS_TRIVIAL_DTOR   : 0)
     148             :                 |(traits<TYPE>::has_trivial_copy   ? HAS_TRIVIAL_COPY   : 0))
     149           0 :                 )
     150             : {
     151           0 : }
     152             : 
     153             : template<class TYPE> inline
     154           0 : SortedVector<TYPE>::SortedVector(const SortedVector<TYPE>& rhs)
     155           0 :     : SortedVectorImpl(rhs) {
     156           0 : }
     157             : 
     158             : template<class TYPE> inline
     159           0 : SortedVector<TYPE>::~SortedVector() {
     160           0 :     finish_vector();
     161           0 : }
     162             : 
     163             : template<class TYPE> inline
     164             : SortedVector<TYPE>& SortedVector<TYPE>::operator = (const SortedVector<TYPE>& rhs) {
     165             :     SortedVectorImpl::operator = (rhs);
     166             :     return *this; 
     167             : }
     168             : 
     169             : template<class TYPE> inline
     170           0 : const TYPE* SortedVector<TYPE>::array() const {
     171           0 :     return static_cast<const TYPE *>(arrayImpl());
     172             : }
     173             : 
     174             : template<class TYPE> inline
     175             : TYPE* SortedVector<TYPE>::editArray() {
     176             :     return static_cast<TYPE *>(editArrayImpl());
     177             : }
     178             : 
     179             : 
     180             : template<class TYPE> inline
     181           0 : const TYPE& SortedVector<TYPE>::operator[](size_t index) const {
     182             :     LOG_FATAL_IF(index>=size(),
     183             :             "%s: index=%u out of range (%u)", __PRETTY_FUNCTION__,
     184             :             int(index), int(size()));
     185           0 :     return *(array() + index);
     186             : }
     187             : 
     188             : template<class TYPE> inline
     189           0 : const TYPE& SortedVector<TYPE>::itemAt(size_t index) const {
     190           0 :     return operator[](index);
     191             : }
     192             : 
     193             : template<class TYPE> inline
     194             : const TYPE& SortedVector<TYPE>::top() const {
     195             :     return *(array() + size() - 1);
     196             : }
     197             : 
     198             : template<class TYPE> inline
     199           0 : ssize_t SortedVector<TYPE>::add(const TYPE& item) {
     200           0 :     return SortedVectorImpl::add(&item);
     201             : }
     202             : 
     203             : template<class TYPE> inline
     204           0 : ssize_t SortedVector<TYPE>::indexOf(const TYPE& item) const {
     205           0 :     return SortedVectorImpl::indexOf(&item);
     206             : }
     207             : 
     208             : template<class TYPE> inline
     209             : size_t SortedVector<TYPE>::orderOf(const TYPE& item) const {
     210             :     return SortedVectorImpl::orderOf(&item);
     211             : }
     212             : 
     213             : template<class TYPE> inline
     214             : ssize_t SortedVector<TYPE>::merge(const Vector<TYPE>& vector) {
     215             :     return SortedVectorImpl::merge(reinterpret_cast<const VectorImpl&>(vector));
     216             : }
     217             : 
     218             : template<class TYPE> inline
     219             : ssize_t SortedVector<TYPE>::merge(const SortedVector<TYPE>& vector) {
     220             :     return SortedVectorImpl::merge(reinterpret_cast<const SortedVectorImpl&>(vector));
     221             : }
     222             : 
     223             : template<class TYPE> inline
     224             : ssize_t SortedVector<TYPE>::remove(const TYPE& item) {
     225             :     return SortedVectorImpl::remove(&item);
     226             : }
     227             : 
     228             : template<class TYPE> inline
     229           0 : ssize_t SortedVector<TYPE>::removeItemsAt(size_t index, size_t count) {
     230           0 :     return VectorImpl::removeItemsAt(index, count);
     231             : }
     232             : 
     233             : // ---------------------------------------------------------------------------
     234             : 
     235             : template<class TYPE>
     236           0 : void SortedVector<TYPE>::do_construct(void* storage, size_t num) const {
     237           0 :     construct_type( reinterpret_cast<TYPE*>(storage), num );
     238           0 : }
     239             : 
     240             : template<class TYPE>
     241           0 : void SortedVector<TYPE>::do_destroy(void* storage, size_t num) const {
     242           0 :     destroy_type( reinterpret_cast<TYPE*>(storage), num );
     243           0 : }
     244             : 
     245             : template<class TYPE>
     246           0 : void SortedVector<TYPE>::do_copy(void* dest, const void* from, size_t num) const {
     247           0 :     copy_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(from), num );
     248           0 : }
     249             : 
     250             : template<class TYPE>
     251           0 : void SortedVector<TYPE>::do_splat(void* dest, const void* item, size_t num) const {
     252           0 :     splat_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(item), num );
     253           0 : }
     254             : 
     255             : template<class TYPE>
     256           0 : void SortedVector<TYPE>::do_move_forward(void* dest, const void* from, size_t num) const {
     257           0 :     move_forward_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(from), num );
     258           0 : }
     259             : 
     260             : template<class TYPE>
     261           0 : void SortedVector<TYPE>::do_move_backward(void* dest, const void* from, size_t num) const {
     262           0 :     move_backward_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(from), num );
     263           0 : }
     264             : 
     265             : template<class TYPE>
     266           0 : int SortedVector<TYPE>::do_compare(const void* lhs, const void* rhs) const {
     267           0 :     return compare_type( *reinterpret_cast<const TYPE*>(lhs), *reinterpret_cast<const TYPE*>(rhs) );
     268             : }
     269             : 
     270             : }; // namespace stagefright
     271             : 
     272             : 
     273             : // ---------------------------------------------------------------------------
     274             : 
     275             : #endif // ANDROID_SORTED_VECTOR_H

Generated by: LCOV version 1.13