Listing 6: Unique Template Functions
// TEMPLATE FUNCTION unique_copy
template<class InIt, class OutIt> inline
OutIt unique_copy(InIt first, InIt last, OutIt x)
{return (first == last ? x :
_Unique_copy(first, last, x,
_Iter_cat(first))); }
template<class InIt, class OutIt> inline
OutIt _Unique_copy(InIt first, InIt last, OutIt x,
input_iterator_tag)
{return (_Unique_copy(first, last, x, _Val_type(first))); }
template<class InIt, class OutIt, class T> inline
OutIt _Unique_copy(InIt first, InIt last, OutIt x, T *)
{T val = *first;
for (*x++ = val; ++first != last; )
if (!(val == *first))
val = *first, *x++ = val;
return (x); }
template<class FwdIt, class OutIt> inline
OutIt _Unique_copy(FwdIt first, FwdIt last, OutIt x,
forward_iterator_tag)
{FwdIt firstb = first;
for (*x++ = *firstb; ++first != last; )
if (!(*firstb == *first))
firstb = first, *x++ = *firstb;
return (x); }
template<class BidIt, class OutIt> inline ///
OutIt _Unique_copy(BidIt first, BidIt last, OutIt x, ///
bidirectional_iterator_tag) ///
{return (_Unique_copy(first, last, x, ///
forward_iterator_tag())); } ///
template<class RanIt, class OutIt> inline ///
OutIt _Unique_copy(RanIt first, RanIt last, OutIt x, ///
random_access_iterator_tag) ///
{return (_Unique_copy(first, last, x, ///
forward_iterator_tag())); } ///
// TEMPLATE FUNCTION unique
template<class FwdIt> inline
FwdIt unique(FwdIt first, FwdIt last)
{first = adjacent_find(first, last);
return (unique_copy(first, last, first)); }
//End of File