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