1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #ifndef BASE_NO_DESTRUCTOR_H_
- #define BASE_NO_DESTRUCTOR_H_
- #include <new>
- #include <utility>
- namespace base {
- template <typename T>
- class NoDestructor {
- public:
-
-
- template <typename... Args>
- explicit NoDestructor(Args&&... args) {
- new (storage_) T(std::forward<Args>(args)...);
- }
-
-
- explicit NoDestructor(const T& x) { new (storage_) T(x); }
- explicit NoDestructor(T&& x) { new (storage_) T(std::move(x)); }
- NoDestructor(const NoDestructor&) = delete;
- NoDestructor& operator=(const NoDestructor&) = delete;
- ~NoDestructor() = default;
- const T& operator*() const { return *get(); }
- T& operator*() { return *get(); }
- const T* operator->() const { return get(); }
- T* operator->() { return get(); }
- const T* get() const { return reinterpret_cast<const T*>(storage_); }
- T* get() { return reinterpret_cast<T*>(storage_); }
- private:
- alignas(T) char storage_[sizeof(T)];
- #if defined(LEAK_SANITIZER)
-
-
-
-
-
-
-
-
-
-
-
-
- T* storage_ptr_ = reinterpret_cast<T*>(storage_);
- #endif
- };
- }
- #endif
|