// 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 namespace boost { namespace lexer { namespace detail { template class ptr_vector { public: typedef std::vector 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