Skip to content

Commit

Permalink
Fixing compilation of vector_for_each test
Browse files Browse the repository at this point in the history
  • Loading branch information
hkaiser committed Jul 21, 2015
1 parent e7cb745 commit 9888118
Show file tree
Hide file tree
Showing 6 changed files with 228 additions and 173 deletions.
2 changes: 1 addition & 1 deletion hpx/parallel/segmented_algorithms/detail/dispatch.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ namespace hpx { namespace parallel { HPX_INLINE_NAMESPACE(v1) { namespace detail
return
detail::algorithm_result_helper<R>::call(
algo.call(policy, boost::mpl::true_(),
segmented_local_iterator_traits<Args>::local(args)...
segmented_local_iterator_traits<Args>::local(args)...
)
);
}
Expand Down
25 changes: 23 additions & 2 deletions hpx/parallel/traits/projected.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,33 @@
#define HPX_PARALLEL_TRAITS_PROJECTED_JUL_18_2015_1001PM

#include <hpx/config.hpp>
#include <hpx/traits/segmented_iterator_traits.hpp>
#include <hpx/util/result_of.hpp>
#include <hpx/util/decay.hpp>
#include <hpx/util/detail/pack.hpp>

#include <type_traits>
#include <iterator>

///////////////////////////////////////////////////////////////////////////////
namespace hpx { namespace traits
{
// For segmented iterators, we consider the local_raw_iterator instead of
// the given one.
template <typename Iterator>
struct projected_iterator<Iterator,
typename std::enable_if<is_segmented_iterator<Iterator>::value>::type>
{
typedef typename segmented_iterator_traits<
Iterator
>::local_iterator local_iterator;

typedef typename segmented_local_iterator_traits<
local_iterator
>::local_raw_iterator type;
};
}}

namespace hpx { namespace parallel { namespace traits
{
///////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -99,15 +119,16 @@ namespace hpx { namespace parallel { namespace traits
struct is_projected
: detail::is_projected<
typename hpx::util::decay<F>::type,
typename hpx::util::decay<Iter>::type>
typename hpx::traits::projected_iterator<Iter>::type>
{};

///////////////////////////////////////////////////////////////////////////
template <typename Proj, typename Iter>
struct projected
{
typedef typename hpx::util::decay<Proj>::type projector_type;
typedef typename hpx::util::decay<Iter>::type iterator_type;
typedef typename hpx::traits::projected_iterator<Iter>::type
iterator_type;
};

template <typename Projected, typename Enable = void>
Expand Down
6 changes: 6 additions & 0 deletions hpx/traits.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,9 +152,15 @@ namespace hpx { namespace traits
template <typename Iterator, typename Enable = void>
struct segmented_iterator_traits;

template <typename Iterator, typename Enable = void>
struct is_segmented_iterator;

template <typename Iterator, typename Enable = void>
struct segmented_local_iterator_traits;

template <typename T, typename Enable = void>
struct projected_iterator;

///////////////////////////////////////////////////////////////////////////
template <typename T, typename Enable = void>
struct is_distribution_policy;
Expand Down
172 changes: 9 additions & 163 deletions hpx/traits/segmented_iterator_traits.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ namespace hpx { namespace traits
typedef std::false_type is_segmented_iterator;
};

template <typename Iterator, typename Enable>
struct is_segmented_iterator
: segmented_iterator_traits<Iterator>::is_segmented_iterator
{};

///////////////////////////////////////////////////////////////////////////
// traits allowing to distinguish iterators which have a purely local
// representation
Expand Down Expand Up @@ -52,170 +57,11 @@ namespace hpx { namespace traits
};

///////////////////////////////////////////////////////////////////////////
namespace functional
template <typename T, typename Enable>
struct projected_iterator
{
struct segmented_iterator_segment
{
template <typename Iterator>
struct apply
{
typedef typename segmented_iterator_traits<
Iterator
>::segment_iterator type;

template <typename T>
struct result;

template <typename This, typename Iter>
struct result<This(Iter)>
{
typedef typename apply::type type;
};

template <typename Iter>
typename result<segmented_iterator_segment(Iter)>::type
operator()(Iter iter) const
{
return segmented_iterator_traits<Iterator>::segment(iter);
};
};
};

struct segmented_iterator_local
{
template <typename Iterator>
struct apply
{
typedef typename segmented_iterator_traits<
Iterator
>::local_iterator type;

template <typename T>
struct result;

template <typename This, typename Iter>
struct result<This(Iter)>
{
typedef typename apply::type type;
};

template <typename Iter>
typename result<segmented_iterator_local(Iter)>::type
operator()(Iter iter) const
{
return segmented_iterator_traits<Iterator>::local(iter);
};
};
};

struct segmented_iterator_begin
{
template <typename Iterator>
struct apply
{
typedef typename segmented_iterator_traits<
Iterator
>::local_iterator type;

template <typename T>
struct result;

template <typename This, typename SegIter>
struct result<This(SegIter)>
{
typedef typename apply::type type;
};

template <typename SegIter>
typename result<segmented_iterator_begin(SegIter)>::type
operator()(SegIter iter) const
{
return segmented_iterator_traits<Iterator>::begin(iter);
};
};
};

struct segmented_iterator_end
{
template <typename Iterator>
struct apply
{
typedef typename segmented_iterator_traits<
Iterator
>::local_iterator type;

template <typename T>
struct result;

template <typename This, typename SegIter>
struct result<This(SegIter)>
{
typedef typename apply::type type;
};

template <typename SegIter>
typename result<segmented_iterator_end(SegIter)>::type
operator()(SegIter iter) const
{
return segmented_iterator_traits<Iterator>::end(iter);
};
};
};

struct segmented_iterator_local_begin
{
template <typename Iterator>
struct apply
{
typedef typename segmented_iterator_traits<
Iterator
>::local_raw_iterator type;

template <typename T>
struct result;

template <typename This, typename LocalSegIter>
struct result<This(LocalSegIter)>
{
typedef typename apply::type type;
};

template <typename LocalSegIter>
typename result<segmented_iterator_local_begin(LocalSegIter)>::type
operator()(LocalSegIter iter) const
{
return segmented_iterator_traits<Iterator>::begin(iter);
};
};
};

struct segmented_iterator_local_end
{
template <typename Iterator>
struct apply
{
typedef typename segmented_iterator_traits<
Iterator
>::local_raw_iterator type;

template <typename T>
struct result;

template <typename This, typename LocalSegIter>
struct result<This(LocalSegIter)>
{
typedef typename apply::type type;
};

template <typename LocalSegIter>
typename result<segmented_iterator_local_end(LocalSegIter)>::type
operator()(LocalSegIter iter) const
{
return segmented_iterator_traits<Iterator>::end(iter);
};
};
};
}
typedef typename hpx::util::decay<T>::type type;
};
}}

#endif
Expand Down
Loading

0 comments on commit 9888118

Please sign in to comment.