ListOfPtr.tlh 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #pragma once
  2. #include <list>
  3. #include <memory>
  4. //-----------------------------------------------------------------------------
  5. // ListOfPtr
  6. //-----------------------------------------------------------------------------
  7. template <typename T> class ListOfPtr : public std::list <std::unique_ptr <T>>
  8. {
  9. using inherited = std::list <std::unique_ptr <T>>;
  10. public:
  11. ListOfPtr ()
  12. {
  13. }
  14. ListOfPtr (ListOfPtr && from) : inherited (std::move (from))
  15. {
  16. }
  17. ListOfPtr (const ListOfPtr & from) = delete;
  18. ~ListOfPtr ()
  19. {
  20. __noop;
  21. }
  22. ListOfPtr & operator = (ListOfPtr && from)
  23. {
  24. inherited::operator = (std::move (from));
  25. return (*this);
  26. }
  27. public:
  28. void Attach (T * value)
  29. {
  30. std::unique_ptr <T> ptr (value);
  31. inherited::push_back (std::move (ptr));
  32. }
  33. T * Detach (T * value)
  34. {
  35. auto iter = std::find_if (this->begin (), this->end (), [ value] (const auto & to)
  36. {
  37. return to.get () == value;
  38. });
  39. std::unique_ptr <T> rc;
  40. if (iter == this->cend ())
  41. return nullptr;
  42. auto to = (*iter).release ();
  43. this->erase (iter);
  44. return to;
  45. }
  46. void AttachFirst (T * value)
  47. {
  48. std::unique_ptr <T> ptr (value);
  49. push_front (std::move (ptr));
  50. }
  51. T * GetFirst () const
  52. {
  53. return inherited::front ().get ();
  54. }
  55. void RemoveFirst ()
  56. {
  57. inherited::pop_front ();
  58. }
  59. T * GetLast () const
  60. {
  61. return inherited::back ().get ();
  62. }
  63. void RemoveLast ()
  64. {
  65. inherited::pop_back ();
  66. }
  67. bool IsEmpty () const
  68. {
  69. return inherited::empty ();
  70. }
  71. int GetSize () const
  72. {
  73. return (int) (inherited::size ());
  74. }
  75. void Reset ()
  76. {
  77. inherited::clear ();
  78. }
  79. };