Skip to content

Commit

Permalink
move is_contiguous_iterator to type_support
Browse files Browse the repository at this point in the history
  • Loading branch information
isidorostsa committed Sep 10, 2023
1 parent 8531572 commit 3256dec
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#pragma once

#include <hpx/iterator_support/traits/is_iterator.hpp>
#include <hpx/type_support/is_contiguous_iterator.hpp>
#include <hpx/type_support/is_relocatable.hpp>

#include <type_traits>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <hpx/parallel/algorithms/detail/distance.hpp>
#include <hpx/parallel/util/loop.hpp>
#include <hpx/parallel/util/result_types.hpp>
#include <hpx/type_support/is_contiguous_iterator.hpp>

#include <algorithm>
#include <cstddef>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -564,52 +564,4 @@ namespace hpx::traits {
template <typename Iter>
inline constexpr bool is_zip_iterator_v = is_zip_iterator<Iter>::value;

///////////////////////////////////////////////////////////////////////////
// Iterators are contiguous if they are pointers (without concepts we have
// no generic way of determining whether an iterator is contiguous)

namespace detail {

// Iterators returned from std::vector are contiguous (by definition)

// different versions of clang-format disagree
// clang-format off
template <typename Iter, typename T = iter_value_t<Iter>>
struct is_vector_iterator
: std::integral_constant<bool,
std::is_same_v<
decltype(std::declval<std::vector<T>&>().begin()), Iter> ||
std::is_same_v<
decltype(std::declval<std::vector<T>&>().cbegin()), Iter>>
{
};
// clang-format on
} // namespace detail

template <typename Iter,
bool not_vector =
// When _GLIBCXX_DEBUG is defined vectors are contiguous, but the iterators
// are not plain pointers.
#if defined(_GLIBCXX_DEBUG)
false
#else
detail::is_vector_iterator<Iter>::value
#endif
>
struct is_contiguous_iterator : std::is_pointer<Iter>::type
{
};

template <typename Iter>
struct is_contiguous_iterator<Iter, true> : std::true_type
{
};

template <typename Iter>
using is_contiguous_iterator_t =
typename is_contiguous_iterator<Iter>::type;

template <typename Iter>
inline constexpr bool is_contiguous_iterator_v =
is_contiguous_iterator<Iter>::value;
} // namespace hpx::traits
1 change: 1 addition & 0 deletions libs/core/type_support/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ set(type_support_headers
hpx/type_support/identity.hpp
hpx/type_support/is_relocatable.hpp
hpx/type_support/is_trivially_relocatable.hpp
hpx/type_support/is_contiguous_iterator.hpp
hpx/type_support/lazy_conditional.hpp
hpx/type_support/lazy_enable_if.hpp
hpx/type_support/pack.hpp
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// Copyright (c) 2007-2022 Hartmut Kaiser
//
// SPDX-License-Identifier: BSL-1.0
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#pragma once

#include <type_traits>
#include <utility>
#include <vector>

namespace hpx::traits {
///////////////////////////////////////////////////////////////////////////
// Iterators are contiguous if they are pointers (without concepts we have
// no generic way of determining whether an iterator is contiguous)

namespace detail {

// Iterators returned from std::vector are contiguous (by definition)

// different versions of clang-format disagree
template <typename Iter,
typename T = typename std::iterator_traits<Iter>::value_type>
// clang-format off
struct is_vector_iterator
: std::integral_constant<bool,
std::is_same_v<
decltype(std::declval<std::vector<T>&>().begin()), Iter> ||
std::is_same_v<
decltype(std::declval<std::vector<T>&>().cbegin()), Iter>>
// clang-format on
{
};
} // namespace detail

template <typename Iter,
bool not_vector =
// When _GLIBCXX_DEBUG is defined vectors are contiguous, but the iterators
// are not plain pointers.
#if defined(_GLIBCXX_DEBUG)
false
#else
detail::is_vector_iterator<Iter>::value
#endif
>
struct is_contiguous_iterator : std::is_pointer<Iter>::type
{
};

template <typename Iter>
struct is_contiguous_iterator<Iter, true> : std::true_type
{
};

template <typename Iter>
using is_contiguous_iterator_t =
typename is_contiguous_iterator<Iter>::type;

template <typename Iter>
inline constexpr bool is_contiguous_iterator_v =
is_contiguous_iterator<Iter>::value;
} // namespace hpx::traits
4 changes: 3 additions & 1 deletion libs/core/type_support/tests/unit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ endforeach()

if(HPX_WITH_COMPILE_ONLY_TESTS)
# add compile time tests
set(compile_tests is_relocatable is_trivially_relocatable)
set(compile_tests is_relocatable is_trivially_relocatable
is_contiguous_iterator
)

if(HPX_WITH_FAIL_COMPILE_TESTS)
set(fail_compile_tests fail_relocate_at fail_uninitialized_relocate)
Expand Down
34 changes: 34 additions & 0 deletions libs/core/type_support/tests/unit/is_contiguous_iterator.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright (c) 2023 Isidoros Tsaousis-Seiras
//
// SPDX-License-Identifier: BSL-1.0
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#include <cassert>
#include <vector>

#include <hpx/type_support/is_contiguous_iterator.hpp>

using hpx::traits::is_contiguous_iterator_v;

// std::vector<int>::iterator is a contiguous iterator
static_assert(is_contiguous_iterator_v<std::vector<int>::iterator>);
static_assert(is_contiguous_iterator_v<std::vector<int>::const_iterator>);
// reverse_iterator is not a contiguous iterator (it is bidirectional)
static_assert(!is_contiguous_iterator_v<std::vector<int>::reverse_iterator>);
static_assert(
!is_contiguous_iterator_v<std::vector<int>::const_reverse_iterator>);

// pointers are contiguous iterators
static_assert(is_contiguous_iterator_v<int*>);
static_assert(is_contiguous_iterator_v<int const*>);
static_assert(is_contiguous_iterator_v<int (*)[]>);
static_assert(is_contiguous_iterator_v<int const (*)[]>);
static_assert(is_contiguous_iterator_v<int (*)[4]>);
static_assert(is_contiguous_iterator_v<int const (*)[4]>);

// arrays are not contiguous iterators
static_assert(!is_contiguous_iterator_v<int[]>);
static_assert(!is_contiguous_iterator_v<int[4]>);
static_assert(!is_contiguous_iterator_v<int const[]>);
static_assert(!is_contiguous_iterator_v<int const[4]>);

0 comments on commit 3256dec

Please sign in to comment.