29 #ifndef XGBOOST_SPAN_H_ 
 30 #define XGBOOST_SPAN_H_ 
 38 #include <type_traits> 
 42 #if defined(__CUDACC__) 
 43 #include <cuda_runtime.h> 
 63 #if defined(_MSC_VER) && _MSC_VER < 1910 
 65 #define __span_noexcept 
 67 #pragma push_macro("constexpr")
 
 72 #define __span_noexcept noexcept 
 78 #if defined(__CUDA_ARCH__) 
 84 #define CUDA_KERNEL_CHECK(cond) \ 
 86  if (XGBOOST_EXPECT(!(cond), false)) { \ 
 93 #define __ASSERT_STR_HELPER(x) #x 
 95 #define CUDA_KERNEL_CHECK(cond) \ 
 96  (XGBOOST_EXPECT((cond), true) \ 
 97  ? static_cast<void>(0) \ 
 98  : __assert_fail(__ASSERT_STR_HELPER((cond)), __FILE__, __LINE__, __PRETTY_FUNCTION__)) 
 102 #define KERNEL_CHECK(cond) CUDA_KERNEL_CHECK(cond) 
 104 #define SPAN_CHECK(cond) KERNEL_CHECK(cond) 
 108 #if defined(XGBOOST_STRICT_R_MODE) && XGBOOST_STRICT_R_MODE == 1 
 110 #define KERNEL_CHECK(cond) 
 112 #define SPAN_CHECK(cond) KERNEL_CHECK(cond) 
 116 #if defined(__SYCL_DEVICE_ONLY__) 
 119 #define SYCL_KERNEL_CHECK(cond) 
 121 #define KERNEL_CHECK(cond) SYCL_KERNEL_CHECK(cond) 
 124 #define KERNEL_CHECK(cond) (XGBOOST_EXPECT((cond), true) ? static_cast<void>(0) : std::terminate()) 
 127 #define SPAN_CHECK(cond) KERNEL_CHECK(cond) 
 133 #define SPAN_LT(lhs, rhs) SPAN_CHECK((lhs) < (rhs)) 
 143  std::is_same_v<std::ptrdiff_t, std::int64_t>, 
std::ptrdiff_t, std::int64_t>;
 
 146 #if defined(_MSC_VER) && _MSC_VER < 1910 
 147 constexpr 
const std::size_t
 
 153 enum class byte : unsigned char {}; 
 
 155 template <
class ElementType, std::
size_t Extent>
 
 160 template <
typename SpanType, 
bool IsConst>
 
 162  using ElementType = 
typename SpanType::element_type;
 
 170  IsConst, 
const ElementType, ElementType>::type&;
 
 171  using pointer = 
typename std::add_pointer<reference>::type; 
 
 176  const SpanType* _span,
 
 181  template <
bool B, 
typename std::enable_if_t<!B && IsConst>* = 
nullptr>
 
 251  return _lhs.span_ == _rhs.span_ && _lhs.index_ == _rhs.index_;
 
 256  return !(_lhs == _rhs);
 
 261  return _lhs.index_ < _rhs.index_;
 
 266  return !(_rhs < _lhs);
 
 276  return !(_rhs > _lhs);
 
 281  typename SpanType::index_type 
index_ { 0 };
 
 295 template <std::
size_t Extent, std::
size_t Offset, std::
size_t Count>
 
 297  std::size_t, Count != dynamic_extent ?
 
 298  Count : (Extent != dynamic_extent ? Extent - Offset : Extent)> {};
 
 304 template <
typename T, std::
size_t Extent>
 
 307  Extent == dynamic_extent ?
 
 308  Extent : sizeof(T) * Extent> {};
 
 310 template <std::
size_t From, std::
size_t To>
 
 312  bool, From == To || From == dynamic_extent || To == dynamic_extent> {};
 
 314 template <
class From, 
class To>
 
 316  : 
public std::integral_constant<bool, std::is_convertible_v<From (*)[], To (*)[]>> {}; 
 
 321 template <
class T, std::
size_t Extent>
 
 328 template <
typename T>
 
 335 template <
typename T>
 
 342 template <
class InputIt1, 
class InputIt2,
 
 346  InputIt2 first2, InputIt2 last2) {
 
 348  for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
 
 349  if (comp(*first1, *first2)) {
 
 352  if (comp(*first2, *first1)) {
 
 356  return first1 == last1 && first2 != last2;
 
 429 template <
typename T,
 
 449  size_(_count), data_(_ptr) {
 
 455  size_(_last - _first), data_(_first) {
 
 459  template <std::
size_t N>
 
 463  template <
class Container,
 
 464  class = 
typename std::enable_if_t<
 
 466  std::is_convertible_v<typename Container::pointer, pointer> &&
 
 467  std::is_convertible_v<
typename Container::pointer,
 
 468  decltype(std::declval<Container>().
data())>>>
 
 470  : size_(_cont.
size()), data_(_cont.
data()) {
 
 474  template <
class Container,
 
 475  class = 
typename std::enable_if_t<
 
 477  std::is_convertible_v<typename Container::pointer, pointer> &&
 
 478  std::is_convertible_v<
typename Container::pointer,
 
 479  decltype(std::declval<Container>().
data())>>>
 
 481  : size_(_cont.
size()), data_(_cont.
data()) {
 
 485  template <
class U, std::size_t OtherExtent,
 
 486  class = 
typename std::enable_if_t<
 
 491  data_(_other.data()) {}
 
 493  constexpr 
Span(
Span const& _other) noexcept(
true) = 
default;
 
 495  constexpr 
Span(
Span&& _other) noexcept(
true) = 
default;
 
 504  return {
this, 
size()};
 
 512  return {
this, 
size()};
 
 538  return (*
this)[
size() - 1];
 
 559  return size() * 
sizeof(T);
 
 567  template <std::
size_t Count>
 
 570  return {
data(), Count};
 
 574  std::size_t _count)
 const {
 
 576  return {
data(), _count};
 
 579  template <std::
size_t Count>
 
 582  return {
data() + 
size() - Count, Count};
 
 586  std::size_t _count)
 const {
 
 595  template <std::size_t 
Offset,
 
 599  detail::ExtentValue<Extent, 
Offset, Count>::value> {
 
 609  (_offset <= 
size()) : (_offset + _count <= 
size()));
 
 610  return {
data() + _offset, _count ==
 
 619 template <
class T, std::
size_t X, 
class U, std::
size_t Y>
 
 626  if (*l_beg != *r_beg) {
 
 633 template <
class T, std::
size_t X, 
class U, std::
size_t Y>
 
 638 template <
class T, std::
size_t X, 
class U, std::
size_t Y>
 
 644 template <
class T, std::
size_t X, 
class U, std::
size_t Y>
 
 649 template <
class T, std::
size_t X, 
class U, std::
size_t Y>
 
 657 template <
class T, std::
size_t X, 
class U, std::
size_t Y>
 
 662 template <
class T, std::
size_t E>
 
 665  return {
reinterpret_cast<const byte*
>(s.data()), s.
size_bytes()};
 
 668 template <
class T, std::
size_t E>
 
 671  return {
reinterpret_cast<byte*
>(s.data()), s.
size_bytes()};
 
 677 template <
typename It>
 
 680  using value_type = 
typename std::iterator_traits<It>::value_type; 
 
 692  : it_{span.
data()}, size_{span.
size()} {}
 
 712 template <
typename T>
 
 715 template <
typename T>
 
 720 #if defined(_MSC_VER) &&_MSC_VER < 1910 
 722 #pragma pop_macro("constexpr")
 
 723 #undef __span_noexcept 
#define XGBOOST_DEVICE
Tag function as usable by device.
Definition: base.h:64
使用通用迭代器而非指针的简单自定义 Span 类型。
constexpr XGBOOST_DEVICE iterator begin() const noexcept
XGBOOST_DEVICE IterSpan(common::Span< It, dynamic_extent > span)
constexpr XGBOOST_DEVICE iterator end() const noexcept
XGBOOST_DEVICE IterSpan(It it, index_type size)
XGBOOST_DEVICE bool empty() const noexcept
XGBOOST_DEVICE IterSpan< It > subspan(index_type _offset, index_type _count=dynamic_extent) const
XGBOOST_DEVICE index_type size() const noexcept
XGBOOST_DEVICE It data() const noexcept
typename std::iterator_traits< It >::value_type value_type
span类实现,基于ISO++20 span<T>。接口应相同。
Definition: span.h:431
XGBOOST_DEVICE Span(pointer _first, pointer _last)
Span(const Container &_cont)
XGBOOST_DEVICE reference operator()(index_type _idx) const
XGBOOST_DEVICE reference front() const
constexpr XGBOOST_DEVICE const_iterator cbegin() const __span_noexcept
constexpr XGBOOST_DEVICE iterator begin() const __span_noexcept
constexpr XGBOOST_DEVICE pointer data() const __span_noexcept
Definition: span.h:550
constexpr Span(Span const &_other) noexcept(true)=default
XGBOOST_DEVICE reference back() const
XGBOOST_DEVICE auto subspan() const -> Span< element_type, detail::ExtentValue< Extent, Offset, Count >::value >
定义: span.h:597
constexpr XGBOOST_DEVICE index_type size() const __span_noexcept
Definition: span.h:555
XGBOOST_DEVICE Span< element_type, Count > last() const
XGBOOST_DEVICE Span< element_type, Count > first() const
constexpr XGBOOST_DEVICE bool empty() const __span_noexcept
constexpr Span(Span &&_other) noexcept(true)=default
constexpr XGBOOST_DEVICE index_type size_bytes() const __span_noexcept
constexpr XGBOOST_DEVICE Span(element_type(&arr)[N]) __span_noexcept
constexpr reverse_iterator rbegin() const __span_noexcept
constexpr Span & operator=(Span &&_other) noexcept(true)=default
const std::reverse_iterator< const_iterator > const_reverse_iterator
XGBOOST_DEVICE Span< element_type, dynamic_extent > first(std::size_t _count) const
~Span() noexcept(true)=default
constexpr XGBOOST_DEVICE const_reverse_iterator crbegin() const __span_noexcept
constexpr XGBOOST_DEVICE const_iterator cend() const __span_noexcept
constexpr Span & operator=(Span const &_other) noexcept(true)=default
constexpr XGBOOST_DEVICE const_reverse_iterator crend() const __span_noexcept
constexpr XGBOOST_DEVICE iterator end() const __span_noexcept
XGBOOST_DEVICE reference operator[](index_type _idx) const
constexpr reverse_iterator rend() const __span_noexcept
XGBOOST_DEVICE Span(pointer _ptr, index_type _count)
std::reverse_iterator< iterator > 反向迭代器
XGBOOST_DEVICE Span< element_type, dynamic_extent > subspan(index_type _offset, index_type _count=dynamic_extent) const
constexpr XGBOOST_DEVICE Span(const Span< U, OtherExtent > &_other) __span_noexcept
typename std::remove_cv< T >::type 值类型
XGBOOST_DEVICE Span< element_type, dynamic_extent > last(std::size_t _count) const
XGBOOST_DEVICE pointer operator->() const
XGBOOST_DEVICE SpanIterator & operator--()
std::random_access_iterator_tag 迭代器类别
XGBOOST_DEVICE reference operator*() const
constexpr XGBOOST_DEVICE friend bool operator<(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
typename SpanType::value_type 值类型
constexpr XGBOOST_DEVICE SpanIterator(const SpanType *_span, typename SpanType::index_type _idx) __span_noexcept
constexpr XGBOOST_DEVICE friend bool operator>(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
constexpr XGBOOST_DEVICE SpanIterator(const SpanIterator< SpanType, B > &other_) __span_noexcept
XGBOOST_DEVICE SpanIterator operator++(int)
constexpr XGBOOST_DEVICE friend bool operator==(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
XGBOOST_DEVICE SpanIterator & operator+=(difference_type n)
XGBOOST_DEVICE SpanIterator operator-(difference_type n) const
XGBOOST_DEVICE SpanIterator & operator-=(difference_type n)
typename std::conditional< IsConst, const ElementType, ElementType >::type & 引用
XGBOOST_DEVICE reference operator[](difference_type n) const
typename std::add_pointer< reference >::type 指针
XGBOOST_DEVICE difference_type operator-(SpanIterator rhs) const
constexpr XGBOOST_DEVICE friend bool operator>=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
XGBOOST_DEVICE SpanIterator operator+(difference_type n) const
constexpr SpanIterator()=default
constexpr XGBOOST_DEVICE friend bool operator!=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
constexpr XGBOOST_DEVICE friend bool operator<=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
XGBOOST_DEVICE SpanIterator operator--(int)
SpanType::index_type index_
XGBOOST_DEVICE SpanIterator & operator++()
Definition: intrusive_ptr.h:207
XGBOOST_DEVICE bool LexicographicalCompare(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
typename std::conditional_t< std::is_same_v< std::ptrdiff_t, std::int64_t >, std::ptrdiff_t, std::int64_t > ptrdiff_t
constexpr XGBOOST_DEVICE bool operator>=(Span< T, X > l, Span< U, Y > r)
constexpr XGBOOST_DEVICE bool operator!=(Span< T, X > l, Span< U, Y > r)
constexpr std::size_t 动态范围
XGBOOST_DEVICE auto as_writable_bytes(Span< T, E > s) __span_noexcept -> Span< byte, detail::ExtentAsBytesValue< T, E >::value >
XGBOOST_DEVICE bool operator==(Span< T, X > l, Span< U, Y > r)
XGBOOST_DEVICE auto as_bytes(Span< T, E > s) __span_noexcept -> Span< const byte, detail::ExtentAsBytesValue< T, E >::value >
constexpr XGBOOST_DEVICE bool operator>(Span< T, X > l, Span< U, Y > r)
Span(std::vector< T > const &) -> Span< T const >
constexpr XGBOOST_DEVICE bool operator<=(Span< T, X > l, Span< U, Y > r)
constexpr XGBOOST_DEVICE bool operator<(Span< T, X > l, Span< U, Y > r)
constexpr size_t Offset(S(&strides)[D], size_t n, Head head)
#define SPAN_LT(lhs, rhs)
#define __span_noexcept
基于 ISO++20 span 的 span 类
constexpr XGBOOST_DEVICE bool operator()(const T &_x, const T &_y) const
constexpr XGBOOST_DEVICE bool operator()(const T &_x, const T &_y) const