00001
00002 #ifndef _INSTIGATE_STL_INTERNAL_HEADER_IN_ALGORITHM
00003 #error This is an internal header file used to implement Instigate STL.\
00004 It should never be included directly by a program.
00005 #endif
00006
00007 #ifndef INSTIGATE_STL_REMOVE_COPY_HPP
00008 #define INSTIGATE_STL_REMOVE_COPY_HPP
00009
00059
00060 #include "concept.hpp"
00061 #include "_basis.hpp"
00062
00063
00064
00065
00066
00067
00068 namespace instigate {
00069 namespace stl {
00070 template <typename I, typename O, typename V>
00071 O remove_copy(I b, I e, O r, const V& v);
00072 }
00073 }
00074
00115 template <typename I, typename O, typename V>
00116 O instigate::stl::remove_copy(I b, I e, O r, const V& v)
00117 {
00118 namespace SP = instigate::stl::single_pass_iterator;
00119 namespace RI = instigate::stl::readable_iterator;
00120 namespace INC = instigate::stl::incrementable_iterator;
00121 namespace WR = instigate::stl::writable_iterator;
00122 namespace EQ = instigate::generic::equality_comparable;
00123 typedef typename RI::interface<I>::value_type value_type1;
00124 typedef typename WR::interface<O>::value_type value_type2;
00125 CHECK(SP::requirements<I>);
00126 CHECK(RI::requirements<I>);
00127 CHECK(INC::requirements<O>);
00128 CHECK(WR::requirements<O>);
00129 CHECK(EQ::requirements<V>);
00130 CHECK_CONVERTIBILITY(value_type1, value_type2);
00131 while (!equal(b, e)) {
00132 if (!equal(const_dereference(b), v)) {
00133 dereference_assign(r, const_dereference(b));
00134 increment(r);
00135 }
00136 increment(b);
00137 }
00138 return r;
00139 }
00140
00141
00142
00143 #endif // INSTIGATE_STL_REMOVE_COPY_HPP