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__ 111 using ptrdiff_t =
typename std::conditional<
112 std::is_same<std::ptrdiff_t, std::int64_t>::value,
116 #if defined(_MSC_VER) && _MSC_VER < 1910 117 constexpr
const std::size_t
120 constexpr std::size_t dynamic_extent = std::numeric_limits<std::size_t>::max();
121 #endif // defined(_MSC_VER) && _MSC_VER < 1910 123 enum class byte : unsigned char {};
125 template <
class ElementType, std::
size_t Extent>
130 template <
typename SpanType,
bool IsConst>
132 using ElementType =
typename SpanType::element_type;
139 using reference =
typename std::conditional<
140 IsConst,
const ElementType, ElementType>::type&;
141 using pointer =
typename std::add_pointer<reference>::type;
146 const SpanType* _span,
148 span_(_span), index_(_idx) {}
151 template <bool B, typename std::enable_if<!B && IsConst>::type* =
nullptr>
158 return *(span_->data() + index_);
166 return span_->data() + index_;
182 SPAN_CHECK(index_ != 0 && index_ <= span_->size());
206 return index_ - rhs.
index_;
221 return _lhs.span_ == _rhs.span_ && _lhs.index_ == _rhs.index_;
226 return !(_lhs == _rhs);
231 return _lhs.index_ < _rhs.index_;
236 return !(_rhs < _lhs);
246 return !(_rhs > _lhs);
250 const SpanType *span_ {
nullptr };
251 typename SpanType::index_type index_ { 0 };
265 template <std::
size_t Extent, std::
size_t Offset, std::
size_t Count>
267 std::size_t, Count != dynamic_extent ?
268 Count : (Extent != dynamic_extent ? Extent - Offset : Extent)> {};
274 template <
typename T, std::
size_t Extent>
277 Extent == dynamic_extent ?
278 Extent : sizeof(T) * Extent> {};
280 template <std::
size_t From, std::
size_t To>
282 bool, From == To || From == dynamic_extent || To == dynamic_extent> {};
284 template <
class From,
class To>
286 bool, std::is_convertible<From(*)[], To(*)[]>::value> {};
291 template <
class T, std::
size_t Extent>
298 template <
typename T>
305 template <
typename T>
312 template <
class InputIt1,
class InputIt2,
316 InputIt2 first2, InputIt2 last2) {
318 for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
319 if (comp(*first1, *first2)) {
322 if (comp(*first2, *first1)) {
326 return first1 == last1 && first2 != last2;
399 template <
typename T,
400 std::size_t Extent = dynamic_extent>
419 size_(_count), data_(_ptr) {
420 SPAN_CHECK(!(Extent != dynamic_extent && _count != Extent));
425 size_(_last - _first), data_(_first) {
429 template <std::
size_t N>
433 template <
class Container,
434 class =
typename std::enable_if<
435 !std::is_const<element_type>::value &&
437 std::is_convertible<typename Container::pointer, pointer>::value &&
438 std::is_convertible<
typename Container::pointer,
439 decltype(std::declval<Container>().data())>::value>::type>
441 size_(_cont.size()), data_(_cont.data()) {
445 template <
class Container,
446 class =
typename std::enable_if<
447 std::is_const<element_type>::value &&
449 std::is_convertible<typename Container::pointer, pointer>::value &&
450 std::is_convertible<
typename Container::pointer,
451 decltype(std::declval<Container>().data())>::value>::type>
452 Span(
const Container& _cont) : size_(_cont.size()),
453 data_(_cont.data()) {
457 template <
class U, std::size_t OtherExtent,
458 class =
typename std::enable_if<
468 size_ = _other.size();
469 data_ = _other.data();
480 return {
this, size()};
488 return {
this, size()};
514 return (*
this)[size() - 1];
523 return this->operator[](_idx);
535 return size() *
sizeof(T);
543 template <std::
size_t Count>
546 return {data(), Count};
550 std::size_t _count)
const {
552 return {data(), _count};
555 template <std::
size_t Count>
558 return {data() + size() - Count, Count};
562 std::size_t _count)
const {
564 return subspan(size() - _count, _count);
571 template <std::size_t Offset,
572 std::size_t Count = dynamic_extent>
575 detail::ExtentValue<Extent, Offset, Count>::value> {
577 (Offset <= size()) : (Offset + Count <= size()));
579 return {data() + Offset, Count == dynamic_extent ? size() - Offset : Count};
586 (_offset <= size()) : (_offset + _count <= size()));
587 return {data() + _offset, _count ==
588 dynamic_extent ? size() - _offset : _count};
596 template <
class T, std::
size_t X,
class U, std::
size_t Y>
603 if (*l_beg != *r_beg) {
610 template <
class T, std::
size_t X,
class U, std::
size_t Y>
615 template <
class T, std::
size_t X,
class U, std::
size_t Y>
621 template <
class T, std::
size_t X,
class U, std::
size_t Y>
626 template <
class T, std::
size_t X,
class U, std::
size_t Y>
634 template <
class T, std::
size_t X,
class U, std::
size_t Y>
639 template <
class T, std::
size_t E>
645 template <
class T, std::
size_t E>
654 #if defined(_MSC_VER) &&_MSC_VER < 1910 656 #pragma pop_macro("constexpr") 657 #undef __span_noexcept 658 #endif // _MSC_VER < 1910 660 #endif // XGBOOST_SPAN_H_ byte
Definition: span.h:123
XGBOOST_DEVICE constexpr bool operator>=(Span< T, X > l, Span< U, Y > r)
Definition: span.h:635
XGBOOST_DEVICE constexpr friend bool operator>=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:244
#define SPAN_CHECK(cond)
Definition: span.h:94
XGBOOST_DEVICE Span< element_type, Count > first() const
Definition: span.h:544
XGBOOST_DEVICE constexpr index_type size() const __span_noexcept
Definition: span.h:531
XGBOOST_DEVICE Span(pointer _first, pointer _last)
Definition: span.h:424
XGBOOST_DEVICE constexpr bool empty() const __span_noexcept
Definition: span.h:538
XGBOOST_DEVICE reference operator()(index_type _idx) const
Definition: span.h:522
XGBOOST_DEVICE SpanIterator & operator--()
Definition: span.h:181
XGBOOST_DEVICE SpanIterator operator--(int)
Definition: span.h:187
std::size_t index_type
Definition: span.h:405
XGBOOST_DEVICE Span< element_type, dynamic_extent > subspan(index_type _offset, index_type _count=dynamic_extent) const
Definition: span.h:582
XGBOOST_DEVICE constexpr SpanIterator(const SpanIterator< SpanType, B > &other_) __span_noexcept
Definition: span.h:152
XGBOOST_DEVICE constexpr bool operator>(Span< T, X > l, Span< U, Y > r)
Definition: span.h:627
XGBOOST_DEVICE constexpr iterator end() const __span_noexcept
Definition: span.h:479
XGBOOST_DEVICE SpanIterator operator-(difference_type n) const
Definition: span.h:209
XGBOOST_DEVICE SpanIterator & operator+=(difference_type n)
Definition: span.h:198
Span(const Container &_cont)
Definition: span.h:452
XGBOOST_DEVICE constexpr friend bool operator<=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:234
XGBOOST_DEVICE SpanIterator operator+(difference_type n) const
Definition: span.h:193
xgboost::Entry const element_type
Definition: span.h:403
XGBOOST_DEVICE auto as_bytes(Span< T, E > s) __span_noexcept -> Span< const byte, detail::ExtentAsBytesValue< T, E >::value >
Definition: span.h:640
Span(Container &_cont)
Definition: span.h:440
XGBOOST_DEVICE reference operator[](difference_type n) const
Definition: span.h:160
detail::ptrdiff_t difference_type
Definition: span.h:406
typename SpanType::value_type value_type
Definition: span.h:136
XGBOOST_DEVICE reference back() const
Definition: span.h:513
XGBOOST_DEVICE constexpr Span(const Span &_other) __span_noexcept
Definition: span.h:464
xgboost::Entry const & reference
Definition: span.h:408
XGBOOST_DEVICE auto as_writable_bytes(Span< T, E > s) __span_noexcept -> Span< byte, detail::ExtentAsBytesValue< T, E >::value >
Definition: span.h:646
XGBOOST_DEVICE constexpr friend bool operator!=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:224
XGBOOST_DEVICE constexpr bool operator()(const T &_x, const T &_y) const
Definition: span.h:307
std::random_access_iterator_tag iterator_category
Definition: span.h:135
XGBOOST_DEVICE Span< element_type, dynamic_extent > first(std::size_t _count) const
Definition: span.h:549
span class implementation, based on ISO++20 span<T>. The interface should be the same.
Definition: span.h:126
XGBOOST_DEVICE SpanIterator & operator++()
Definition: span.h:169
typename std::conditional< IsConst, const ElementType, ElementType >::type & reference
Definition: span.h:140
XGBOOST_DEVICE SpanIterator & operator-=(difference_type n)
Definition: span.h:214
XGBOOST_DEVICE bool LexicographicalCompare(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
Definition: span.h:315
XGBOOST_DEVICE constexpr friend bool operator>(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:239
typename std::remove_cv< xgboost::Entry const >::type value_type
Definition: span.h:404
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:113
XGBOOST_DEVICE Span< element_type, Count > last() const
Definition: span.h:556
XGBOOST_DEVICE constexpr pointer data() const __span_noexcept
Definition: span.h:526
XGBOOST_DEVICE constexpr const_reverse_iterator crend() const __span_noexcept
Definition: span.h:503
XGBOOST_DEVICE constexpr SpanIterator(const SpanType *_span, typename SpanType::index_type _idx) __span_noexcept
Definition: span.h:145
constexpr std::size_t dynamic_extent
Definition: span.h:120
XGBOOST_DEVICE constexpr reverse_iterator rbegin() const __span_noexcept
Definition: span.h:491
XGBOOST_DEVICE constexpr bool operator()(const T &_x, const T &_y) const
Definition: span.h:300
XGBOOST_DEVICE constexpr bool operator!=(Span< T, X > l, Span< U, Y > r)
Definition: span.h:611
#define XGBOOST_DEVICE
Tag function as usable by device.
Definition: base.h:84
SpanType::index_type index_
Definition: span.h:251
namespace of xgboost
Definition: base.h:102
XGBOOST_DEVICE constexpr reverse_iterator rend() const __span_noexcept
Definition: span.h:495
XGBOOST_DEVICE Span< element_type, dynamic_extent > last(std::size_t _count) const
Definition: span.h:561
XGBOOST_DEVICE reference front() const
Definition: span.h:509
defines configuration macros of xgboost.
XGBOOST_DEVICE constexpr const_reverse_iterator crbegin() const __span_noexcept
Definition: span.h:499
const SpanType * span_
Definition: span.h:250
XGBOOST_DEVICE auto subspan() const -> Span< element_type, detail::ExtentValue< Extent, Offset, Count >::value >
Definition: span.h:573
XGBOOST_DEVICE constexpr Span(element_type(&arr)[N]) __span_noexcept
Definition: span.h:430
XGBOOST_DEVICE constexpr const_iterator cbegin() const __span_noexcept
Definition: span.h:483
XGBOOST_DEVICE SpanIterator operator++(int)
Definition: span.h:175
xgboost::Entry const * pointer
Definition: span.h:407
XGBOOST_DEVICE reference operator[](index_type _idx) const
Definition: span.h:517
XGBOOST_DEVICE constexpr friend bool operator<(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:229
XGBOOST_DEVICE constexpr index_type size_bytes() const __span_noexcept
Definition: span.h:534
XGBOOST_DEVICE constexpr const_iterator cend() const __span_noexcept
Definition: span.h:487
#define __span_noexcept
span class based on ISO++20 span
Definition: span.h:67
XGBOOST_DEVICE Span & operator=(const Span &_other) __span_noexcept
Definition: span.h:467
XGBOOST_DEVICE constexpr friend bool operator==(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:219
typename std::add_pointer< reference >::type pointer
Definition: span.h:141
XGBOOST_DEVICE constexpr Span(const Span< U, OtherExtent > &_other) __span_noexcept
Definition: span.h:461
detail::ptrdiff_t difference_type
Definition: span.h:137
XGBOOST_DEVICE constexpr iterator begin() const __span_noexcept
Definition: span.h:475
XGBOOST_DEVICE difference_type operator-(SpanIterator rhs) const
Definition: span.h:204
XGBOOST_DEVICE ~Span() __span_noexcept
Definition: span.h:473
XGBOOST_DEVICE reference operator*() const
Definition: span.h:156
XGBOOST_DEVICE pointer operator->() const
Definition: span.h:164
XGBOOST_DEVICE bool operator==(Span< T, X > l, Span< U, Y > r)
Definition: span.h:597