OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 private: | 150 private: |
151 inline bool checkIndexBound(size_t, ExceptionState&); | 151 inline bool checkIndexBound(size_t, ExceptionState&); |
152 bool removeFromOldOwnerListAndAdjustIndex(PassRefPtr<ItemPropertyType>, size
_t* indexToModify); | 152 bool removeFromOldOwnerListAndAdjustIndex(PassRefPtr<ItemPropertyType>, size
_t* indexToModify); |
153 size_t findItem(PassRefPtr<ItemPropertyType>); | 153 size_t findItem(PassRefPtr<ItemPropertyType>); |
154 | 154 |
155 Vector<RefPtr<ItemPropertyType> > m_values; | 155 Vector<RefPtr<ItemPropertyType> > m_values; |
156 | 156 |
157 static PassRefPtr<Derived> toDerived(PassRefPtr<NewSVGPropertyBase> passBase
) | 157 static PassRefPtr<Derived> toDerived(PassRefPtr<NewSVGPropertyBase> passBase
) |
158 { | 158 { |
159 if (!passBase) | 159 if (!passBase) |
160 return 0; | 160 return nullptr; |
161 | 161 |
162 RefPtr<NewSVGPropertyBase> base = passBase; | 162 RefPtr<NewSVGPropertyBase> base = passBase; |
163 ASSERT(base->type() == Derived::classType()); | 163 ASSERT(base->type() == Derived::classType()); |
164 return static_pointer_cast<Derived>(base); | 164 return static_pointer_cast<Derived>(base); |
165 } | 165 } |
166 }; | 166 }; |
167 | 167 |
168 template<typename Derived, typename ItemProperty> | 168 template<typename Derived, typename ItemProperty> |
169 bool NewSVGListPropertyHelper<Derived, ItemProperty>::operator==(const Derived&
other) const | 169 bool NewSVGListPropertyHelper<Derived, ItemProperty>::operator==(const Derived&
other) const |
170 { | 170 { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 // Spec: Clears all existing current items from the list and re-initializes
the list to hold the single item specified by the parameter. | 205 // Spec: Clears all existing current items from the list and re-initializes
the list to hold the single item specified by the parameter. |
206 clear(); | 206 clear(); |
207 append(newItem); | 207 append(newItem); |
208 return newItem.release(); | 208 return newItem.release(); |
209 } | 209 } |
210 | 210 |
211 template<typename Derived, typename ItemProperty> | 211 template<typename Derived, typename ItemProperty> |
212 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::getIte
m(size_t index, ExceptionState& exceptionState) | 212 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::getIte
m(size_t index, ExceptionState& exceptionState) |
213 { | 213 { |
214 if (!checkIndexBound(index, exceptionState)) | 214 if (!checkIndexBound(index, exceptionState)) |
215 return 0; | 215 return nullptr; |
216 | 216 |
217 ASSERT(index < m_values.size()); | 217 ASSERT(index < m_values.size()); |
218 ASSERT(m_values.at(index)->ownerList() == this); | 218 ASSERT(m_values.at(index)->ownerList() == this); |
219 return m_values.at(index); | 219 return m_values.at(index); |
220 } | 220 } |
221 | 221 |
222 template<typename Derived, typename ItemProperty> | 222 template<typename Derived, typename ItemProperty> |
223 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::insert
ItemBefore(PassRefPtr<ItemProperty> passNewItem, size_t index) | 223 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::insert
ItemBefore(PassRefPtr<ItemProperty> passNewItem, size_t index) |
224 { | 224 { |
225 // Spec: If the index is greater than or equal to numberOfItems, then the ne
w item is appended to the end of the list. | 225 // Spec: If the index is greater than or equal to numberOfItems, then the ne
w item is appended to the end of the list. |
(...skipping 14 matching lines...) Expand all Loading... |
240 newItem->setOwnerList(this); | 240 newItem->setOwnerList(this); |
241 | 241 |
242 return newItem.release(); | 242 return newItem.release(); |
243 } | 243 } |
244 | 244 |
245 template<typename Derived, typename ItemProperty> | 245 template<typename Derived, typename ItemProperty> |
246 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::remove
Item(size_t index, ExceptionState& exceptionState) | 246 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::remove
Item(size_t index, ExceptionState& exceptionState) |
247 { | 247 { |
248 if (index >= m_values.size()) { | 248 if (index >= m_values.size()) { |
249 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde
xExceedsMaximumBound("index", index, m_values.size())); | 249 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde
xExceedsMaximumBound("index", index, m_values.size())); |
250 return 0; | 250 return nullptr; |
251 } | 251 } |
252 ASSERT(m_values.at(index)->ownerList() == this); | 252 ASSERT(m_values.at(index)->ownerList() == this); |
253 RefPtr<ItemPropertyType> oldItem = m_values.at(index); | 253 RefPtr<ItemPropertyType> oldItem = m_values.at(index); |
254 m_values.remove(index); | 254 m_values.remove(index); |
255 oldItem->setOwnerList(0); | 255 oldItem->setOwnerList(0); |
256 return oldItem.release(); | 256 return oldItem.release(); |
257 } | 257 } |
258 | 258 |
259 template<typename Derived, typename ItemProperty> | 259 template<typename Derived, typename ItemProperty> |
260 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::append
Item(PassRefPtr<ItemProperty> passNewItem) | 260 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::append
Item(PassRefPtr<ItemProperty> passNewItem) |
261 { | 261 { |
262 RefPtr<ItemPropertyType> newItem = passNewItem; | 262 RefPtr<ItemPropertyType> newItem = passNewItem; |
263 | 263 |
264 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. | 264 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. |
265 removeFromOldOwnerListAndAdjustIndex(newItem, 0); | 265 removeFromOldOwnerListAndAdjustIndex(newItem, 0); |
266 | 266 |
267 // Append the value and wrapper at the end of the list. | 267 // Append the value and wrapper at the end of the list. |
268 append(newItem); | 268 append(newItem); |
269 | 269 |
270 return newItem.release(); | 270 return newItem.release(); |
271 } | 271 } |
272 | 272 |
273 template<typename Derived, typename ItemProperty> | 273 template<typename Derived, typename ItemProperty> |
274 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::replac
eItem(PassRefPtr<ItemProperty> passNewItem, size_t index, ExceptionState& except
ionState) | 274 PassRefPtr<ItemProperty> NewSVGListPropertyHelper<Derived, ItemProperty>::replac
eItem(PassRefPtr<ItemProperty> passNewItem, size_t index, ExceptionState& except
ionState) |
275 { | 275 { |
276 if (!checkIndexBound(index, exceptionState)) | 276 if (!checkIndexBound(index, exceptionState)) |
277 return 0; | 277 return nullptr; |
278 | 278 |
279 RefPtr<ItemPropertyType> newItem = passNewItem; | 279 RefPtr<ItemPropertyType> newItem = passNewItem; |
280 | 280 |
281 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. | 281 // Spec: If newItem is already in a list, it is removed from its previous li
st before it is inserted into this list. |
282 // Spec: If the item is already in this list, note that the index of the ite
m to replace is before the removal of the item. | 282 // Spec: If the item is already in this list, note that the index of the ite
m to replace is before the removal of the item. |
283 if (!removeFromOldOwnerListAndAdjustIndex(newItem, &index)) { | 283 if (!removeFromOldOwnerListAndAdjustIndex(newItem, &index)) { |
284 // Replacing the item with itself is a no-op. | 284 // Replacing the item with itself is a no-op. |
285 return newItem.release(); | 285 return newItem.release(); |
286 } | 286 } |
287 | 287 |
288 if (m_values.isEmpty()) { | 288 if (m_values.isEmpty()) { |
289 // 'newItem' already lived in our list, we removed it, and now we're emp
ty, which means there's nothing to replace. | 289 // 'newItem' already lived in our list, we removed it, and now we're emp
ty, which means there's nothing to replace. |
290 exceptionState.throwDOMException(IndexSizeError, String::format("Failed
to replace the provided item at index %zu.", index)); | 290 exceptionState.throwDOMException(IndexSizeError, String::format("Failed
to replace the provided item at index %zu.", index)); |
291 return 0; | 291 return nullptr; |
292 } | 292 } |
293 | 293 |
294 // Update the value at the desired position 'index'. | 294 // Update the value at the desired position 'index'. |
295 RefPtr<ItemPropertyType>& position = m_values[index]; | 295 RefPtr<ItemPropertyType>& position = m_values[index]; |
296 ASSERT(position->ownerList() == this); | 296 ASSERT(position->ownerList() == this); |
297 position->setOwnerList(0); | 297 position->setOwnerList(0); |
298 position = newItem; | 298 position = newItem; |
299 newItem->setOwnerList(this); | 299 newItem->setOwnerList(this); |
300 | 300 |
301 return newItem.release(); | 301 return newItem.release(); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 typename Vector<RefPtr<ItemPropertyType> >::const_iterator it = from->m_valu
es.begin(); | 362 typename Vector<RefPtr<ItemPropertyType> >::const_iterator it = from->m_valu
es.begin(); |
363 typename Vector<RefPtr<ItemPropertyType> >::const_iterator itEnd = from->m_v
alues.end(); | 363 typename Vector<RefPtr<ItemPropertyType> >::const_iterator itEnd = from->m_v
alues.end(); |
364 for (; it != itEnd; ++it) { | 364 for (; it != itEnd; ++it) { |
365 append((*it)->clone()); | 365 append((*it)->clone()); |
366 } | 366 } |
367 } | 367 } |
368 | 368 |
369 } | 369 } |
370 | 370 |
371 #endif // NewSVGListPropertyHelper_h | 371 #endif // NewSVGListPropertyHelper_h |
OLD | NEW |