| // ptr_vector.hpp |
| // Copyright (c) 2007-2009 Ben Hanson (http://www.benhanson.net/) |
| // |
| // Distributed under the Boost Software License, Version 1.0. (See accompanying |
| // file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| #ifndef BOOST_LEXER_PTR_VECTOR_HPP |
| #define BOOST_LEXER_PTR_VECTOR_HPP |
| |
| #include "../size_t.hpp" |
| #include <vector> |
| |
| namespace boost |
| { |
| namespace lexer |
| { |
| namespace detail |
| { |
| template<typename Type> |
| class ptr_vector |
| { |
| public: |
| typedef std::vector<Type *> vector; |
| |
| ptr_vector () |
| { |
| } |
| |
| ~ptr_vector () |
| { |
| clear (); |
| } |
| |
| vector *operator -> () |
| { |
| return &_vector; |
| } |
| |
| const vector *operator -> () const |
| { |
| return &_vector; |
| } |
| |
| vector &operator * () |
| { |
| return _vector; |
| } |
| |
| const vector &operator * () const |
| { |
| return _vector; |
| } |
| |
| Type * &operator [] (const std::size_t index_) |
| { |
| return _vector[index_]; |
| } |
| |
| Type * const &operator [] (const std::size_t index_) const |
| { |
| return _vector[index_]; |
| } |
| |
| bool operator == (const ptr_vector &rhs_) const |
| { |
| bool equal_ = _vector.size () == rhs_._vector.size (); |
| |
| if (equal_) |
| { |
| typename vector::const_iterator lhs_iter_ = _vector.begin (); |
| typename vector::const_iterator end_ = _vector.end (); |
| typename vector::const_iterator rhs_iter_ = rhs_._vector.begin (); |
| |
| for (; equal_ && lhs_iter_ != end_; ++lhs_iter_, ++rhs_iter_) |
| { |
| equal_ = **lhs_iter_ == **rhs_iter_; |
| } |
| } |
| |
| return equal_; |
| } |
| |
| void clear () |
| { |
| if (!_vector.empty ()) |
| { |
| Type **iter_ = &_vector.front (); |
| Type **end_ = iter_ + _vector.size (); |
| |
| for (; iter_ != end_; ++iter_) |
| { |
| delete *iter_; |
| } |
| } |
| |
| _vector.clear (); |
| } |
| |
| private: |
| vector _vector; |
| |
| ptr_vector (const ptr_vector &); // No copy construction. |
| ptr_vector &operator = (const ptr_vector &); // No assignment. |
| }; |
| } |
| } |
| } |
| |
| #endif |