18550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy/*
28550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy * Copyright (C) 2010 The Android Open Source Project
38550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy *
48550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
58550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy * you may not use this file except in compliance with the License.
68550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy * You may obtain a copy of the License at
78550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy *
88550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
98550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy *
108550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy * Unless required by applicable law or agreed to in writing, software
118550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
128550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy * See the License for the specific language governing permissions and
148550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy * limitations under the License.
158550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy */
168550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_SORTED_LIST_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_SORTED_LIST_H
198550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
208550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy#include <stdint.h>
218550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy#include <sys/types.h>
228550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
238550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy#include <utils/Vector.h>
248550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy#include <utils/TypeHelpers.h>
258550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
268550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy#include "SortedListImpl.h"
278550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
288550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guynamespace android {
298550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guynamespace uirenderer {
308550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
318550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy///////////////////////////////////////////////////////////////////////////////
328550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy// Sorted list
338550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy///////////////////////////////////////////////////////////////////////////////
348550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
358550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
368550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyclass SortedList: private SortedListImpl {
378550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guypublic:
388550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    typedef TYPE value_type;
398550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
408550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    SortedList();
418550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    SortedList(const SortedList<TYPE>& rhs);
428550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    virtual ~SortedList();
438550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
448550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    const SortedList<TYPE>& operator =(const SortedList<TYPE>& rhs) const;
458550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    SortedList<TYPE>& operator =(const SortedList<TYPE>& rhs);
468550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
478550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    inline void clear() {
488550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy        VectorImpl::clear();
498550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    }
508550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
518550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    inline size_t size() const {
528550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy        return VectorImpl::size();
538550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    }
548550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
558550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    inline bool isEmpty() const {
568550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy        return VectorImpl::isEmpty();
578550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    }
588550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
598550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    inline size_t capacity() const {
608550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy        return VectorImpl::capacity();
618550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    }
628550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
638550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    inline ssize_t setCapacity(size_t size) {
648550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy        return VectorImpl::setCapacity(size);
658550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    }
668550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
678550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    inline const TYPE* array() const;
688550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
698550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    TYPE* editArray();
708550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
718550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    ssize_t indexOf(const TYPE& item) const;
728550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    size_t orderOf(const TYPE& item) const;
738550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
748550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    inline const TYPE& operator [](size_t index) const;
758550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    inline const TYPE& itemAt(size_t index) const;
768550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    const TYPE& top() const;
778550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    const TYPE& mirrorItemAt(ssize_t index) const;
788550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
798550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    ssize_t add(const TYPE& item);
808550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
818550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    TYPE& editItemAt(size_t index) {
828550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy        return *(static_cast<TYPE *> (VectorImpl::editItemLocation(index)));
838550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    }
848550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
858550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    ssize_t merge(const Vector<TYPE>& vector);
868550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    ssize_t merge(const SortedList<TYPE>& vector);
878550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
888550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    ssize_t remove(const TYPE&);
898550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
908550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    inline ssize_t removeItemsAt(size_t index, size_t count = 1);
918550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    inline ssize_t removeAt(size_t index) {
928550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy        return removeItemsAt(index);
938550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    }
948550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
958550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyprotected:
968550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    virtual void do_construct(void* storage, size_t num) const;
978550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    virtual void do_destroy(void* storage, size_t num) const;
988550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    virtual void do_copy(void* dest, const void* from, size_t num) const;
998550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    virtual void do_splat(void* dest, const void* item, size_t num) const;
1008550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    virtual void do_move_forward(void* dest, const void* from, size_t num) const;
1018550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    virtual void do_move_backward(void* dest, const void* from, size_t num) const;
1028550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    virtual int do_compare(const void* lhs, const void* rhs) const;
1038550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}; // class SortedList
1048550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1058550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy///////////////////////////////////////////////////////////////////////////////
1068550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy// Implementation
1078550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy///////////////////////////////////////////////////////////////////////////////
1088550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1098550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1108550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline SortedList<TYPE>::SortedList():
1118550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy        SortedListImpl(sizeof(TYPE), ((traits<TYPE>::has_trivial_ctor ? HAS_TRIVIAL_CTOR : 0)
1128550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy            | (traits<TYPE>::has_trivial_dtor ? HAS_TRIVIAL_DTOR : 0)
1138550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy            | (traits<TYPE>::has_trivial_copy ? HAS_TRIVIAL_COPY : 0))) {
1148550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1158550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1168550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1178550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline SortedList<TYPE>::SortedList(const SortedList<TYPE>& rhs): SortedListImpl(rhs) {
1188550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1198550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1208550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE> inline SortedList<TYPE>::~SortedList() {
1218550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    finish_vector();
1228550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1238550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1248550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1258550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline SortedList<TYPE>& SortedList<TYPE>::operator =(const SortedList<TYPE>& rhs) {
1268550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    SortedListImpl::operator =(rhs);
1278550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return *this;
1288550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1298550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1308550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1318550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline const SortedList<TYPE>& SortedList<TYPE>::operator =(
1328550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy        const SortedList<TYPE>& rhs) const {
1338550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    SortedListImpl::operator =(rhs);
1348550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return *this;
1358550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1368550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1378550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1388550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline const TYPE* SortedList<TYPE>::array() const {
1398550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return static_cast<const TYPE *> (arrayImpl());
1408550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1418550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1428550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1438550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline TYPE* SortedList<TYPE>::editArray() {
1448550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return static_cast<TYPE *> (editArrayImpl());
1458550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1468550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1478550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1488550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline const TYPE& SortedList<TYPE>::operator[](size_t index) const {
1498550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    assert( index<size() );
1508550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return *(array() + index);
1518550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1528550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1538550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1548550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline const TYPE& SortedList<TYPE>::itemAt(size_t index) const {
1558550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return operator[](index);
1568550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1578550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1588550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1598550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline const TYPE& SortedList<TYPE>::mirrorItemAt(ssize_t index) const {
1608550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    assert( (index>0 ? index : -index)<size() );
1618550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return *(array() + ((index < 0) ? (size() - index) : index));
1628550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1638550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1648550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1658550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline const TYPE& SortedList<TYPE>::top() const {
1668550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return *(array() + size() - 1);
1678550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1688550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1698550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1708550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline ssize_t SortedList<TYPE>::add(const TYPE& item) {
1718550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return SortedListImpl::add(&item);
1728550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1738550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1748550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1758550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline ssize_t SortedList<TYPE>::indexOf(const TYPE& item) const {
1768550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return SortedListImpl::indexOf(&item);
1778550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1788550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1798550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1808550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline size_t SortedList<TYPE>::orderOf(const TYPE& item) const {
1818550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return SortedListImpl::orderOf(&item);
1828550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1838550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1848550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1858550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline ssize_t SortedList<TYPE>::merge(const Vector<TYPE>& vector) {
1868550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return SortedListImpl::merge(reinterpret_cast<const VectorImpl&> (vector));
1878550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1888550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1898550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1908550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline ssize_t SortedList<TYPE>::merge(const SortedList<TYPE>& vector) {
1918550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return SortedListImpl::merge(reinterpret_cast<const SortedListImpl&> (vector));
1928550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1938550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1948550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
1958550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline ssize_t SortedList<TYPE>::remove(const TYPE& item) {
1968550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return SortedListImpl::remove(&item);
1978550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
1988550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
1998550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
2008550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyinline ssize_t SortedList<TYPE>::removeItemsAt(size_t index, size_t count) {
2018550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return VectorImpl::removeItemsAt(index, count);
2028550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
2038550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
2048550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
2058550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyvoid SortedList<TYPE>::do_construct(void* storage, size_t num) const {
2068550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    construct_type(reinterpret_cast<TYPE*> (storage), num);
2078550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
2088550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
2098550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
2108550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyvoid SortedList<TYPE>::do_destroy(void* storage, size_t num) const {
2118550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    destroy_type(reinterpret_cast<TYPE*> (storage), num);
2128550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
2138550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
2148550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
2158550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyvoid SortedList<TYPE>::do_copy(void* dest, const void* from, size_t num) const {
2168550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    copy_type(reinterpret_cast<TYPE*> (dest), reinterpret_cast<const TYPE*> (from), num);
2178550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
2188550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
2198550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
2208550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyvoid SortedList<TYPE>::do_splat(void* dest, const void* item, size_t num) const {
2218550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    splat_type(reinterpret_cast<TYPE*> (dest), reinterpret_cast<const TYPE*> (item), num);
2228550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
2238550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
2248550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
2258550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyvoid SortedList<TYPE>::do_move_forward(void* dest, const void* from, size_t num) const {
2268550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    move_forward_type(reinterpret_cast<TYPE*> (dest), reinterpret_cast<const TYPE*> (from), num);
2278550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
2288550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
2298550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
2308550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyvoid SortedList<TYPE>::do_move_backward(void* dest, const void* from, size_t num) const {
2318550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    move_backward_type(reinterpret_cast<TYPE*> (dest), reinterpret_cast<const TYPE*> (from), num);
2328550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
2338550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
2348550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guytemplate<class TYPE>
2358550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guyint SortedList<TYPE>::do_compare(const void* lhs, const void* rhs) const {
2368550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy    return compare_type(*reinterpret_cast<const TYPE*> (lhs), *reinterpret_cast<const TYPE*> (rhs));
2378550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}
2388550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
2398550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}; // namespace uirenderer
2408550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy}; // namespace android
2418550c4c7b5952b7a4e1e0ede95c9492d03099a13Romain Guy
2425b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_SORTED_LIST_H
243