Skip to content

Commit

Permalink
Replacing all uses of boost::iterator_[adaptor|facade] with new facil…
Browse files Browse the repository at this point in the history
…ities
  • Loading branch information
hkaiser committed Jul 13, 2016
1 parent 7d23a6e commit 952bc8c
Show file tree
Hide file tree
Showing 11 changed files with 102 additions and 95 deletions.
Expand Up @@ -17,14 +17,13 @@
#include <hpx/runtime/naming/id_type.hpp>
#include <hpx/traits/segmented_iterator_traits.hpp>
#include <hpx/util/assert.hpp>
#include <hpx/util/iterator_adaptor.hpp>
#include <hpx/util/iterator_facade.hpp>

#include <hpx/components/containers/partitioned_vector/partitioned_vector_fwd.hpp>
#include <hpx/components/containers/partitioned_vector/partitioned_vector_component.hpp>

#include <boost/integer.hpp>
#include <boost/iterator/filter_iterator.hpp>
#include <boost/iterator/iterator_adaptor.hpp>
#include <boost/iterator/iterator_facade.hpp>

#include <cstdint>
#include <iterator>
Expand All @@ -39,12 +38,12 @@ namespace hpx
// This class wraps plain a vector<>::iterator or vector<>::const_iterator
template <typename T, typename Data, typename BaseIter>
class local_raw_vector_iterator
: public boost::iterator_adaptor<
: public hpx::util::iterator_adaptor<
local_raw_vector_iterator<T, Data, BaseIter>, BaseIter
>
{
private:
typedef boost::iterator_adaptor<
typedef hpx::util::iterator_adaptor<
local_raw_vector_iterator<T, Data, BaseIter>, BaseIter
> base_type;
typedef BaseIter base_iterator;
Expand Down Expand Up @@ -83,12 +82,12 @@ namespace hpx

template <typename T, typename Data, typename BaseIter>
class const_local_raw_vector_iterator
: public boost::iterator_adaptor<
: public hpx::util::iterator_adaptor<
const_local_raw_vector_iterator<T, Data, BaseIter>, BaseIter
>
{
private:
typedef boost::iterator_adaptor<
typedef hpx::util::iterator_adaptor<
const_local_raw_vector_iterator<T, Data, BaseIter>, BaseIter
> base_type;
typedef BaseIter base_iterator;
Expand Down Expand Up @@ -217,14 +216,14 @@ namespace hpx
/// partitioned backend of a hpx::vector.
template <typename T, typename Data>
class local_vector_iterator
: public boost::iterator_facade<
: public hpx::util::iterator_facade<
local_vector_iterator<T, Data>, T,
std::random_access_iterator_tag,
detail::local_vector_value_proxy<T, Data>
>
{
private:
typedef boost::iterator_facade<
typedef hpx::util::iterator_facade<
local_vector_iterator<T, Data>, T,
std::random_access_iterator_tag,
detail::local_vector_value_proxy<T, Data>
Expand Down Expand Up @@ -284,7 +283,7 @@ namespace hpx
HPX_SERIALIZATION_SPLIT_MEMBER()

protected:
friend class boost::iterator_core_access;
friend class hpx::util::iterator_core_access;

bool equal(local_vector_iterator const& other) const
{
Expand Down Expand Up @@ -351,14 +350,14 @@ namespace hpx

template <typename T, typename Data>
class const_local_vector_iterator
: public boost::iterator_facade<
: public hpx::util::iterator_facade<
const_local_vector_iterator<T, Data>, T const,
std::random_access_iterator_tag,
detail::const_local_vector_value_proxy<T, Data>
>
{
private:
typedef boost::iterator_facade<
typedef hpx::util::iterator_facade<
const_local_vector_iterator<T, Data>, T const,
std::random_access_iterator_tag,
detail::const_local_vector_value_proxy<T, Data>
Expand Down Expand Up @@ -423,7 +422,7 @@ namespace hpx
HPX_SERIALIZATION_SPLIT_MEMBER()

protected:
friend class boost::iterator_core_access;
friend class hpx::util::iterator_core_access;

bool equal(const_local_vector_iterator const& other) const
{
Expand Down Expand Up @@ -493,12 +492,12 @@ namespace hpx
/// This class implement the segmented iterator for the hpx::vector
template <typename T, typename Data, typename BaseIter>
class segment_vector_iterator
: public boost::iterator_adaptor<
: public hpx::util::iterator_adaptor<
segment_vector_iterator<T, Data, BaseIter>, BaseIter
>
{
private:
typedef boost::iterator_adaptor<
typedef hpx::util::iterator_adaptor<
segment_vector_iterator<T, Data, BaseIter>, BaseIter
> base_type;

Expand Down Expand Up @@ -527,12 +526,12 @@ namespace hpx

template <typename T, typename Data, typename BaseIter>
class const_segment_vector_iterator
: public boost::iterator_adaptor<
: public hpx::util::iterator_adaptor<
const_segment_vector_iterator<T, Data, BaseIter>, BaseIter
>
{
private:
typedef boost::iterator_adaptor<
typedef hpx::util::iterator_adaptor<
const_segment_vector_iterator<T, Data, BaseIter>, BaseIter
> base_type;

Expand Down Expand Up @@ -585,13 +584,13 @@ namespace hpx
/// This class implement the local segmented iterator for the hpx::vector
template <typename T, typename Data, typename BaseIter>
class local_segment_vector_iterator
: public boost::iterator_adaptor<
: public hpx::util::iterator_adaptor<
local_segment_vector_iterator<T, Data, BaseIter>, BaseIter,
Data, std::forward_iterator_tag
>
{
private:
typedef boost::iterator_adaptor<
typedef hpx::util::iterator_adaptor<
local_segment_vector_iterator<T, Data, BaseIter>, BaseIter,
Data, std::forward_iterator_tag
> base_type;
Expand Down Expand Up @@ -619,7 +618,7 @@ namespace hpx
}

private:
friend class boost::iterator_core_access;
friend class hpx::util::iterator_core_access;

typename base_type::reference dereference() const
{
Expand Down Expand Up @@ -654,13 +653,13 @@ namespace hpx
/// This class implements the (global) iterator functionality for hpx::vector.
template <typename T, typename Data>
class vector_iterator
: public boost::iterator_facade<
: public hpx::util::iterator_facade<
vector_iterator<T, Data>, T, std::random_access_iterator_tag,
detail::vector_value_proxy<T, Data>
>
{
private:
typedef boost::iterator_facade<
typedef hpx::util::iterator_facade<
vector_iterator<T, Data>, T, std::random_access_iterator_tag,
detail::vector_value_proxy<T, Data>
> base_type;
Expand Down Expand Up @@ -690,7 +689,7 @@ namespace hpx
size_type get_global_index() const { return global_index_; }

protected:
friend class boost::iterator_core_access;
friend class hpx::util::iterator_core_access;

bool equal(vector_iterator const& other) const
{
Expand Down Expand Up @@ -739,13 +738,13 @@ namespace hpx
///////////////////////////////////////////////////////////////////////////
template <typename T, typename Data>
class const_vector_iterator
: public boost::iterator_facade<
: public hpx::util::iterator_facade<
const_vector_iterator<T, Data>, T const,
std::random_access_iterator_tag, T const
>
{
private:
typedef boost::iterator_facade<
typedef hpx::util::iterator_facade<
const_vector_iterator<T, Data>, T const,
std::random_access_iterator_tag, T const
> base_type;
Expand Down Expand Up @@ -773,7 +772,7 @@ namespace hpx
size_type get_global_index() const { return global_index_; }

protected:
friend class boost::iterator_core_access;
friend class hpx::util::iterator_core_access;

bool equal(const_vector_iterator const& other) const
{
Expand Down
Expand Up @@ -11,11 +11,12 @@
/// \brief This file contains the implementation of iterators for hpx::unordered_map.

// The idea for these iterators is taken from
// http://afstern.org/matt/segmented.pdf.
// http://lafstern.org/matt/segmented.pdf.

#include <hpx/config.hpp>
//#include <hpx/runtime/naming/id_type.hpp>
#include <hpx/util/assert.hpp>
#include <hpx/util/iterator_adaptor.hpp>

#include <hpx/components/containers/unordered/partition_unordered_map_component.hpp>

Expand All @@ -27,9 +28,6 @@
#include <vector>

#include <boost/integer.hpp>
// #include <boost/iterator/iterator_facade.hpp>
#include <boost/iterator/iterator_adaptor.hpp>
// #include <boost/iterator/filter_iterator.hpp>

namespace hpx
{
Expand All @@ -52,13 +50,13 @@ namespace hpx
template <typename Key, typename T, typename Hash, typename KeyEqual,
typename BaseIter>
class segment_unordered_map_iterator
: public boost::iterator_adaptor<
: public hpx::util::iterator_adaptor<
segment_unordered_map_iterator<Key, T, Hash, KeyEqual, BaseIter>,
BaseIter
>
{
private:
typedef boost::iterator_adaptor<
typedef hpx::util::iterator_adaptor<
segment_unordered_map_iterator<Key, T, Hash, KeyEqual, BaseIter>,
BaseIter
> base_type;
Expand Down Expand Up @@ -91,14 +89,14 @@ namespace hpx
template <typename Key, typename T, typename Hash, typename KeyEqual,
typename BaseIter>
class const_segment_unordered_map_iterator
: public boost::iterator_adaptor<
: public hpx::util::iterator_adaptor<
const_segment_unordered_map_iterator<
Key, T, Hash, KeyEqual, BaseIter>,
BaseIter
>
{
private:
typedef boost::iterator_adaptor<
typedef hpx::util::iterator_adaptor<
const_segment_unordered_map_iterator<
Key, T, Hash, KeyEqual, BaseIter>,
BaseIter
Expand Down Expand Up @@ -152,13 +150,13 @@ namespace hpx
// /// This class implement the local segmented iterator for the hpx::vector
// template <typename T, typename BaseIter>
// class local_segment_vector_iterator
// : public boost::iterator_adaptor<
// : public hpx::util::iterator_adaptor<
// local_segment_vector_iterator<T, BaseIter>, BaseIter,
// std::vector<T>, std::forward_iterator_tag
// >
// {
// private:
// typedef boost::iterator_adaptor<
// typedef hpx::util::iterator_adaptor<
// local_segment_vector_iterator<T, BaseIter>, BaseIter,
// std::vector<T>, std::forward_iterator_tag
// > base_type;
Expand All @@ -183,7 +181,7 @@ namespace hpx
// }
//
// private:
// friend class boost::iterator_core_access;
// friend class hpx::util::iterator_core_access;
//
// typename base_type::reference dereference() const
// {
Expand Down
2 changes: 2 additions & 0 deletions hpx/include/util.hpp
Expand Up @@ -17,6 +17,8 @@
#include <hpx/util/high_resolution_clock.hpp>
#include <hpx/util/high_resolution_timer.hpp>
#include <hpx/util/interval_timer.hpp>
#include <hpx/util/iterator_adaptor.hpp>
#include <hpx/util/iterator_facade.hpp>
#include <hpx/util/parse_command_line.hpp>
#include <hpx/util/safe_lexical_cast.hpp>
#include <hpx/util/thread_aware_timer.hpp>
Expand Down
31 changes: 20 additions & 11 deletions hpx/util/iterator_facade.hpp
Expand Up @@ -50,10 +50,9 @@ namespace hpx { namespace util
it.decrement();
}

template <typename Iterator>
template <typename Reference, typename Iterator>
HPX_HOST_DEVICE HPX_FORCEINLINE
static auto dereference(Iterator const& it)
-> decltype(it.dereference())
static Reference dereference(Iterator const& it)
{
return it.dereference();
}
Expand All @@ -67,8 +66,8 @@ namespace hpx { namespace util

template <typename Iterator1, typename Iterator2>
HPX_HOST_DEVICE HPX_FORCEINLINE
static auto distance_to(Iterator1 const& lhs, Iterator2 const& rhs)
-> decltype(lhs.distance_to(rhs))
static typename std::iterator_traits<Iterator1>::difference_type
distance_to(Iterator1 const& lhs, Iterator2 const& rhs)
{
return lhs.distance_to(rhs);
}
Expand Down Expand Up @@ -148,7 +147,8 @@ namespace hpx { namespace util
public:
HPX_HOST_DEVICE reference operator*() const
{
return iterator_core_access::dereference(this->derived());
return iterator_core_access::
template dereference<reference>(this->derived());
}

HPX_HOST_DEVICE pointer operator->() const
Expand Down Expand Up @@ -304,8 +304,6 @@ namespace hpx { namespace util
> iterator_adaptor_;

public:
typedef base_type iterator_core_access;

HPX_HOST_DEVICE iterator_facade()
: base_type()
{
Expand Down Expand Up @@ -520,7 +518,7 @@ namespace hpx { namespace util
static_assert(
hpx::traits::is_random_access_iterator<Derived1>::value,
"Iterator needs to be random access");
return 0 <=
return 0 <
iterator_core_access::distance_to(
static_cast<Derived1 const&>(lhs),
static_cast<Derived2 const&>(rhs));
Expand All @@ -531,7 +529,7 @@ namespace hpx { namespace util
static_assert(
hpx::traits::is_random_access_iterator<Derived1>::value,
"Iterator needs to be random access");
return 0 >=
return 0 >
iterator_core_access::distance_to(
static_cast<Derived1 const&>(lhs),
static_cast<Derived2 const&>(rhs));
Expand All @@ -542,7 +540,7 @@ namespace hpx { namespace util
static_assert(
hpx::traits::is_random_access_iterator<Derived1>::value,
"Iterator needs to be random access");
return 0 <
return 0 <=
iterator_core_access::distance_to(
static_cast<Derived1 const&>(lhs),
static_cast<Derived2 const&>(rhs));
Expand All @@ -559,6 +557,17 @@ namespace hpx { namespace util
static_cast<Derived2 const&>(rhs));
}

HPX_UTIL_ITERATOR_FACADE_INTEROP_HEAD(inline, -,
typename std::iterator_traits<Derived2>::difference_type)
{
static_assert(
hpx::traits::is_random_access_iterator<Derived1>::value,
"Iterator needs to be random access");
return iterator_core_access::distance_to(
static_cast<Derived1 const&>(rhs),
static_cast<Derived2 const&>(lhs));
}

#undef HPX_UTIL_ITERATOR_FACADE_INTEROP_HEAD

template <typename Derived,
Expand Down

0 comments on commit 952bc8c

Please sign in to comment.