array_deleter.hpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (c) 2012 Glen Joseph Fernandes
  3. * glenfe at live dot com
  4. *
  5. * Distributed under the Boost Software License,
  6. * Version 1.0. (See accompanying file LICENSE_1_0.txt
  7. * or copy at http://boost.org/LICENSE_1_0.txt)
  8. */
  9. #ifndef BOOST_SMART_PTR_DETAIL_ARRAY_DELETER_HPP
  10. #define BOOST_SMART_PTR_DETAIL_ARRAY_DELETER_HPP
  11. #include <boost/smart_ptr/detail/array_utility.hpp>
  12. #include <boost/smart_ptr/detail/sp_forward.hpp>
  13. namespace boost {
  14. namespace detail {
  15. template<typename T>
  16. class array_deleter;
  17. template<typename T>
  18. class array_deleter<T[]> {
  19. public:
  20. array_deleter(std::size_t size_)
  21. : size(size_),
  22. object(0) {
  23. }
  24. ~array_deleter() {
  25. if (object) {
  26. array_destroy(object, size);
  27. }
  28. }
  29. void init(T* memory) {
  30. array_init(memory, size);
  31. object = memory;
  32. }
  33. #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
  34. void init(T* memory, T&& value) {
  35. array_init_value(memory, size, sp_forward<T>(value));
  36. object = memory;
  37. }
  38. #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
  39. template<typename... Args>
  40. void init(T* memory, Args&&... args) {
  41. array_init_args(memory, size, sp_forward<Args>(args)...);
  42. object = memory;
  43. }
  44. #endif
  45. #endif
  46. void init_list(T* memory, const T* list) {
  47. array_init_list(memory, size, list);
  48. object = memory;
  49. }
  50. template<std::size_t M>
  51. void init_list(T* memory, const T* list) {
  52. array_init_list<T, M>(memory, size, list);
  53. object = memory;
  54. }
  55. void noinit(T* memory) {
  56. array_noinit(memory, size);
  57. object = memory;
  58. }
  59. void operator()(const void*) {
  60. if (object) {
  61. array_destroy(object, size);
  62. object = 0;
  63. }
  64. }
  65. private:
  66. std::size_t size;
  67. T* object;
  68. };
  69. template<typename T, std::size_t N>
  70. class array_deleter<T[N]> {
  71. public:
  72. array_deleter()
  73. : object(0) {
  74. }
  75. ~array_deleter() {
  76. if (object) {
  77. array_destroy(object, N);
  78. }
  79. }
  80. void init(T* memory) {
  81. array_init(memory, N);
  82. object = memory;
  83. }
  84. #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
  85. void init(T* memory, T&& value) {
  86. array_init_value(memory, N, sp_forward<T>(value));
  87. object = memory;
  88. }
  89. #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
  90. template<typename... Args>
  91. void init(T* memory, Args&&... args) {
  92. array_init_args(memory, N, sp_forward<Args>(args)...);
  93. object = memory;
  94. }
  95. #endif
  96. #endif
  97. void init_list(T* memory, const T* list) {
  98. array_init_list(memory, N, list);
  99. object = memory;
  100. }
  101. template<std::size_t M>
  102. void init_list(T* memory, const T* list) {
  103. array_init_list<T, M>(memory, N, list);
  104. object = memory;
  105. }
  106. void noinit(T* memory) {
  107. array_noinit(memory, N);
  108. object = memory;
  109. }
  110. void operator()(const void*) {
  111. if (object) {
  112. array_destroy(object, N);
  113. object = 0;
  114. }
  115. }
  116. private:
  117. T* object;
  118. };
  119. }
  120. }
  121. #endif