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 
9 #include "../size_t.hpp"
10 #include <vector>
11 
12 namespace boost
13 {
14 namespace lexer
15 {
16 namespace detail
17 {
18 template<typename Type>
19 class ptr_vector
20 {
21 public:
22     typedef std::vector<Type *> vector;
23 
ptr_vector()24     ptr_vector ()
25     {
26     }
27 
~ptr_vector()28     ~ptr_vector ()
29     {
30         clear ();
31     }
32 
operator ->()33     vector *operator -> ()
34     {
35         return &_vector;
36     }
37 
operator ->() const38     const vector *operator -> () const
39     {
40         return &_vector;
41     }
42 
operator *()43     vector &operator * ()
44     {
45         return _vector;
46     }
47 
operator *() const48     const vector &operator * () const
49     {
50         return _vector;
51     }
52 
operator [](const std::size_t index_)53     Type * &operator [] (const std::size_t index_)
54     {
55         return _vector[index_];
56     }
57 
operator [](const std::size_t index_) const58     Type * const &operator [] (const std::size_t index_) const
59     {
60         return _vector[index_];
61     }
62 
operator ==(const ptr_vector & rhs_) const63     bool operator == (const ptr_vector &rhs_) const
64     {
65         bool equal_ = _vector.size () == rhs_._vector.size ();
66 
67         if (equal_)
68         {
69             typename vector::const_iterator lhs_iter_ = _vector.begin ();
70             typename vector::const_iterator end_ = _vector.end ();
71             typename vector::const_iterator rhs_iter_ = rhs_._vector.begin ();
72 
73             for (; equal_ && lhs_iter_ != end_; ++lhs_iter_, ++rhs_iter_)
74             {
75                 equal_ = **lhs_iter_ == **rhs_iter_;
76             }
77         }
78 
79         return  equal_;
80     }
81 
clear()82     void clear ()
83     {
84         if (!_vector.empty ())
85         {
86             Type **iter_ = &_vector.front ();
87             Type **end_ = iter_ + _vector.size ();
88 
89             for (; iter_ != end_; ++iter_)
90             {
91                 delete *iter_;
92             }
93         }
94 
95         _vector.clear ();
96     }
97 
98 private:
99     vector _vector;
100 
101     ptr_vector (const ptr_vector &); // No copy construction.
102     ptr_vector &operator = (const ptr_vector &); // No assignment.
103 };
104 }
105 }
106 }
107 
108 #endif
109