Skip to content

Commit

Permalink
Fixing iterator_facade to implement the missing post-increment operator
Browse files Browse the repository at this point in the history
- flyby: (clang-)formatting new code related to is_iterator
- flyby: add more tests verifying the changes
  • Loading branch information
hkaiser committed Feb 21, 2019
1 parent 424cd12 commit 240135e
Show file tree
Hide file tree
Showing 3 changed files with 1,064 additions and 794 deletions.
68 changes: 34 additions & 34 deletions hpx/traits/is_iterator.hpp
Expand Up @@ -54,7 +54,7 @@ namespace hpx { namespace traits
decltype(std::declval<T>() + std::declval<U>())
>::type>
{
using type = decltype(std::declval<T>() + std::declval<U>());
using type = decltype(std::declval<T>() + std::declval<U>());
};

template <typename T, typename = void>
Expand All @@ -65,7 +65,7 @@ namespace hpx { namespace traits
struct dereference_result<T,
typename util::always_void<decltype(*(std::declval<T&>()))>::type>
{
using type = decltype(*(std::declval<T&>()));
using type = decltype(*(std::declval<T&>()));
};

template <typename T, typename U, typename = void>
Expand All @@ -78,8 +78,8 @@ namespace hpx { namespace traits
decltype(std::declval<const T&>() == std::declval<const U&>())
>::type>
{
using type =
decltype(std::declval<const T&>() == std::declval<const U&>());
using type =
decltype(std::declval<const T&>() == std::declval<const U&>());
};

template <typename T, typename U, typename = void>
Expand All @@ -92,8 +92,8 @@ namespace hpx { namespace traits
decltype(std::declval<const T&>() != std::declval<const U&>())
>::type>
{
using type =
decltype(std::declval<const T&>() != std::declval<const U&>());
using type =
decltype(std::declval<const T&>() != std::declval<const U&>());
};

template <typename T, typename U, typename = void>
Expand All @@ -106,7 +106,7 @@ namespace hpx { namespace traits
decltype(std::declval<T>() += std::declval<U>())
>::type>
{
using type = decltype(std::declval<T>() += std::declval<U>());
using type = decltype(std::declval<T>() += std::declval<U>());
};

template <typename T, typename U, typename = void>
Expand All @@ -119,7 +119,7 @@ namespace hpx { namespace traits
decltype(std::declval<T>() -= std::declval<U>())
>::type>
{
using type = decltype(std::declval<T>() -= std::declval<U>());
using type = decltype(std::declval<T>() -= std::declval<U>());
};

template <typename T, typename = void>
Expand All @@ -130,7 +130,7 @@ namespace hpx { namespace traits
struct predecrement_result<T,
typename util::always_void<decltype(--std::declval<T&>())>::type>
{
using type = decltype(--std::declval<T&>());
using type = decltype(--std::declval<T&>());
};

template <typename T, typename = void>
Expand All @@ -141,7 +141,7 @@ namespace hpx { namespace traits
struct preincrement_result<T,
typename util::always_void<decltype(++std::declval<T&>())>::type>
{
using type = decltype(++std::declval<T&>());
using type = decltype(++std::declval<T&>());
};

template <typename T, typename = void>
Expand All @@ -152,7 +152,7 @@ namespace hpx { namespace traits
struct postdecrement_result<T,
typename util::always_void<decltype(std::declval<T&>()--)>::type>
{
using type = decltype(std::declval<T&>()--);
using type = decltype(std::declval<T&>()--);
};

template <typename T, typename = void>
Expand All @@ -163,7 +163,7 @@ namespace hpx { namespace traits
struct postincrement_result<T,
typename util::always_void<decltype(std::declval<T&>()++)>::type>
{
using type = decltype(std::declval<T&>()++);
using type = decltype(std::declval<T&>()++);
};

template <typename T, typename U, typename = void>
Expand All @@ -176,7 +176,7 @@ namespace hpx { namespace traits
decltype(std::declval<T&>()[std::declval<U>()])
>::type>
{
using type = decltype(std::declval<T&>()[std::declval<U>()]);
using type = decltype(std::declval<T&>()[std::declval<U>()]);
};

template <typename T, typename U, typename = void>
Expand All @@ -189,7 +189,7 @@ namespace hpx { namespace traits
decltype(std::declval<T>() - std::declval<U>())
>::type>
{
using type = decltype(std::declval<T>() - std::declval<U>());
using type = decltype(std::declval<T>() - std::declval<U>());
};

template <typename Iter, typename = void>
Expand All @@ -212,21 +212,21 @@ namespace hpx { namespace traits
std::is_convertible<bool,
typename equality_result<Iter, Iter>::type
>::value
&& std::is_convertible<bool,
&& std::is_convertible<bool,
typename inequality_result<Iter, Iter>::type
>::value
&& std::is_same<
&& std::is_same<
typename std::add_lvalue_reference<Iter>::type,
typename predecrement_result<Iter>::type
>::value
&& std::is_same<
&& std::is_same<
typename std::add_lvalue_reference<Iter>::type,
typename preincrement_result<Iter>::type
>::value
&& std::is_same<Iter,
&& std::is_same<Iter,
typename postdecrement_result<Iter>::type
>::value
&& std::is_same<Iter,
&& std::is_same<Iter,
typename postincrement_result<Iter>::type
>::value>
{};
Expand Down Expand Up @@ -259,35 +259,35 @@ namespace hpx { namespace traits
>::type>
: std::integral_constant<bool,
bidirectional_concept<Iter>::value
&& std::is_same<
&& std::is_same<
typename dereference_result<Iter>::type,
typename subscript_result<Iter,
typename std::iterator_traits<Iter>::difference_type
>::type
>::value
&& std::is_same<
&& std::is_same<
Iter,
typename addition_result<Iter,
typename std::iterator_traits<Iter>::difference_type
>::type
>::value
&& std::is_same<
&& std::is_same<
typename std::add_lvalue_reference<Iter>::type,
typename inplace_addition_result<Iter,
typename std::iterator_traits<Iter>::difference_type
>::type
>::value
&& std::is_same<
&& std::is_same<
Iter,
typename subtraction_result<Iter,
typename std::iterator_traits<Iter>::difference_type
>::type
>::value
&& std::is_same<
&& std::is_same<
typename std::iterator_traits<Iter>::difference_type,
typename subtraction_result<Iter, Iter>::type
>::value
&& std::is_same<
&& std::is_same<
typename std::add_lvalue_reference<Iter>::type,
typename inplace_subtraction_result<Iter,
typename std::iterator_traits<Iter>::difference_type
Expand All @@ -301,15 +301,15 @@ namespace hpx { namespace traits
{};

/**
* The interface gaurantees of InputIterator and ForwardIterator
* The interface guarantees of InputIterator and ForwardIterator
* concepts are not sufficient to robustly distinguish whether a given
* type models a forward iterator or an input iterator through interface
* inspection and concept emulation alone, given the type in question
* models an iterator category no stronger than forward.
*
* That said, a type which models the BidirectionalIterator concept
* also models a ForwardIterator concept, by definition (and the
* interface gaurantees on the BidirectionalIterator concept are
* interface guarantees on the BidirectionalIterator concept are
* sufficient for robust concept checking). Here we provide a
* specialization to capture this case, such that, bidirectional and
* random access iterators will be properly recognized as satisfying the
Expand Down Expand Up @@ -364,7 +364,7 @@ namespace hpx { namespace traits
std::is_base_of<
Traversal, typename boost::iterator_traversal<Iter>::type
>::value
|| satisfy_traversal_concept<Iter, Traversal>::value>
|| satisfy_traversal_concept<Iter, Traversal>::value>
{};

///////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -401,11 +401,11 @@ namespace hpx { namespace traits
boost::bidirectional_traversal_tag,
typename boost::iterator_traversal<Iter>::type
>::value
|| (satisfy_traversal_concept<Iter,
|| ( satisfy_traversal_concept<Iter,
boost::bidirectional_traversal_tag
>::value
&& !satisfy_traversal_concept<Iter,
boost::random_access_traversal_tag
&& !satisfy_traversal_concept<Iter,
boost::random_access_traversal_tag
>::value)>
{};

Expand All @@ -417,9 +417,9 @@ namespace hpx { namespace traits
boost::random_access_traversal_tag,
typename boost::iterator_traversal<Iter>::type
>::value
|| satisfy_traversal_concept<Iter,
boost::random_access_traversal_tag
>::value>
|| satisfy_traversal_concept<Iter,
boost::random_access_traversal_tag
>::value>
{};
}

Expand Down
14 changes: 14 additions & 0 deletions hpx/util/iterator_facade.hpp
Expand Up @@ -168,6 +168,13 @@ namespace hpx { namespace util
iterator_core_access::increment(this_);
return this_;
}

HPX_HOST_DEVICE Derived operator++(int)
{
Derived result(this->derived());
++*this;
return result;
}
};

// Implementation for bidirectional iterators
Expand Down Expand Up @@ -226,6 +233,13 @@ namespace hpx { namespace util
--*this;
return result;
}

HPX_HOST_DEVICE Derived operator++(int)
{
Derived result(this->derived());
++*this;
return result;
}
};

// Implementation for random access iterators
Expand Down

0 comments on commit 240135e

Please sign in to comment.