2 #ifndef DUNE_ITERATORFACADES_HH
3 #define DUNE_ITERATORFACADES_HH
133 template<
class T,
class V,
class R = V&,
class D = std::ptrdiff_t>
135 public std::iterator< std::forward_iterator_tag,
136 typename remove_const<V>::type,
189 return static_cast<DerivedType const*
>(
this)->dereference();
194 return &(
static_cast<const DerivedType *
>(
this)->dereference());
207 DerivedType tmp(static_cast<DerivedType const&>(*
this));
223 template<
class T1,
class V1,
class R1,
class D,
224 class T2,
class V2,
class R2>
225 inline typename EnableIfInterOperable<T1,T2,bool>::type
230 return static_cast<const T1&
>(lhs).equals(static_cast<const T2&>(rhs));
232 return static_cast<const T2&
>(rhs).equals(static_cast<const T1&>(lhs));
245 template<
class T1,
class V1,
class R1,
class D,
246 class T2,
class V2,
class R2>
247 inline typename EnableIfInterOperable<T1,T2,bool>::type
252 return !
static_cast<const T1&
>(lhs).equals(static_cast<const T2&>(rhs));
254 return !
static_cast<const T2&
>(rhs).equals(static_cast<const T1&>(lhs));
261 template<
class T,
class V,
class R = V&,
class D = std::ptrdiff_t>
263 public std::iterator< std::bidirectional_iterator_tag,
264 typename remove_const<V>::type,
321 return static_cast<DerivedType const*
>(
this)->dereference();
326 return &(
static_cast<const DerivedType *
>(
this)->dereference());
339 DerivedType tmp(static_cast<DerivedType const&>(*
this));
355 DerivedType tmp(static_cast<DerivedType const&>(*
this));
368 template<
class T1,
class V1,
class R1,
class D,
369 class T2,
class V2,
class R2>
370 inline typename enable_if<Conversion<T2,T1>::exists,
bool>::type
374 return static_cast<const T1&
>(lhs).equals(static_cast<const T2&>(rhs));
385 template<
class T1,
class V1,
class R1,
class D,
386 class T2,
class V2,
class R2>
388 typename enable_if<Conversion<T1,T2>::exists && !Conversion<T2,T1>::exists,
393 return static_cast<const T2&
>(rhs).equals(static_cast<const T1&>(lhs));
406 template<
class T1,
class V1,
class R1,
class D,
407 class T2,
class V2,
class R2>
408 inline typename EnableIfInterOperable<T1,T2,bool>::type
412 return !(lhs == rhs);
419 template<
class T,
class V,
class R = V&,
class D = std::ptrdiff_t>
421 public std::iterator< std::random_access_iterator_tag,
422 typename remove_const<V>::type,
487 return static_cast<DerivedType const*
>(
this)->dereference();
492 return &(
static_cast<const DerivedType *
>(
this)->dereference());
502 return static_cast<const DerivedType *
>(
this)->elementAt(n);
515 DerivedType tmp(static_cast<DerivedType const&>(*
this));
528 DerivedType tmp(static_cast<DerivedType const&>(*
this));
544 DerivedType tmp(static_cast<DerivedType const&>(*
this));
557 DerivedType tmp(static_cast<DerivedType const&>(*
this));
575 template<
class T1,
class V1,
class R1,
class D,
576 class T2,
class V2,
class R2>
577 inline typename EnableIfInterOperable<T1,T2,bool>::type
582 return static_cast<const T1&
>(lhs).equals(static_cast<const T2&>(rhs));
584 return static_cast<const T2&
>(rhs).equals(static_cast<const T1&>(lhs));
597 template<
class T1,
class V1,
class R1,
class D,
598 class T2,
class V2,
class R2>
599 inline typename EnableIfInterOperable<T1,T2,bool>::type
604 return !
static_cast<const T1&
>(lhs).equals(static_cast<const T2&>(rhs));
606 return !
static_cast<const T2&
>(rhs).equals(static_cast<const T1&>(lhs));
619 template<
class T1,
class V1,
class R1,
class D,
620 class T2,
class V2,
class R2>
621 inline typename EnableIfInterOperable<T1,T2,bool>::type
622 operator<(const RandomAccessIteratorFacade<T1,V1,R1,D>& lhs,
626 return static_cast<const T1&
>(lhs).distanceTo(static_cast<const T2&>(rhs))>0;
628 return static_cast<const T2&
>(rhs).distanceTo(static_cast<const T1&>(lhs))<0;
642 template<
class T1,
class V1,
class R1,
class D,
643 class T2,
class V2,
class R2>
644 inline typename EnableIfInterOperable<T1,T2,bool>::type
645 operator<=(const RandomAccessIteratorFacade<T1,V1,R1,D>& lhs,
649 return static_cast<const T1&
>(lhs).distanceTo(static_cast<const T2&>(rhs))>=0;
651 return static_cast<const T2&
>(rhs).distanceTo(static_cast<const T1&>(lhs))<=0;
665 template<
class T1,
class V1,
class R1,
class D,
666 class T2,
class V2,
class R2>
667 inline typename EnableIfInterOperable<T1,T2,bool>::type
672 return static_cast<const T1&
>(lhs).distanceTo(static_cast<const T2&>(rhs))<0;
674 return static_cast<const T2&
>(rhs).distanceTo(static_cast<const T1&>(lhs))>0;
687 template<
class T1,
class V1,
class R1,
class D,
688 class T2,
class V2,
class R2>
689 inline typename EnableIfInterOperable<T1,T2,bool>::type
694 return static_cast<const T1&
>(lhs).distanceTo(static_cast<const T2&>(rhs))<=0;
696 return static_cast<const T2&
>(rhs).distanceTo(static_cast<const T1&>(lhs))>=0;
709 template<
class T1,
class V1,
class R1,
class D,
710 class T2,
class V2,
class R2>
711 inline typename EnableIfInterOperable<T1,T2,D>::type
716 return -
static_cast<const T1&
>(lhs).distanceTo(static_cast<const T2&>(rhs));
718 return static_cast<const T2&
>(rhs).distanceTo(static_cast<const T1&>(lhs));