Chris@16: /* boost random/detail/iterator_mixin.hpp header file Chris@16: * Chris@16: * Copyright Jens Maurer 2000-2001 Chris@16: * Distributed under the Boost Software License, Version 1.0. (See Chris@16: * accompanying file LICENSE_1_0.txt or copy at Chris@16: * http://www.boost.org/LICENSE_1_0.txt) Chris@16: * Chris@16: * See http://www.boost.org for most recent version including documentation. Chris@16: * Chris@16: * Revision history Chris@16: */ Chris@16: Chris@16: #ifndef BOOST_ITERATOR_MIXIN_HPP Chris@16: #define BOOST_ITERATOR_MIXIN_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: // must be in boost namespace, otherwise the inline friend trick fails Chris@16: template Chris@16: class generator_iterator_mixin_adapter Chris@16: : incrementable, equality_comparable Chris@16: { Chris@16: public: Chris@16: typedef std::input_iterator_tag iterator_category; Chris@16: typedef ResultType value_type; Chris@16: typedef std::ptrdiff_t difference_type; Chris@16: typedef const value_type * pointer; Chris@16: typedef const value_type & reference; Chris@16: Generator& operator++() { v = cast()(); return cast(); } Chris@16: const value_type& operator*() const { return v; } Chris@16: Chris@16: protected: Chris@16: // instantiate from derived classes only Chris@16: generator_iterator_mixin_adapter() { } Chris@16: void iterator_init() { operator++(); } Chris@16: private: Chris@16: Generator & cast() { return static_cast(*this); } Chris@16: value_type v; Chris@16: }; Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_ITERATOR_MIXIN_HPP