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_INCLUDES_HPP
00008 #define INSTIGATE_STL_INCLUDES_HPP
00009
00058
00059 #include "concept.hpp"
00060
00061
00062 #include <generic/base.hpp>
00063
00064
00065
00066
00067 namespace instigate {
00068 namespace stl {
00069 template <typename I, typename I1>
00070 bool includes(I b, I e, I1 f, I1 l);
00071
00072 template <typename I, typename I1, typename BP>
00073 bool includes(I b, I e, I1 f, I1 l, BP p);
00074 }
00075 }
00076
00126 template <typename I, typename I1>
00127 bool instigate::stl::includes(I b, I e, I1 f, I1 l)
00128 {
00129 namespace SP = instigate::stl::single_pass_iterator;
00130 namespace RI = instigate::stl::readable_iterator;
00131 namespace EQ = instigate::generic::equality_comparable;
00132 namespace LT = instigate::generic::less_than_comparable;
00133 CHECK(SP::requirements<I>);
00134 CHECK(RI::requirements<I>);
00135 CHECK(SP::requirements<I1>);
00136 CHECK(RI::requirements<I1>);
00137 typedef typename RI::interface<I>::value_type value_type1;
00138 typedef typename RI::interface<I1>::value_type value_type2;
00139 CHECK_SAME_TYPE(value_type1, value_type2);
00140 CHECK(LT::requirements<value_type1>);
00141 while (!equal(b, e) && !equal(f, l))
00142 if (less_than(const_dereference(f),const_dereference(b))) {
00143 return false;
00144 }
00145 else if(less_than(const_dereference(b), const_dereference(f)))
00146 {
00147 increment(b);
00148 } else{
00149 increment(b);
00150 increment(f);
00151 }
00152 return equal(f, l);
00153 }
00154
00194 template <typename I, typename I1, typename BP>
00195 bool instigate::stl::includes(I b, I e, I1 f, I1 l, BP p)
00196 {
00197 namespace SP = instigate::stl::single_pass_iterator;
00198 namespace RI = instigate::stl::readable_iterator;
00199 namespace EQ = instigate::generic::equality_comparable;
00200 namespace LT = instigate::generic::less_than_comparable;
00201 namespace BI = instigate::stl::binary_predicate;
00202 CHECK(SP::requirements<I>);
00203 CHECK(RI::requirements<I>);
00204 CHECK(SP::requirements<I1>);
00205 CHECK(RI::requirements<I1>);
00206 CHECK(BI::requirements<BP>);
00207 typedef typename RI::interface<I>::value_type value_type1;
00208 typedef typename RI::interface<I1>::value_type value_type2;
00209 CHECK_SAME_TYPE(value_type1, value_type2);
00210 CHECK(LT::requirements<value_type1>);
00211 while (!equal(b, e) && !equal(f, l))
00212 if (invoke_predicate(p, const_dereference(f),
00213 const_dereference(b)))
00214 {
00215 return false;
00216 }
00217 else if (invoke_predicate(p, const_dereference(b),
00218 const_dereference(f)))
00219 {
00220 increment(b);
00221 } else {
00222 increment(b);
00223 increment(f);
00224 }
00225 return equal(f, l);
00226 }
00227
00228
00229
00230 #endif // INSTIGATE_STL_INCLUDES_HPP