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_EQUAL_HPP
00008 #define INSTIGATE_STL_EQUAL_HPP
00009
00057
00058 #include "concept.hpp"
00059
00060
00061
00062
00063
00064
00065 namespace instigate {
00066 namespace stl {
00067 template <typename I, typename I2>
00068 inline bool equal(I b, I e, I2 r);
00069 template <typename I, typename I2, typename B>
00070 inline bool equal(I b, I e, I2 r, B p);
00071 }
00072 }
00073
00104 template <typename I, typename I2>
00105 inline bool instigate::stl::equal(I b, I e, I2 r)
00106 {
00107 namespace RI = instigate::stl::readable_iterator;
00108 typedef typename RI::interface<I>::value_type value_type1;
00109 typedef typename RI::interface<I2>::value_type value_type2;
00110 for ( ; !equal(b, e); increment(b), increment(r)) {
00111 if (!equal(const_dereference(b), const_dereference(r))) {
00112 return false;
00113 }
00114 }
00115 return true;
00116 }
00117
00144 template <typename I, typename I2, typename B>
00145 inline bool instigate::stl::equal(I b, I e, I2 r, B p)
00146 {
00147 namespace RI = instigate::stl::readable_iterator;
00148 namespace BP = instigate::stl::binary_predicate;
00149 typedef typename RI::interface<I>::value_type value_type1;
00150 typedef typename RI::interface<I2>::value_type value_type2;
00151 typedef typename BP::interface<B>::first_argument_type
00152 first_argument_type;
00153 typedef typename BP::interface<B>::second_argument_type
00154 second_argument_type;
00155 CHECK_CONVERTIBILITY(value_type1, first_argument_type);
00156 CHECK_CONVERTIBILITY(value_type2, second_argument_type);
00157 for ( ; !equal(b, e); increment(b), increment(r)) {
00158 if(!invoke_predicate(p, const_dereference(b),
00159 const_dereference(r))) {
00160 return false;
00161 }
00162 }
00163 return true;
00164 }
00165
00166
00167
00168 #endif // INSTIGATE_STL_EQUAL_HPP