ptr_vector.hpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // ptr_vector.hpp
  2. // Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #ifndef BOOST_LEXER_PTR_VECTOR_HPP
  7. #define BOOST_LEXER_PTR_VECTOR_HPP
  8. #include "../size_t.hpp"
  9. #include <vector>
  10. namespace boost
  11. {
  12. namespace lexer
  13. {
  14. namespace detail
  15. {
  16. template<typename Type>
  17. class ptr_vector
  18. {
  19. public:
  20. typedef std::vector<Type *> vector;
  21. ptr_vector ()
  22. {
  23. }
  24. ~ptr_vector ()
  25. {
  26. clear ();
  27. }
  28. vector *operator -> ()
  29. {
  30. return &_vector;
  31. }
  32. const vector *operator -> () const
  33. {
  34. return &_vector;
  35. }
  36. vector &operator * ()
  37. {
  38. return _vector;
  39. }
  40. const vector &operator * () const
  41. {
  42. return _vector;
  43. }
  44. Type * &operator [] (const std::size_t index_)
  45. {
  46. return _vector[index_];
  47. }
  48. Type * const &operator [] (const std::size_t index_) const
  49. {
  50. return _vector[index_];
  51. }
  52. bool operator == (const ptr_vector &rhs_) const
  53. {
  54. bool equal_ = _vector.size () == rhs_._vector.size ();
  55. if (equal_)
  56. {
  57. typename vector::const_iterator lhs_iter_ = _vector.begin ();
  58. typename vector::const_iterator end_ = _vector.end ();
  59. typename vector::const_iterator rhs_iter_ = rhs_._vector.begin ();
  60. for (; equal_ && lhs_iter_ != end_; ++lhs_iter_, ++rhs_iter_)
  61. {
  62. equal_ = **lhs_iter_ == **rhs_iter_;
  63. }
  64. }
  65. return equal_;
  66. }
  67. void clear ()
  68. {
  69. if (!_vector.empty ())
  70. {
  71. Type **iter_ = &_vector.front ();
  72. Type **end_ = iter_ + _vector.size ();
  73. for (; iter_ != end_; ++iter_)
  74. {
  75. delete *iter_;
  76. }
  77. }
  78. _vector.clear ();
  79. }
  80. private:
  81. vector _vector;
  82. ptr_vector (const ptr_vector &); // No copy construction.
  83. ptr_vector &operator = (const ptr_vector &); // No assignment.
  84. };
  85. }
  86. }
  87. }
  88. #endif