Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
2.4 KiB

  1. // auto_prg.h
  2. //
  3. // Same as auto_ptr but for a
  4. #pragma once
  5. #include <xstddef>
  6. template<class _Ty>
  7. class auto_prg
  8. {
  9. public:
  10. typedef _Ty element_type;
  11. explicit auto_prg(_Ty *_P = 0) _THROW0()
  12. : _Owns(_P != 0), _Ptr(_P) {}
  13. auto_prg(const auto_prg<_Ty>& _Y) _THROW0()
  14. : _Owns(_Y._Owns), _Ptr(_Y.release()) {}
  15. auto_prg<_Ty>& operator=(const auto_prg<_Ty>& _Y) _THROW0()
  16. {if (_Ptr != _Y.get())
  17. {if (_Owns)
  18. delete [] _Ptr;
  19. _Owns = _Y._Owns;
  20. _Ptr = _Y.release(); }
  21. else if (_Y._Owns)
  22. _Owns = true;
  23. return (*this); }
  24. auto_prg<_Ty>& operator=(_Ty* _Y) _THROW0()
  25. { {if (_Owns)
  26. delete [] _Ptr;
  27. _Owns = _Y != 0;
  28. _Ptr = _Y; }
  29. return (*this); }
  30. ~auto_prg()
  31. {if (_Owns)
  32. delete [] _Ptr; }
  33. _Ty** operator&() _THROW0()
  34. { return &_Ptr; }
  35. operator _Ty* () const
  36. { return _Ptr; }
  37. _Ty& operator*() const _THROW0()
  38. {return (*get()); }
  39. _Ty *operator->() const _THROW0()
  40. {return (get()); }
  41. _Ty& operator[] (int ndx) const _THROW0()
  42. {return *(get() + ndx); }
  43. _Ty *get() const _THROW0()
  44. {return (_Ptr); }
  45. _Ty *release() const _THROW0()
  46. {((auto_prg<_Ty> *)this)->_Owns = false;
  47. return (_Ptr); }
  48. bool Ownership(bool fOwns)
  49. { return _Owns = fOwns; }
  50. protected:
  51. bool _Owns;
  52. _Ty *_Ptr;
  53. };
  54. template<class _Ty>
  55. class pointer
  56. {
  57. public:
  58. typedef _Ty element_type;
  59. explicit pointer(_Ty *_P = 0) _THROW0()
  60. : _Owns(_P != 0), _Ptr(_P) {}
  61. pointer(const pointer<_Ty>& _Y) _THROW0()
  62. : _Owns(_Y._Owns), _Ptr(_Y.release()) {}
  63. pointer<_Ty>& operator=(const pointer<_Ty>& _Y) _THROW0()
  64. {if (_Ptr != _Y.get())
  65. {if (_Owns)
  66. delete _Ptr;
  67. _Owns = _Y._Owns;
  68. _Ptr = _Y.release(); }
  69. else if (_Y._Owns)
  70. _Owns = true;
  71. return (*this); }
  72. pointer<_Ty>& operator=(_Ty* _Y) _THROW0()
  73. { {if (_Owns)
  74. delete _Ptr;
  75. _Owns = _Y != 0;
  76. _Ptr = _Y; }
  77. return (*this); }
  78. ~pointer()
  79. {if (_Owns)
  80. delete _Ptr; }
  81. _Ty** operator&() _THROW0()
  82. { return &_Ptr; }
  83. operator _Ty* () const
  84. { return _Ptr; }
  85. _Ty& operator*() const _THROW0()
  86. {return (*get()); }
  87. _Ty *operator->() const _THROW0()
  88. {return (get()); }
  89. _Ty& operator[] (int ndx) const _THROW0()
  90. {return *(get() + ndx); }
  91. _Ty *get() const _THROW0()
  92. {return (_Ptr); }
  93. _Ty *release() const _THROW0()
  94. {((pointer<_Ty> *)this)->_Owns = false;
  95. return (_Ptr); }
  96. bool Ownership(bool fOwns)
  97. { return _Owns = fOwns; }
  98. protected:
  99. bool _Owns;
  100. _Ty *_Ptr;
  101. };