OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 return m_impl.capacity(); | 280 return m_impl.capacity(); |
281 } | 281 } |
282 | 282 |
283 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 283 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
284 inline bool HashMap<T, U, V, W, X, Y>::isEmpty() const | 284 inline bool HashMap<T, U, V, W, X, Y>::isEmpty() const |
285 { | 285 { |
286 return m_impl.isEmpty(); | 286 return m_impl.isEmpty(); |
287 } | 287 } |
288 | 288 |
289 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 289 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
290 inline typename HashMap<T, U, V, W, X, Y>::iterator HashMap<T, U, V, W, X, Y
>::begin() | 290 inline auto HashMap<T, U, V, W, X, Y>::begin() -> iterator |
291 { | 291 { |
292 return m_impl.begin(); | 292 return m_impl.begin(); |
293 } | 293 } |
294 | 294 |
295 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 295 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
296 inline typename HashMap<T, U, V, W, X, Y>::iterator HashMap<T, U, V, W, X, Y
>::end() | 296 inline auto HashMap<T, U, V, W, X, Y>::end() -> iterator |
297 { | 297 { |
298 return m_impl.end(); | 298 return m_impl.end(); |
299 } | 299 } |
300 | 300 |
301 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 301 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
302 inline typename HashMap<T, U, V, W, X, Y>::const_iterator HashMap<T, U, V, W
, X, Y>::begin() const | 302 inline auto HashMap<T, U, V, W, X, Y>::begin() const -> const_iterator |
303 { | 303 { |
304 return m_impl.begin(); | 304 return m_impl.begin(); |
305 } | 305 } |
306 | 306 |
307 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 307 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
308 inline typename HashMap<T, U, V, W, X, Y>::const_iterator HashMap<T, U, V, W
, X, Y>::end() const | 308 inline auto HashMap<T, U, V, W, X, Y>::end() const -> const_iterator |
309 { | 309 { |
310 return m_impl.end(); | 310 return m_impl.end(); |
311 } | 311 } |
312 | 312 |
313 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 313 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
314 inline typename HashMap<T, U, V, W, X, Y>::iterator HashMap<T, U, V, W, X, Y
>::find(KeyPeekInType key) | 314 inline auto HashMap<T, U, V, W, X, Y>::find(KeyPeekInType key) -> iterator |
315 { | 315 { |
316 return m_impl.find(key); | 316 return m_impl.find(key); |
317 } | 317 } |
318 | 318 |
319 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 319 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
320 inline typename HashMap<T, U, V, W, X, Y>::const_iterator HashMap<T, U, V, W
, X, Y>::find(KeyPeekInType key) const | 320 auto HashMap<T, U, V, W, X, Y>::find(KeyPeekInType key) const -> const_itera
tor |
321 { | 321 { |
322 return m_impl.find(key); | 322 return m_impl.find(key); |
323 } | 323 } |
324 | 324 |
325 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 325 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
326 inline bool HashMap<T, U, V, W, X, Y>::contains(KeyPeekInType key) const | 326 inline bool HashMap<T, U, V, W, X, Y>::contains(KeyPeekInType key) const |
327 { | 327 { |
328 return m_impl.contains(key); | 328 return m_impl.contains(key); |
329 } | 329 } |
330 | 330 |
331 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 331 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
332 template<typename HashTranslator, typename TYPE> | 332 template<typename HashTranslator, typename TYPE> |
333 inline typename HashMap<T, U, V, W, X, Y>::iterator | 333 auto HashMap<T, U, V, W, X, Y>::find(const TYPE& value) -> iterator |
334 HashMap<T, U, V, W, X, Y>::find(const TYPE& value) | |
335 { | 334 { |
336 return m_impl.template find<HashMapTranslatorAdapter<ValueTraits, HashTr
anslator>>(value); | 335 return m_impl.template find<HashMapTranslatorAdapter<ValueTraits, HashTr
anslator>>(value); |
337 } | 336 } |
338 | 337 |
339 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 338 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
340 template<typename HashTranslator, typename TYPE> | 339 template<typename HashTranslator, typename TYPE> |
341 inline typename HashMap<T, U, V, W, X, Y>::const_iterator | 340 auto HashMap<T, U, V, W, X, Y>::find(const TYPE& value) const -> const_itera
tor |
342 HashMap<T, U, V, W, X, Y>::find(const TYPE& value) const | |
343 { | 341 { |
344 return m_impl.template find<HashMapTranslatorAdapter<ValueTraits, HashTr
anslator>>(value); | 342 return m_impl.template find<HashMapTranslatorAdapter<ValueTraits, HashTr
anslator>>(value); |
345 } | 343 } |
346 | 344 |
347 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 345 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
348 template<typename HashTranslator, typename TYPE> | 346 template<typename HashTranslator, typename TYPE> |
349 inline bool | 347 inline bool |
350 HashMap<T, U, V, W, X, Y>::contains(const TYPE& value) const | 348 HashMap<T, U, V, W, X, Y>::contains(const TYPE& value) const |
351 { | 349 { |
352 return m_impl.template contains<HashMapTranslatorAdapter<ValueTraits, Ha
shTranslator>>(value); | 350 return m_impl.template contains<HashMapTranslatorAdapter<ValueTraits, Ha
shTranslator>>(value); |
353 } | 351 } |
354 | 352 |
355 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 353 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
356 typename HashMap<T, U, V, W, X, Y>::AddResult | 354 auto HashMap<T, U, V, W, X, Y>::inlineAdd(KeyPeekInType key, MappedPassInRef
erenceType mapped) -> AddResult |
357 HashMap<T, U, V, W, X, Y>::inlineAdd(KeyPeekInType key, MappedPassInReferenc
eType mapped) | |
358 { | 355 { |
359 return m_impl.template add<HashMapTranslator<ValueTraits, HashFunctions>
>(key, mapped); | 356 return m_impl.template add<HashMapTranslator<ValueTraits, HashFunctions>
>(key, mapped); |
360 } | 357 } |
361 | 358 |
362 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 359 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
363 typename HashMap<T, U, V, W, X, Y>::AddResult | 360 auto HashMap<T, U, V, W, X, Y>::set(KeyPeekInType key, MappedPassInType mapp
ed) -> AddResult |
364 HashMap<T, U, V, W, X, Y>::set(KeyPeekInType key, MappedPassInType mapped) | |
365 { | 361 { |
366 AddResult result = inlineAdd(key, mapped); | 362 AddResult result = inlineAdd(key, mapped); |
367 if (!result.isNewEntry) { | 363 if (!result.isNewEntry) { |
368 // The inlineAdd call above found an existing hash table entry; we n
eed to set the mapped value. | 364 // The inlineAdd call above found an existing hash table entry; we n
eed to set the mapped value. |
369 MappedTraits::store(mapped, result.storedValue->value); | 365 MappedTraits::store(mapped, result.storedValue->value); |
370 } | 366 } |
371 return result; | 367 return result; |
372 } | 368 } |
373 | 369 |
374 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 370 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
375 template<typename HashTranslator, typename TYPE> | 371 template<typename HashTranslator, typename TYPE> |
376 typename HashMap<T, U, V, W, X, Y>::AddResult | 372 auto HashMap<T, U, V, W, X, Y>::add(const TYPE& key, MappedPassInType value)
-> AddResult |
377 HashMap<T, U, V, W, X, Y>::add(const TYPE& key, MappedPassInType value) | |
378 { | 373 { |
379 return m_impl.template addPassingHashCode<HashMapTranslatorAdapter<Value
Traits, HashTranslator>>(key, value); | 374 return m_impl.template addPassingHashCode<HashMapTranslatorAdapter<Value
Traits, HashTranslator>>(key, value); |
380 } | 375 } |
381 | 376 |
382 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 377 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
383 typename HashMap<T, U, V, W, X, Y>::AddResult | 378 auto HashMap<T, U, V, W, X, Y>::add(KeyPeekInType key, MappedPassInType mapp
ed) -> AddResult |
384 HashMap<T, U, V, W, X, Y>::add(KeyPeekInType key, MappedPassInType mapped) | |
385 { | 379 { |
386 return inlineAdd(key, mapped); | 380 return inlineAdd(key, mapped); |
387 } | 381 } |
388 | 382 |
389 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 383 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
390 typename HashMap<T, U, V, W, X, Y>::MappedPeekType | 384 auto HashMap<T, U, V, W, X, Y>::get(KeyPeekInType key) const -> MappedPeekTy
pe |
391 HashMap<T, U, V, W, X, Y>::get(KeyPeekInType key) const | |
392 { | 385 { |
393 ValueType* entry = const_cast<HashTableType&>(m_impl).lookup(key); | 386 ValueType* entry = const_cast<HashTableType&>(m_impl).lookup(key); |
394 if (!entry) | 387 if (!entry) |
395 return MappedTraits::peek(MappedTraits::emptyValue()); | 388 return MappedTraits::peek(MappedTraits::emptyValue()); |
396 return MappedTraits::peek(entry->value); | 389 return MappedTraits::peek(entry->value); |
397 } | 390 } |
398 | 391 |
399 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 392 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
400 inline void HashMap<T, U, V, W, X, Y>::remove(iterator it) | 393 inline void HashMap<T, U, V, W, X, Y>::remove(iterator it) |
401 { | 394 { |
402 m_impl.remove(it.m_impl); | 395 m_impl.remove(it.m_impl); |
403 } | 396 } |
404 | 397 |
405 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 398 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
406 inline void HashMap<T, U, V, W, X, Y>::remove(KeyPeekInType key) | 399 inline void HashMap<T, U, V, W, X, Y>::remove(KeyPeekInType key) |
407 { | 400 { |
408 remove(find(key)); | 401 remove(find(key)); |
409 } | 402 } |
410 | 403 |
411 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 404 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
412 inline void HashMap<T, U, V, W, X, Y>::clear() | 405 inline void HashMap<T, U, V, W, X, Y>::clear() |
413 { | 406 { |
414 m_impl.clear(); | 407 m_impl.clear(); |
415 } | 408 } |
416 | 409 |
417 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 410 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
418 typename HashMap<T, U, V, W, X, Y>::MappedPassOutType | 411 auto HashMap<T, U, V, W, X, Y>::take(KeyPeekInType key) -> MappedPassOutType |
419 HashMap<T, U, V, W, X, Y>::take(KeyPeekInType key) | |
420 { | 412 { |
421 iterator it = find(key); | 413 iterator it = find(key); |
422 if (it == end()) | 414 if (it == end()) |
423 return MappedTraits::passOut(MappedTraits::emptyValue()); | 415 return MappedTraits::passOut(MappedTraits::emptyValue()); |
424 MappedPassOutType result = MappedTraits::passOut(it->value); | 416 MappedPassOutType result = MappedTraits::passOut(it->value); |
425 remove(it); | 417 remove(it); |
426 return result; | 418 return result; |
427 } | 419 } |
428 | 420 |
429 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> | 421 template<typename T, typename U, typename V, typename W, typename X, typenam
e Y> |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 struct NeedsTracing<HashMap<T, U, V, W, X>> { | 491 struct NeedsTracing<HashMap<T, U, V, W, X>> { |
500 static const bool value = false; | 492 static const bool value = false; |
501 }; | 493 }; |
502 #endif | 494 #endif |
503 | 495 |
504 } // namespace WTF | 496 } // namespace WTF |
505 | 497 |
506 using WTF::HashMap; | 498 using WTF::HashMap; |
507 | 499 |
508 #endif /* WTF_HashMap_h */ | 500 #endif /* WTF_HashMap_h */ |
OLD | NEW |