Go to the documentation of this file.
29 #ifndef XGBOOST_SPAN_H_
30 #define XGBOOST_SPAN_H_
33 #include <xgboost/logging.h>
38 #include <type_traits>
58 #if defined(_MSC_VER) && _MSC_VER < 1910
60 #define __span_noexcept
62 #pragma push_macro("constexpr")
67 #define __span_noexcept noexcept
69 #endif // defined(_MSC_VER) && _MSC_VER < 1910
76 #define KERNEL_CHECK(cond) \
79 printf("\nKernel error:\n" \
81 "\t%s\n\tExpecting: %s\n" \
82 "\tBlock: [%d, %d, %d], Thread: [%d, %d, %d]\n\n", \
83 __FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, blockIdx.x, \
84 blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z); \
89 #if defined(__CUDA_ARCH__)
90 #define SPAN_CHECK KERNEL_CHECK
91 #elif defined(XGBOOST_STRICT_R_MODE) && XGBOOST_STRICT_R_MODE == 1 // R package
92 #define SPAN_CHECK CHECK // check from dmlc
93 #else // not CUDA, not R
94 #define SPAN_CHECK(cond) \
96 if (XGBOOST_EXPECT(!(cond), false)) { \
97 fprintf(stderr, "[xgboost] Condition %s failed.\n", #cond); \
102 #endif // __CUDA_ARCH__
104 #if defined(__CUDA_ARCH__)
105 #define SPAN_LT(lhs, rhs) \
106 if (!((lhs) < (rhs))) { \
107 printf("[xgboost] Condition: %lu < %lu failed\n", \
108 static_cast<size_t>(lhs), static_cast<size_t>(rhs)); \
112 #define SPAN_LT(lhs, rhs) SPAN_CHECK((lhs) < (rhs))
113 #endif // defined(__CUDA_ARCH__)
122 using ptrdiff_t =
typename std::conditional<
123 std::is_same<std::ptrdiff_t, std::int64_t>::value,
127 #if defined(_MSC_VER) && _MSC_VER < 1910
128 constexpr
const std::size_t
132 #endif // defined(_MSC_VER) && _MSC_VER < 1910
134 enum class byte : unsigned char {};
136 template <
class ElementType, std::
size_t Extent>
141 template <
typename SpanType,
bool IsConst>
143 using ElementType =
typename SpanType::element_type;
150 using reference =
typename std::conditional<
151 IsConst,
const ElementType, ElementType>::type&;
152 using pointer =
typename std::add_pointer<reference>::type;
157 const SpanType* _span,
162 template <bool B, typename std::enable_if<!B && IsConst>::type* =
nullptr>
232 return _lhs.span_ == _rhs.span_ && _lhs.index_ == _rhs.index_;
237 return !(_lhs == _rhs);
242 return _lhs.index_ < _rhs.index_;
247 return !(_rhs < _lhs);
257 return !(_rhs > _lhs);
262 typename SpanType::index_type
index_ { 0 };
276 template <std::
size_t Extent, std::
size_t Offset, std::
size_t Count>
278 std::size_t, Count != dynamic_extent ?
279 Count : (Extent != dynamic_extent ? Extent - Offset : Extent)> {};
285 template <
typename T, std::
size_t Extent>
288 Extent == dynamic_extent ?
289 Extent : sizeof(T) * Extent> {};
291 template <std::
size_t From, std::
size_t To>
293 bool, From == To || From == dynamic_extent || To == dynamic_extent> {};
295 template <
class From,
class To>
297 bool, std::is_convertible<From(*)[], To(*)[]>::value> {};
302 template <
class T, std::
size_t Extent>
309 template <
typename T>
316 template <
typename T>
323 template <
class InputIt1,
class InputIt2,
327 InputIt2 first2, InputIt2 last2) {
329 for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
330 if (comp(*first1, *first2)) {
333 if (comp(*first2, *first1)) {
337 return first1 == last1 && first2 != last2;
410 template <
typename T,
430 size_(_count), data_(_ptr) {
436 size_(_last - _first), data_(_first) {
440 template <std::
size_t N>
444 template <
class Container,
445 class =
typename std::enable_if<
446 !std::is_const<element_type>::value &&
448 std::is_convertible<typename Container::pointer, pointer>::value &&
449 std::is_convertible<
typename Container::pointer,
450 decltype(std::declval<Container>().
data())>::value>::type>
452 size_(_cont.
size()), data_(_cont.
data()) {
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>
463 Span(
const Container& _cont) : size_(_cont.
size()),
464 data_(_cont.
data()) {
468 template <
class U, std::size_t OtherExtent,
469 class =
typename std::enable_if<
479 size_ = _other.size();
480 data_ = _other.data();
491 return {
this,
size()};
499 return {
this,
size()};
525 return (*
this)[
size() - 1];
546 return size() *
sizeof(T);
554 template <std::
size_t Count>
557 return {
data(), Count};
561 std::size_t _count)
const {
563 return {
data(), _count};
566 template <std::
size_t Count>
569 return {
data() +
size() - Count, Count};
573 std::size_t _count)
const {
582 template <std::size_t Offset,
586 detail::ExtentValue<Extent, Offset, Count>::value> {
588 (Offset <=
size()) : (Offset + Count <=
size()));
596 (_offset <=
size()) : (_offset + _count <=
size()));
597 return {
data() + _offset, _count ==
606 template <
class T, std::
size_t X,
class U, std::
size_t Y>
608 if (l.size() != r.size()) {
611 for (
auto l_beg = l.cbegin(), r_beg = r.cbegin(); l_beg != l.cend();
613 if (*l_beg != *r_beg) {
620 template <
class T, std::
size_t X,
class U, std::
size_t Y>
625 template <
class T, std::
size_t X,
class U, std::
size_t Y>
631 template <
class T, std::
size_t X,
class U, std::
size_t Y>
636 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 E>
652 return {
reinterpret_cast<const byte*
>(s.data()), s.
size_bytes()};
655 template <
class T, std::
size_t E>
658 return {
reinterpret_cast<byte*
>(s.data()), s.
size_bytes()};
664 #if defined(_MSC_VER) &&_MSC_VER < 1910
666 #pragma pop_macro("constexpr")
667 #undef __span_noexcept
668 #endif // _MSC_VER < 1910
670 #endif // XGBOOST_SPAN_H_
XGBOOST_DEVICE SpanIterator operator--(int)
Definition: span.h:198
constexpr XGBOOST_DEVICE bool operator()(const T &_x, const T &_y) const
Definition: span.h:311
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:124
constexpr Span() __span_noexcept=default
constexpr XGBOOST_DEVICE bool operator<=(Span< T, X > l, Span< U, Y > r)
Definition: span.h:632
constexpr XGBOOST_DEVICE iterator end() const __span_noexcept
Definition: span.h:490
XGBOOST_DEVICE Span< element_type, dynamic_extent > last(std::size_t _count) const
Definition: span.h:572
constexpr XGBOOST_DEVICE bool operator()(const T &_x, const T &_y) const
Definition: span.h:318
XGBOOST_DEVICE SpanIterator & operator--()
Definition: span.h:192
#define __span_noexcept
span class based on ISO++20 span
Definition: span.h:67
constexpr XGBOOST_DEVICE friend bool operator==(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:230
constexpr XGBOOST_DEVICE bool operator>=(Span< T, X > l, Span< U, Y > r)
Definition: span.h:645
XGBOOST_DEVICE Span(pointer _first, pointer _last)
Definition: span.h:435
std::size_t index_type
Definition: span.h:416
byte
Definition: span.h:134
XGBOOST_DEVICE bool operator==(Span< T, X > l, Span< U, Y > r)
Definition: span.h:607
XGBOOST_DEVICE pointer operator->() const
Definition: span.h:175
XGBOOST_DEVICE SpanIterator & operator++()
Definition: span.h:180
xgboost::Entry const element_type
Definition: span.h:414
XGBOOST_DEVICE SpanIterator operator-(difference_type n) const
Definition: span.h:220
XGBOOST_DEVICE Span< element_type, dynamic_extent > subspan(index_type _offset, index_type _count=dynamic_extent) const
Definition: span.h:592
constexpr XGBOOST_DEVICE bool operator<(Span< T, X > l, Span< U, Y > r)
Definition: span.h:626
std::random_access_iterator_tag iterator_category
Definition: span.h:146
defines configuration macros of xgboost.
#define SPAN_CHECK(cond)
Definition: span.h:94
XGBOOST_DEVICE reference operator[](index_type _idx) const
Definition: span.h:528
constexpr XGBOOST_DEVICE friend bool operator>(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:250
XGBOOST_DEVICE bool LexicographicalCompare(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
Definition: span.h:326
detail::ptrdiff_t difference_type
Definition: span.h:417
XGBOOST_DEVICE reference back() const
Definition: span.h:524
XGBOOST_DEVICE SpanIterator & operator-=(difference_type n)
Definition: span.h:225
constexpr XGBOOST_DEVICE index_type size_bytes() const __span_noexcept
Definition: span.h:545
detail::ptrdiff_t difference_type
Definition: span.h:148
constexpr XGBOOST_DEVICE Span(element_type(&arr)[N]) __span_noexcept
Definition: span.h:441
constexpr XGBOOST_DEVICE bool operator>(Span< T, X > l, Span< U, Y > r)
Definition: span.h:637
XGBOOST_DEVICE SpanIterator & operator+=(difference_type n)
Definition: span.h:209
XGBOOST_DEVICE reference operator*() const
Definition: span.h:167
constexpr XGBOOST_DEVICE bool empty() const __span_noexcept
Definition: span.h:549
constexpr std::size_t dynamic_extent
Definition: span.h:131
constexpr SpanIterator()=default
XGBOOST_DEVICE SpanIterator operator+(difference_type n) const
Definition: span.h:204
XGBOOST_DEVICE auto as_writable_bytes(Span< T, E > s) __span_noexcept -> Span< byte, detail::ExtentAsBytesValue< T, E >::value >
Definition: span.h:656
constexpr XGBOOST_DEVICE iterator begin() const __span_noexcept
Definition: span.h:486
xgboost::Entry const & reference
Definition: span.h:419
XGBOOST_DEVICE difference_type operator-(SpanIterator rhs) const
Definition: span.h:215
XGBOOST_DEVICE reference operator[](difference_type n) const
Definition: span.h:171
Span(Container &_cont)
Definition: span.h:451
XGBOOST_DEVICE auto subspan() const -> Span< element_type, detail::ExtentValue< Extent, Offset, Count >::value >
Definition: span.h:584
constexpr XGBOOST_DEVICE SpanIterator(const SpanIterator< SpanType, B > &other_) __span_noexcept
Definition: span.h:163
constexpr XGBOOST_DEVICE bool operator!=(Span< T, X > l, Span< U, Y > r)
Definition: span.h:621
XGBOOST_DEVICE reference front() const
Definition: span.h:520
const SpanType * span_
Definition: span.h:261
constexpr XGBOOST_DEVICE friend bool operator<(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:240
XGBOOST_DEVICE reference operator()(index_type _idx) const
Definition: span.h:533
typename std::remove_cv< xgboost::Entry const >::type value_type
Definition: span.h:415
constexpr XGBOOST_DEVICE friend bool operator<=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:245
constexpr XGBOOST_DEVICE const_reverse_iterator crend() const __span_noexcept
Definition: span.h:514
XGBOOST_DEVICE Span< element_type, dynamic_extent > first(std::size_t _count) const
Definition: span.h:560
constexpr XGBOOST_DEVICE reverse_iterator rbegin() const __span_noexcept
Definition: span.h:502
constexpr XGBOOST_DEVICE friend bool operator>=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:255
xgboost::Entry const * pointer
Definition: span.h:418
#define SPAN_LT(lhs, rhs)
Definition: span.h:112
XGBOOST_DEVICE Span< element_type, Count > first() const
Definition: span.h:555
span class implementation, based on ISO++20 span<T>. The interface should be the same.
Definition: span.h:137
XGBOOST_DEVICE Span & operator=(const Span &_other) __span_noexcept
Definition: span.h:478
constexpr XGBOOST_DEVICE const_iterator cbegin() const __span_noexcept
Definition: span.h:494
constexpr XGBOOST_DEVICE const_reverse_iterator crbegin() const __span_noexcept
Definition: span.h:510
constexpr XGBOOST_DEVICE index_type size() const __span_noexcept
Definition: span.h:542
XGBOOST_DEVICE Span< element_type, Count > last() const
Definition: span.h:567
constexpr XGBOOST_DEVICE pointer data() const __span_noexcept
Definition: span.h:537
constexpr XGBOOST_DEVICE const_iterator cend() const __span_noexcept
Definition: span.h:498
XGBOOST_DEVICE auto as_bytes(Span< T, E > s) __span_noexcept -> Span< const byte, detail::ExtentAsBytesValue< T, E >::value >
Definition: span.h:650
Span(const Container &_cont)
Definition: span.h:463
XGBOOST_DEVICE SpanIterator operator++(int)
Definition: span.h:186
constexpr XGBOOST_DEVICE Span(const Span &_other) __span_noexcept
Definition: span.h:475
constexpr XGBOOST_DEVICE friend bool operator!=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:235
typename std::add_pointer< reference >::type pointer
Definition: span.h:152
typename std::conditional< IsConst, const ElementType, ElementType >::type & reference
Definition: span.h:151
SpanType::index_type index_
Definition: span.h:262
#define XGBOOST_DEVICE
Tag function as usable by device.
Definition: base.h:84
typename SpanType::value_type value_type
Definition: span.h:147
XGBOOST_DEVICE ~Span() __span_noexcept
Definition: span.h:484
namespace of xgboost
Definition: base.h:110
constexpr XGBOOST_DEVICE reverse_iterator rend() const __span_noexcept
Definition: span.h:506
constexpr XGBOOST_DEVICE SpanIterator(const SpanType *_span, typename SpanType::index_type _idx) __span_noexcept
Definition: span.h:156
constexpr XGBOOST_DEVICE Span(const Span< U, OtherExtent > &_other) __span_noexcept
Definition: span.h:472