LCOV - code coverage report
Current view: top level - media/libstagefright/system/core/include/utils - VectorImpl.h (source / functions) Hit Total Coverage
Test: output.info Lines: 2 4 50.0 %
Date: 2017-07-14 16:53:18 Functions: 2 4 50.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_VECTOR_IMPL_H
      18             : #define ANDROID_VECTOR_IMPL_H
      19             : 
      20             : #include <assert.h>
      21             : #include <stdint.h>
      22             : #include <sys/types.h>
      23             : #include <utils/Errors.h>
      24             : 
      25             : // ---------------------------------------------------------------------------
      26             : // No user serviceable parts in here...
      27             : // ---------------------------------------------------------------------------
      28             : 
      29             : namespace stagefright {
      30             : 
      31             : /*!
      32             :  * Implementation of the guts of the vector<> class
      33             :  * this ensures backward binary compatibility and
      34             :  * reduces code size.
      35             :  * For performance reasons, we expose mStorage and mCount
      36             :  * so these fields are set in stone.
      37             :  *
      38             :  */
      39             : 
      40             : class VectorImpl
      41             : {
      42             : public:
      43             :     enum { // flags passed to the ctor
      44             :         HAS_TRIVIAL_CTOR    = 0x00000001,
      45             :         HAS_TRIVIAL_DTOR    = 0x00000002,
      46             :         HAS_TRIVIAL_COPY    = 0x00000004,
      47             :     };
      48             : 
      49             :                             VectorImpl(size_t itemSize, uint32_t flags);
      50             :                             VectorImpl(const VectorImpl& rhs);
      51             :     virtual                 ~VectorImpl();
      52             : 
      53             :     /*! must be called from subclasses destructor */
      54             :             void            finish_vector();
      55             : 
      56             :             VectorImpl&     operator = (const VectorImpl& rhs);    
      57             :             
      58             :     /*! C-style array access */
      59         384 :     inline  const void*     arrayImpl() const       { return mStorage; }
      60             :             void*           editArrayImpl();
      61             :             
      62             :     /*! vector stats */
      63         768 :     inline  size_t          size() const        { return mCount; }
      64           0 :     inline  bool            isEmpty() const     { return mCount == 0; }
      65             :             size_t          capacity() const;
      66             :             ssize_t         setCapacity(size_t size);
      67             :             ssize_t         resize(size_t size);
      68             : 
      69             :             /*! append/insert another vector or array */
      70             :             ssize_t         insertVectorAt(const VectorImpl& vector, size_t index);
      71             :             ssize_t         appendVector(const VectorImpl& vector);
      72             :             ssize_t         insertArrayAt(const void* array, size_t index, size_t length);
      73             :             ssize_t         appendArray(const void* array, size_t length);
      74             :             
      75             :             /*! add/insert/replace items */
      76             :             ssize_t         insertAt(size_t where, size_t numItems = 1);
      77             :             ssize_t         insertAt(const void* item, size_t where, size_t numItems = 1);
      78             :             void            pop();
      79             :             void            push();
      80             :             void            push(const void* item);
      81             :             ssize_t         add();
      82             :             ssize_t         add(const void* item);
      83             :             ssize_t         replaceAt(size_t index);
      84             :             ssize_t         replaceAt(const void* item, size_t index);
      85             : 
      86             :             /*! remove items */
      87             :             ssize_t         removeItemsAt(size_t index, size_t count = 1);
      88             :             void            clear();
      89             : 
      90             :             const void*     itemLocation(size_t index) const;
      91             :             void*           editItemLocation(size_t index);
      92             : 
      93             :             typedef int (*compar_t)(const void* lhs, const void* rhs);
      94             :             typedef int (*compar_r_t)(const void* lhs, const void* rhs, void* state);
      95             :             status_t        sort(compar_t cmp);
      96             :             status_t        sort(compar_r_t cmp, void* state);
      97             : 
      98             : protected:
      99             :             size_t          itemSize() const;
     100             :             void            release_storage();
     101             : 
     102             :     virtual void            do_construct(void* storage, size_t num) const = 0;
     103             :     virtual void            do_destroy(void* storage, size_t num) const = 0;
     104             :     virtual void            do_copy(void* dest, const void* from, size_t num) const = 0;
     105             :     virtual void            do_splat(void* dest, const void* item, size_t num) const = 0;
     106             :     virtual void            do_move_forward(void* dest, const void* from, size_t num) const = 0;
     107             :     virtual void            do_move_backward(void* dest, const void* from, size_t num) const = 0;
     108             :     
     109             : private:
     110             :         void* _grow(size_t where, size_t amount);
     111             :         void  _shrink(size_t where, size_t amount);
     112             : 
     113             :         inline void _do_construct(void* storage, size_t num) const;
     114             :         inline void _do_destroy(void* storage, size_t num) const;
     115             :         inline void _do_copy(void* dest, const void* from, size_t num) const;
     116             :         inline void _do_splat(void* dest, const void* item, size_t num) const;
     117             :         inline void _do_move_forward(void* dest, const void* from, size_t num) const;
     118             :         inline void _do_move_backward(void* dest, const void* from, size_t num) const;
     119             : 
     120             :             // These 2 fields are exposed in the inlines below,
     121             :             // so they're set in stone.
     122             :             void *      mStorage;   // base address of the vector
     123             :             size_t      mCount;     // number of items
     124             : 
     125             :     const   uint32_t    mFlags;
     126             :     const   size_t      mItemSize;
     127             : };
     128             : 
     129             : 
     130             : 
     131           0 : class SortedVectorImpl : public VectorImpl
     132             : {
     133             : public:
     134             :                             SortedVectorImpl(size_t itemSize, uint32_t flags);
     135             :                             SortedVectorImpl(const VectorImpl& rhs);
     136             :     virtual                 ~SortedVectorImpl();
     137             :     
     138             :     SortedVectorImpl&     operator = (const SortedVectorImpl& rhs);    
     139             : 
     140             :     //! finds the index of an item
     141             :             ssize_t         indexOf(const void* item) const;
     142             : 
     143             :     //! finds where this item should be inserted
     144             :             size_t          orderOf(const void* item) const;
     145             : 
     146             :     //! add an item in the right place (or replaces it if there is one)
     147             :             ssize_t         add(const void* item);
     148             : 
     149             :     //! merges a vector into this one
     150             :             ssize_t         merge(const VectorImpl& vector);
     151             :             ssize_t         merge(const SortedVectorImpl& vector);
     152             :              
     153             :     //! removes an item
     154             :             ssize_t         remove(const void* item);
     155             :         
     156             : protected:
     157             :     virtual int             do_compare(const void* lhs, const void* rhs) const = 0;
     158             : 
     159             : private:
     160             :             ssize_t         _indexOrderOf(const void* item, size_t* order = 0) const;
     161             : 
     162             :             // these are made private, because they can't be used on a SortedVector
     163             :             // (they don't have an implementation either)
     164             :             ssize_t         add();
     165             :             void            pop();
     166             :             void            push();
     167             :             void            push(const void* item);
     168             :             ssize_t         insertVectorAt(const VectorImpl& vector, size_t index);
     169             :             ssize_t         appendVector(const VectorImpl& vector);
     170             :             ssize_t         insertArrayAt(const void* array, size_t index, size_t length);
     171             :             ssize_t         appendArray(const void* array, size_t length);
     172             :             ssize_t         insertAt(size_t where, size_t numItems = 1);
     173             :             ssize_t         insertAt(const void* item, size_t where, size_t numItems = 1);
     174             :             ssize_t         replaceAt(size_t index);
     175             :             ssize_t         replaceAt(const void* item, size_t index);
     176             : };
     177             : 
     178             : }; // namespace stagefright
     179             : 
     180             : 
     181             : // ---------------------------------------------------------------------------
     182             : 
     183             : #endif // ANDROID_VECTOR_IMPL_H

Generated by: LCOV version 1.13