hash_unique_ptr.pass.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. // <memory>
  9. // template <class T, class D>
  10. // struct hash<unique_ptr<T, D>>
  11. // {
  12. // typedef unique_ptr<T, D> argument_type;
  13. // typedef size_t result_type;
  14. // size_t operator()(const unique_ptr<T, D>& p) const;
  15. // };
  16. #include <memory>
  17. #include <cassert>
  18. #include "test_macros.h"
  19. #if TEST_STD_VER >= 11
  20. #include "poisoned_hash_helper.h"
  21. #include "deleter_types.h"
  22. #include "min_allocator.h"
  23. template <class ValueT, class Del>
  24. void test_enabled_with_deleter() {
  25. using UPtr = std::unique_ptr<ValueT, Del>;
  26. using pointer = typename UPtr::pointer;
  27. using RawDel = typename std::decay<Del>::type;
  28. RawDel d(1);
  29. UPtr p(nullptr, std::forward<Del>(d));
  30. test_hash_enabled_for_type<UPtr>(p);
  31. test_hash_enabled_for_type<pointer>();
  32. }
  33. template <class ValueT, class Del>
  34. void test_disabled_with_deleter() {
  35. using UPtr = std::unique_ptr<ValueT, Del>;
  36. using pointer = typename UPtr::pointer;
  37. test_hash_disabled_for_type<UPtr>();
  38. test_hash_disabled_for_type<pointer>();
  39. }
  40. namespace std {
  41. template <class T>
  42. struct hash<::min_pointer<T, std::integral_constant<size_t, 1>>> {
  43. size_t operator()(::min_pointer<T, std::integral_constant<size_t, 1>> p) const TEST_NOEXCEPT_FALSE {
  44. if (!p) return 0;
  45. return std::hash<T*>{}(std::addressof(*p));
  46. }
  47. };
  48. }
  49. struct A {};
  50. #endif // TEST_STD_VER >= 11
  51. int main(int, char**)
  52. {
  53. {
  54. int* ptr = new int;
  55. std::unique_ptr<int> p(ptr);
  56. std::hash<std::unique_ptr<int> > f;
  57. std::size_t h = f(p);
  58. assert(h == std::hash<int*>()(ptr));
  59. }
  60. #if TEST_STD_VER >= 11
  61. {
  62. std::unique_ptr<int, PointerDeleter<int, 1>> pThrowingHash;
  63. std::hash<std::unique_ptr<int, PointerDeleter<int, 1>>> fThrowingHash;
  64. ASSERT_NOT_NOEXCEPT(fThrowingHash(pThrowingHash));
  65. }
  66. {
  67. test_enabled_with_deleter<int, Deleter<int>>();
  68. test_enabled_with_deleter<int[], Deleter<int[]>>();
  69. test_enabled_with_deleter<int, CopyDeleter<int>>();
  70. test_enabled_with_deleter<int, CopyDeleter<int[]>>();
  71. test_enabled_with_deleter<int, NCDeleter<int>&>();
  72. test_enabled_with_deleter<int[], NCDeleter<int[]>&>();
  73. test_enabled_with_deleter<int, NCConstDeleter<int> const&>();
  74. test_enabled_with_deleter<int[], NCConstDeleter<int[]> const&>();
  75. }
  76. {
  77. test_enabled_with_deleter<int, PointerDeleter<int, 1>>();
  78. test_enabled_with_deleter<int[], PointerDeleter<int[], 1>>();
  79. test_enabled_with_deleter<A, PointerDeleter<A, 1>>();
  80. test_enabled_with_deleter<A[], PointerDeleter<A[], 1>>();
  81. #if TEST_STD_VER > 14
  82. test_disabled_with_deleter<int, PointerDeleter<int, 0>>();
  83. test_disabled_with_deleter<int[], PointerDeleter<int[], 0>>();
  84. test_disabled_with_deleter<A, PointerDeleter<A, 0>>();
  85. test_disabled_with_deleter<A[], PointerDeleter<A[], 0>>();
  86. #endif
  87. }
  88. #endif
  89. return 0;
  90. }