29 #ifndef XGBOOST_SPAN_H_
30 #define XGBOOST_SPAN_H_
33 #include <xgboost/logging.h>
39 #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
79 #if defined(__CUDA_ARCH__)
85 #define CUDA_KERNEL_CHECK(cond) \
87 if (XGBOOST_EXPECT(!(cond), false)) { \
94 #define __ASSERT_STR_HELPER(x) #x
96 #define CUDA_KERNEL_CHECK(cond) \
97 (XGBOOST_EXPECT((cond), true) \
98 ? static_cast<void>(0) \
99 : __assert_fail(__ASSERT_STR_HELPER((cond)), __FILE__, __LINE__, __PRETTY_FUNCTION__))
103 #define KERNEL_CHECK CUDA_KERNEL_CHECK
105 #define SPAN_CHECK KERNEL_CHECK
109 #if defined(XGBOOST_STRICT_R_MODE) && XGBOOST_STRICT_R_MODE == 1
111 #define KERNEL_CHECK(cond)
113 #define SPAN_CHECK(cond) KERNEL_CHECK(cond)
117 #define KERNEL_CHECK(cond) (XGBOOST_EXPECT((cond), true) ? static_cast<void>(0) : std::terminate())
119 #define SPAN_CHECK(cond) KERNEL_CHECK(cond)
125 #define SPAN_LT(lhs, rhs) SPAN_CHECK((lhs) < (rhs))
135 std::is_same<std::ptrdiff_t, std::int64_t>::value,
139 #if defined(_MSC_VER) && _MSC_VER < 1910
140 constexpr
const std::size_t
146 enum class byte : unsigned char {};
148 template <
class ElementType, std::
size_t Extent>
153 template <
typename SpanType,
bool IsConst>
155 using ElementType =
typename SpanType::element_type;
163 IsConst,
const ElementType, ElementType>::type&;
164 using pointer =
typename std::add_pointer<reference>::type;
169 const SpanType* _span,
174 template <bool B, typename std::enable_if<!B && IsConst>::type* =
nullptr>
244 return _lhs.span_ == _rhs.span_ && _lhs.index_ == _rhs.index_;
249 return !(_lhs == _rhs);
254 return _lhs.index_ < _rhs.index_;
259 return !(_rhs < _lhs);
269 return !(_rhs > _lhs);
274 typename SpanType::index_type
index_ { 0 };
288 template <std::
size_t Extent, std::
size_t Offset, std::
size_t Count>
290 std::size_t, Count != dynamic_extent ?
291 Count : (Extent != dynamic_extent ? Extent - Offset : Extent)> {};
297 template <
typename T, std::
size_t Extent>
300 Extent == dynamic_extent ?
301 Extent : sizeof(T) * Extent> {};
303 template <std::
size_t From, std::
size_t To>
305 bool, From == To || From == dynamic_extent || To == dynamic_extent> {};
307 template <
class From,
class To>
309 bool, std::is_convertible<From(*)[], To(*)[]>::value> {};
314 template <
class T, std::
size_t Extent>
321 template <
typename T>
328 template <
typename T>
335 template <
class InputIt1,
class InputIt2,
339 InputIt2 first2, InputIt2 last2) {
341 for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
342 if (comp(*first1, *first2)) {
345 if (comp(*first2, *first1)) {
349 return first1 == last1 && first2 != last2;
422 template <
typename T,
442 size_(_count), data_(_ptr) {
448 size_(_last - _first), data_(_first) {
452 template <std::
size_t N>
456 template <
class Container,
457 class =
typename std::enable_if<
458 !std::is_const<element_type>::value &&
460 std::is_convertible<typename Container::pointer, pointer>::value &&
461 std::is_convertible<
typename Container::pointer,
462 decltype(std::declval<Container>().
data())>::value>::type>
464 size_(_cont.
size()), data_(_cont.
data()) {
468 template <
class Container,
469 class =
typename std::enable_if<
470 std::is_const<element_type>::value &&
472 std::is_convertible<typename Container::pointer, pointer>::value &&
473 std::is_convertible<
typename Container::pointer,
474 decltype(std::declval<Container>().
data())>::value>::type>
475 Span(
const Container& _cont) : size_(_cont.
size()),
476 data_(_cont.
data()) {
480 template <
class U, std::size_t OtherExtent,
481 class =
typename std::enable_if<
491 size_ = _other.size();
492 data_ = _other.data();
503 return {
this,
size()};
511 return {
this,
size()};
537 return (*
this)[
size() - 1];
558 return size() *
sizeof(T);
566 template <std::
size_t Count>
569 return {
data(), Count};
573 std::size_t _count)
const {
575 return {
data(), _count};
578 template <std::
size_t Count>
581 return {
data() +
size() - Count, Count};
585 std::size_t _count)
const {
594 template <std::size_t
Offset,
598 detail::ExtentValue<Extent,
Offset, Count>::value> {
608 (_offset <=
size()) : (_offset + _count <=
size()));
609 return {
data() + _offset, _count ==
618 template <
class T, std::
size_t X,
class U, std::
size_t Y>
625 if (*l_beg != *r_beg) {
632 template <
class T, std::
size_t X,
class U, std::
size_t Y>
637 template <
class T, std::
size_t X,
class U, std::
size_t Y>
643 template <
class T, std::
size_t X,
class U, std::
size_t Y>
648 template <
class T, std::
size_t X,
class U, std::
size_t Y>
656 template <
class T, std::
size_t X,
class U, std::
size_t Y>
661 template <
class T, std::
size_t E>
664 return {
reinterpret_cast<const byte*
>(s.data()), s.
size_bytes()};
667 template <
class T, std::
size_t E>
670 return {
reinterpret_cast<byte*
>(s.data()), s.
size_bytes()};
676 template <
typename It>
679 using value_type =
typename std::iterator_traits<It>::value_type;
691 : it_{span.
data()}, size_{span.
size()} {}
707 return {
this,
size()};
713 #if defined(_MSC_VER) &&_MSC_VER < 1910
715 #pragma pop_macro("constexpr")
716 #undef __span_noexcept
Defines configuration macros and basic types for xgboost.
#define XGBOOST_DEVICE
Tag function as usable by device.
Definition: base.h:64
A simple custom Span type that uses general iterator instead of pointer.
Definition: span.h:677
It iterator
Definition: span.h:681
constexpr XGBOOST_DEVICE iterator begin() const noexcept
Definition: span.h:703
std::size_t index_type
Definition: span.h:680
XGBOOST_DEVICE IterSpan(common::Span< It, dynamic_extent > span)
Definition: span.h:690
constexpr XGBOOST_DEVICE iterator end() const noexcept
Definition: span.h:706
XGBOOST_DEVICE IterSpan(It it, index_type size)
Definition: span.h:689
XGBOOST_DEVICE bool empty() const noexcept
Definition: span.h:696
XGBOOST_DEVICE IterSpan< It > subspan(index_type _offset, index_type _count=dynamic_extent) const
Definition: span.h:698
XGBOOST_DEVICE index_type size() const noexcept
Definition: span.h:693
XGBOOST_DEVICE It data() const noexcept
Definition: span.h:697
typename std::iterator_traits< It >::value_type value_type
Definition: span.h:679
span class implementation, based on ISO++20 span<T>. The interface should be the same.
Definition: span.h:424
T & reference
Definition: span.h:431
XGBOOST_DEVICE Span(pointer _first, pointer _last)
Definition: span.h:447
T * pointer
Definition: span.h:430
detail::ptrdiff_t difference_type
Definition: span.h:429
XGBOOST_DEVICE reference operator()(index_type _idx) const
Definition: span.h:545
XGBOOST_DEVICE reference front() const
Definition: span.h:532
constexpr XGBOOST_DEVICE const_iterator cbegin() const __span_noexcept
Definition: span.h:506
constexpr XGBOOST_DEVICE iterator begin() const __span_noexcept
Definition: span.h:498
constexpr XGBOOST_DEVICE pointer data() const __span_noexcept
Definition: span.h:549
std::size_t index_type
Definition: span.h:428
XGBOOST_DEVICE reference back() const
Definition: span.h:536
XGBOOST_DEVICE auto subspan() const -> Span< element_type, detail::ExtentValue< Extent, Offset, Count >::value >
Definition: span.h:596
constexpr XGBOOST_DEVICE index_type size() const __span_noexcept
Definition: span.h:554
XGBOOST_DEVICE Span< element_type, Count > last() const
Definition: span.h:579
Span(Container &_cont)
Definition: span.h:463
XGBOOST_DEVICE Span< element_type, Count > first() const
Definition: span.h:567
constexpr XGBOOST_DEVICE Span(const Span &_other) __span_noexcept
Definition: span.h:487
constexpr XGBOOST_DEVICE bool empty() const __span_noexcept
Definition: span.h:561
constexpr XGBOOST_DEVICE index_type size_bytes() const __span_noexcept
Definition: span.h:557
constexpr XGBOOST_DEVICE Span(element_type(&arr)[N]) __span_noexcept
Definition: span.h:453
constexpr reverse_iterator rbegin() const __span_noexcept
Definition: span.h:514
T element_type
Definition: span.h:426
const std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: span.h:436
XGBOOST_DEVICE Span< element_type, dynamic_extent > first(std::size_t _count) const
Definition: span.h:572
constexpr XGBOOST_DEVICE const_reverse_iterator crbegin() const __span_noexcept
Definition: span.h:522
constexpr XGBOOST_DEVICE const_iterator cend() const __span_noexcept
Definition: span.h:510
XGBOOST_DEVICE ~Span() __span_noexcept
Definition: span.h:496
constexpr XGBOOST_DEVICE const_reverse_iterator crend() const __span_noexcept
Definition: span.h:526
constexpr Span() __span_noexcept=default
constexpr XGBOOST_DEVICE iterator end() const __span_noexcept
Definition: span.h:502
XGBOOST_DEVICE reference operator[](index_type _idx) const
Definition: span.h:540
constexpr reverse_iterator rend() const __span_noexcept
Definition: span.h:518
XGBOOST_DEVICE Span & operator=(const Span &_other) __span_noexcept
Definition: span.h:490
std::reverse_iterator< iterator > reverse_iterator
Definition: span.h:435
XGBOOST_DEVICE Span< element_type, dynamic_extent > subspan(index_type _offset, index_type _count=dynamic_extent) const
Definition: span.h:604
Span(const Container &_cont)
Definition: span.h:475
constexpr XGBOOST_DEVICE Span(const Span< U, OtherExtent > &_other) __span_noexcept
Definition: span.h:484
typename std::remove_cv< T >::type value_type
Definition: span.h:427
XGBOOST_DEVICE Span< element_type, dynamic_extent > last(std::size_t _count) const
Definition: span.h:584
XGBOOST_DEVICE pointer operator->() const
Definition: span.h:187
XGBOOST_DEVICE SpanIterator & operator--()
Definition: span.h:204
std::random_access_iterator_tag iterator_category
Definition: span.h:158
XGBOOST_DEVICE reference operator*() const
Definition: span.h:179
constexpr XGBOOST_DEVICE friend bool operator<(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:252
typename SpanType::value_type value_type
Definition: span.h:159
constexpr XGBOOST_DEVICE SpanIterator(const SpanType *_span, typename SpanType::index_type _idx) __span_noexcept
Definition: span.h:168
constexpr XGBOOST_DEVICE friend bool operator>(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:262
constexpr XGBOOST_DEVICE SpanIterator(const SpanIterator< SpanType, B > &other_) __span_noexcept
Definition: span.h:175
XGBOOST_DEVICE SpanIterator operator++(int)
Definition: span.h:198
constexpr XGBOOST_DEVICE friend bool operator==(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:242
XGBOOST_DEVICE SpanIterator & operator+=(difference_type n)
Definition: span.h:221
XGBOOST_DEVICE SpanIterator operator-(difference_type n) const
Definition: span.h:232
XGBOOST_DEVICE SpanIterator & operator-=(difference_type n)
Definition: span.h:237
detail::ptrdiff_t difference_type
Definition: span.h:160
typename std::conditional< IsConst, const ElementType, ElementType >::type & reference
Definition: span.h:163
XGBOOST_DEVICE reference operator[](difference_type n) const
Definition: span.h:183
typename std::add_pointer< reference >::type pointer
Definition: span.h:164
XGBOOST_DEVICE difference_type operator-(SpanIterator rhs) const
Definition: span.h:227
const SpanType * span_
Definition: span.h:273
constexpr XGBOOST_DEVICE friend bool operator>=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:267
XGBOOST_DEVICE SpanIterator operator+(difference_type n) const
Definition: span.h:216
constexpr SpanIterator()=default
constexpr XGBOOST_DEVICE friend bool operator!=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:247
constexpr XGBOOST_DEVICE friend bool operator<=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:257
XGBOOST_DEVICE SpanIterator operator--(int)
Definition: span.h:210
SpanType::index_type index_
Definition: span.h:274
XGBOOST_DEVICE SpanIterator & operator++()
Definition: span.h:192
Definition: intrusive_ptr.h:207
XGBOOST_DEVICE bool LexicographicalCompare(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
Definition: span.h:338
typename std::conditional< std::is_same< std::ptrdiff_t, std::int64_t >::value, std::ptrdiff_t, std::int64_t >::type ptrdiff_t
Definition: span.h:136
constexpr XGBOOST_DEVICE bool operator>=(Span< T, X > l, Span< U, Y > r)
Definition: span.h:657
constexpr XGBOOST_DEVICE bool operator!=(Span< T, X > l, Span< U, Y > r)
Definition: span.h:633
constexpr std::size_t dynamic_extent
Definition: span.h:143
byte
Definition: span.h:146
XGBOOST_DEVICE auto as_writable_bytes(Span< T, E > s) __span_noexcept -> Span< byte, detail::ExtentAsBytesValue< T, E >::value >
Definition: span.h:668
XGBOOST_DEVICE bool operator==(Span< T, X > l, Span< U, Y > r)
Definition: span.h:619
XGBOOST_DEVICE auto as_bytes(Span< T, E > s) __span_noexcept -> Span< const byte, detail::ExtentAsBytesValue< T, E >::value >
Definition: span.h:662
constexpr XGBOOST_DEVICE bool operator>(Span< T, X > l, Span< U, Y > r)
Definition: span.h:649
constexpr XGBOOST_DEVICE bool operator<=(Span< T, X > l, Span< U, Y > r)
Definition: span.h:644
constexpr XGBOOST_DEVICE bool operator<(Span< T, X > l, Span< U, Y > r)
Definition: span.h:638
constexpr size_t Offset(S(&strides)[D], size_t n, Head head)
Definition: linalg.h:53
namespace of xgboost
Definition: base.h:90
#define SPAN_LT(lhs, rhs)
Definition: span.h:125
#define __span_noexcept
span class based on ISO++20 span
Definition: span.h:72
#define SPAN_CHECK(cond)
Definition: span.h:119
constexpr XGBOOST_DEVICE bool operator()(const T &_x, const T &_y) const
Definition: span.h:330
constexpr XGBOOST_DEVICE bool operator()(const T &_x, const T &_y) const
Definition: span.h:323