never_freed_pointer.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // This file is part of Desktop App Toolkit,
  2. // a set of libraries for developing nice desktop applications.
  3. //
  4. // For license and copyright information please follow this link:
  5. // https://github.com/desktop-app/legal/blob/master/LEGAL
  6. //
  7. #pragma once
  8. #include "base/assertion.h"
  9. namespace base {
  10. // This pointer is used for global non-POD variables that are allocated
  11. // on demand by createIfNull(lambda) and are never automatically freed.
  12. template <typename T>
  13. class NeverFreedPointer {
  14. public:
  15. NeverFreedPointer() = default;
  16. NeverFreedPointer(const NeverFreedPointer<T> &other) = delete;
  17. NeverFreedPointer &operator=(const NeverFreedPointer<T> &other) = delete;
  18. template <typename... Args>
  19. void createIfNull(Args&&... args) {
  20. if (isNull()) {
  21. reset(new T(std::forward<Args>(args)...));
  22. }
  23. };
  24. T *data() const {
  25. return _p;
  26. }
  27. T *release() {
  28. return base::take(_p);
  29. }
  30. void reset(T *p = nullptr) {
  31. delete _p;
  32. _p = p;
  33. }
  34. bool isNull() const {
  35. return data() == nullptr;
  36. }
  37. void clear() {
  38. reset();
  39. }
  40. T *operator->() const {
  41. return data();
  42. }
  43. T &operator*() const {
  44. Assert(!isNull());
  45. return *data();
  46. }
  47. explicit operator bool() const {
  48. return !isNull();
  49. }
  50. private:
  51. T *_p;
  52. };
  53. } // namespace base