NeverDestroyed.h 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Copyright (C) 2013 Apple Inc. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. * 1. Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * 2. Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
  14. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  15. * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  16. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
  17. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  18. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  19. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  20. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  21. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  22. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  23. * THE POSSIBILITY OF SUCH DAMAGE.
  24. */
  25. #ifndef NeverDestroyed_h
  26. #define NeverDestroyed_h
  27. #include <wtf/Alignment.h>
  28. #include <wtf/Noncopyable.h>
  29. #include <wtf/StdLibExtras.h>
  30. #include <wtf/TypeTraits.h>
  31. // NeverDestroyed is a smart pointer like class who ensures that the destructor
  32. // for the given object is never called, but doesn't use the heap to allocate it.
  33. // It's useful for static local variables, and can be used like so:
  34. //
  35. // MySharedGlobal& mySharedGlobal()
  36. // {
  37. // static NeverDestroyed<MySharedGlobal> myGlobal("Hello", 42);
  38. // return myGlobal;
  39. // }
  40. //
  41. namespace WTF {
  42. template<typename T> class NeverDestroyed {
  43. WTF_MAKE_NONCOPYABLE(NeverDestroyed);
  44. public:
  45. #if COMPILER_SUPPORTS(CXX_VARIADIC_TEMPLATES)
  46. template<typename... Args>
  47. NeverDestroyed(Args&&... args)
  48. {
  49. new (asPtr()) T(std::forward<Args>(args)...);
  50. }
  51. #else
  52. NeverDestroyed()
  53. {
  54. new (NotNull, asPtr()) T;
  55. }
  56. template<typename P1>
  57. NeverDestroyed(const P1& p1)
  58. {
  59. new (NotNull, asPtr()) T(p1);
  60. }
  61. #endif
  62. operator T&() { return *asPtr(); }
  63. private:
  64. #if COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES)
  65. NeverDestroyed(NeverDestroyed&&) WTF_DELETED_FUNCTION;
  66. NeverDestroyed& operator=(NeverDestroyed&&) WTF_DELETED_FUNCTION;
  67. #endif
  68. typedef typename WTF::RemoveConst<T>::Type *PointerType;
  69. PointerType asPtr() { return reinterpret_cast<PointerType>(&m_storage); }
  70. // FIXME: Investigate whether we should allocate a hunk of virtual memory
  71. // and hand out chunks of it to NeverDestroyed instead, to reduce fragmentation.
  72. AlignedBuffer<sizeof(T), WTF_ALIGN_OF(T)> m_storage;
  73. };
  74. } // namespace WTF;
  75. using WTF::NeverDestroyed;
  76. #endif // NeverDestroyed_h