// sequence.hpp #ifndef _SEQUENCE_HPP #define _SEQUENCE_HPP template class Sequence; // create_sequence // returns a Sequence object. // The advantage of using this function over calling the Sequence constructor // is that the compiler can automatically infer the type of _Iterator. template inline Sequence<_Iterator> create_sequence(_Iterator begin_iterator, _Iterator end_iterator) { return Sequence<_Iterator>(begin_iterator, end_iterator); } template struct Sequence { typedef _Iterator iterator; _Iterator begin_iterator, end_iterator; inline Sequence(/*const*/ _Iterator begin_iterator_, /*const*/ _Iterator end_iterator_ ) : begin_iterator( begin_iterator_ ), end_iterator( end_iterator_ ) {} inline _Iterator begin() const { return begin_iterator; } inline _Iterator end() const { return end_iterator; } }; // ---------------------------------------------------------------------------- template inline Sequence without_first_element(/*const*/ _Sequence seq) { typename _Sequence::iterator begin_it = seq.begin(); ++begin_it; return create_sequence(begin_it, seq.end()); } template inline Sequence without_last_element(/*const*/ _Sequence seq) { typename _Sequence::iterator end_it = seq.end(); --end_it; return create_sequence(seq.begin(), end_it); } #endif // _SEQUENCE_HPP