ConstTransitivePtr.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*
  2. * ConstTransitivePtr.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. class CGameHandler;
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. template <typename T>
  14. class ConstTransitivePtr
  15. {
  16. T *ptr;
  17. ConstTransitivePtr(const T *Ptr)
  18. : ptr(const_cast<T*>(Ptr))
  19. {}
  20. public:
  21. ConstTransitivePtr(T *Ptr = nullptr)
  22. : ptr(Ptr)
  23. {}
  24. ConstTransitivePtr(std::nullptr_t)
  25. : ptr(nullptr)
  26. {}
  27. const T& operator*() const
  28. {
  29. return *ptr;
  30. }
  31. T& operator*()
  32. {
  33. return *ptr;
  34. }
  35. operator const T*() const
  36. {
  37. return ptr;
  38. }
  39. T* get()
  40. {
  41. return ptr;
  42. }
  43. const T* get() const
  44. {
  45. return ptr;
  46. }
  47. operator T*()
  48. {
  49. return ptr;
  50. }
  51. T *operator->()
  52. {
  53. return ptr;
  54. }
  55. const T *operator->() const
  56. {
  57. return ptr;
  58. }
  59. const T*operator=(T *t)
  60. {
  61. return ptr = t;
  62. }
  63. void dellNull()
  64. {
  65. delete ptr;
  66. ptr = nullptr;
  67. }
  68. template <typename Handler> void serialize(Handler &h, const int version)
  69. {
  70. h & ptr;
  71. }
  72. friend class ::CGameHandler;
  73. };
  74. VCMI_LIB_NAMESPACE_END