1 /* 2 * Copyright (C) 2010 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_HWUI_SORTED_LIST_H 18 #define ANDROID_HWUI_SORTED_LIST_H 19 20 #include <stdint.h> 21 #include <sys/types.h> 22 23 #include <utils/Vector.h> 24 #include <utils/TypeHelpers.h> 25 26 #include "SortedListImpl.h" 27 28 namespace android { 29 namespace uirenderer { 30 31 /////////////////////////////////////////////////////////////////////////////// 32 // Sorted list 33 /////////////////////////////////////////////////////////////////////////////// 34 35 template<class TYPE> 36 class SortedList: private SortedListImpl { 37 public: 38 typedef TYPE value_type; 39 40 SortedList(); 41 SortedList(const SortedList<TYPE>& rhs); 42 virtual ~SortedList(); 43 44 const SortedList<TYPE>& operator =(const SortedList<TYPE>& rhs) const; 45 SortedList<TYPE>& operator =(const SortedList<TYPE>& rhs); 46 47 inline void clear() { 48 VectorImpl::clear(); 49 } 50 51 inline size_t size() const { 52 return VectorImpl::size(); 53 } 54 55 inline bool isEmpty() const { 56 return VectorImpl::isEmpty(); 57 } 58 59 inline size_t capacity() const { 60 return VectorImpl::capacity(); 61 } 62 63 inline ssize_t setCapacity(size_t size) { 64 return VectorImpl::setCapacity(size); 65 } 66 67 inline const TYPE* array() const; 68 69 TYPE* editArray(); 70 71 ssize_t indexOf(const TYPE& item) const; 72 size_t orderOf(const TYPE& item) const; 73 74 inline const TYPE& operator [](size_t index) const; 75 inline const TYPE& itemAt(size_t index) const; 76 const TYPE& top() const; 77 const TYPE& mirrorItemAt(ssize_t index) const; 78 79 ssize_t add(const TYPE& item); 80 81 TYPE& editItemAt(size_t index) { 82 return *(static_cast<TYPE *> (VectorImpl::editItemLocation(index))); 83 } 84 85 ssize_t merge(const Vector<TYPE>& vector); 86 ssize_t merge(const SortedList<TYPE>& vector); 87 88 ssize_t remove(const TYPE&); 89 90 inline ssize_t removeItemsAt(size_t index, size_t count = 1); 91 inline ssize_t removeAt(size_t index) { 92 return removeItemsAt(index); 93 } 94 95 protected: 96 virtual void do_construct(void* storage, size_t num) const; 97 virtual void do_destroy(void* storage, size_t num) const; 98 virtual void do_copy(void* dest, const void* from, size_t num) const; 99 virtual void do_splat(void* dest, const void* item, size_t num) const; 100 virtual void do_move_forward(void* dest, const void* from, size_t num) const; 101 virtual void do_move_backward(void* dest, const void* from, size_t num) const; 102 virtual int do_compare(const void* lhs, const void* rhs) const; 103 }; // class SortedList 104 105 /////////////////////////////////////////////////////////////////////////////// 106 // Implementation 107 /////////////////////////////////////////////////////////////////////////////// 108 109 template<class TYPE> 110 inline SortedList<TYPE>::SortedList(): 111 SortedListImpl(sizeof(TYPE), ((traits<TYPE>::has_trivial_ctor ? HAS_TRIVIAL_CTOR : 0) 112 | (traits<TYPE>::has_trivial_dtor ? HAS_TRIVIAL_DTOR : 0) 113 | (traits<TYPE>::has_trivial_copy ? HAS_TRIVIAL_COPY : 0))) { 114 } 115 116 template<class TYPE> 117 inline SortedList<TYPE>::SortedList(const SortedList<TYPE>& rhs): SortedListImpl(rhs) { 118 } 119 120 template<class TYPE> inline SortedList<TYPE>::~SortedList() { 121 finish_vector(); 122 } 123 124 template<class TYPE> 125 inline SortedList<TYPE>& SortedList<TYPE>::operator =(const SortedList<TYPE>& rhs) { 126 SortedListImpl::operator =(rhs); 127 return *this; 128 } 129 130 template<class TYPE> 131 inline const SortedList<TYPE>& SortedList<TYPE>::operator =( 132 const SortedList<TYPE>& rhs) const { 133 SortedListImpl::operator =(rhs); 134 return *this; 135 } 136 137 template<class TYPE> 138 inline const TYPE* SortedList<TYPE>::array() const { 139 return static_cast<const TYPE *> (arrayImpl()); 140 } 141 142 template<class TYPE> 143 inline TYPE* SortedList<TYPE>::editArray() { 144 return static_cast<TYPE *> (editArrayImpl()); 145 } 146 147 template<class TYPE> 148 inline const TYPE& SortedList<TYPE>::operator[](size_t index) const { 149 assert( index<size() ); 150 return *(array() + index); 151 } 152 153 template<class TYPE> 154 inline const TYPE& SortedList<TYPE>::itemAt(size_t index) const { 155 return operator[](index); 156 } 157 158 template<class TYPE> 159 inline const TYPE& SortedList<TYPE>::mirrorItemAt(ssize_t index) const { 160 assert( (index>0 ? index : -index)<size() ); 161 return *(array() + ((index < 0) ? (size() - index) : index)); 162 } 163 164 template<class TYPE> 165 inline const TYPE& SortedList<TYPE>::top() const { 166 return *(array() + size() - 1); 167 } 168 169 template<class TYPE> 170 inline ssize_t SortedList<TYPE>::add(const TYPE& item) { 171 return SortedListImpl::add(&item); 172 } 173 174 template<class TYPE> 175 inline ssize_t SortedList<TYPE>::indexOf(const TYPE& item) const { 176 return SortedListImpl::indexOf(&item); 177 } 178 179 template<class TYPE> 180 inline size_t SortedList<TYPE>::orderOf(const TYPE& item) const { 181 return SortedListImpl::orderOf(&item); 182 } 183 184 template<class TYPE> 185 inline ssize_t SortedList<TYPE>::merge(const Vector<TYPE>& vector) { 186 return SortedListImpl::merge(reinterpret_cast<const VectorImpl&> (vector)); 187 } 188 189 template<class TYPE> 190 inline ssize_t SortedList<TYPE>::merge(const SortedList<TYPE>& vector) { 191 return SortedListImpl::merge(reinterpret_cast<const SortedListImpl&> (vector)); 192 } 193 194 template<class TYPE> 195 inline ssize_t SortedList<TYPE>::remove(const TYPE& item) { 196 return SortedListImpl::remove(&item); 197 } 198 199 template<class TYPE> 200 inline ssize_t SortedList<TYPE>::removeItemsAt(size_t index, size_t count) { 201 return VectorImpl::removeItemsAt(index, count); 202 } 203 204 template<class TYPE> 205 void SortedList<TYPE>::do_construct(void* storage, size_t num) const { 206 construct_type(reinterpret_cast<TYPE*> (storage), num); 207 } 208 209 template<class TYPE> 210 void SortedList<TYPE>::do_destroy(void* storage, size_t num) const { 211 destroy_type(reinterpret_cast<TYPE*> (storage), num); 212 } 213 214 template<class TYPE> 215 void SortedList<TYPE>::do_copy(void* dest, const void* from, size_t num) const { 216 copy_type(reinterpret_cast<TYPE*> (dest), reinterpret_cast<const TYPE*> (from), num); 217 } 218 219 template<class TYPE> 220 void SortedList<TYPE>::do_splat(void* dest, const void* item, size_t num) const { 221 splat_type(reinterpret_cast<TYPE*> (dest), reinterpret_cast<const TYPE*> (item), num); 222 } 223 224 template<class TYPE> 225 void SortedList<TYPE>::do_move_forward(void* dest, const void* from, size_t num) const { 226 move_forward_type(reinterpret_cast<TYPE*> (dest), reinterpret_cast<const TYPE*> (from), num); 227 } 228 229 template<class TYPE> 230 void SortedList<TYPE>::do_move_backward(void* dest, const void* from, size_t num) const { 231 move_backward_type(reinterpret_cast<TYPE*> (dest), reinterpret_cast<const TYPE*> (from), num); 232 } 233 234 template<class TYPE> 235 int SortedList<TYPE>::do_compare(const void* lhs, const void* rhs) const { 236 return compare_type(*reinterpret_cast<const TYPE*> (lhs), *reinterpret_cast<const TYPE*> (rhs)); 237 } 238 239 }; // namespace uirenderer 240 }; // namespace android 241 242 #endif // ANDROID_HWUI_SORTED_LIST_H 243