29 #ifndef XGBOOST_COMMON_SPAN_H_ 30 #define XGBOOST_COMMON_SPAN_H_ 32 #include <xgboost/logging.h> 35 #include <type_traits> 54 #if defined(_MSC_VER) && _MSC_VER < 1910 56 #define __span_noexcept 58 #pragma push_macro("constexpr") 63 #define __span_noexcept noexcept 65 #endif // defined(_MSC_VER) && _MSC_VER < 1910 73 #define KERNEL_CHECK(cond) \ 76 printf("\nKernel error:\n" \ 77 "In: %s, \tline: %d\n" \ 78 "\t%s\n\tExpecting: %s\n", \ 79 __FILE__, __LINE__, __PRETTY_FUNCTION__, # cond); \ 85 #define SPAN_CHECK KERNEL_CHECK 87 #define SPAN_CHECK CHECK // check from dmlc 88 #endif // __CUDA_ARCH__ 100 #if defined(_MSC_VER) && _MSC_VER < 1910 104 #endif // defined(_MSC_VER) && _MSC_VER < 1910 106 enum class byte : unsigned char {};
108 template <
class ElementType, detail::ptrdiff_t Extent>
113 template <
typename SpanType,
bool IsConst>
115 using ElementType =
typename SpanType::element_type;
119 using value_type =
typename std::remove_cv<ElementType>::type;
122 using reference =
typename std::conditional<
123 IsConst,
const ElementType, ElementType>::type&;
124 using pointer =
typename std::add_pointer<reference>::type;
129 const SpanType* _span,
131 span_(_span), index_(_idx) {}
134 template <bool B, typename std::enable_if<!B && IsConst>::type* =
nullptr>
141 return *(span_->data() + index_);
146 return span_->data() + index_;
150 SPAN_CHECK(0 <= index_ && index_ != span_->size());
162 SPAN_CHECK(index_ != 0 && index_ <= span_->size());
179 SPAN_CHECK((index_ + n) >= 0 && (index_ + n) <= span_->size());
186 return index_ - rhs.
index_;
201 return _lhs.span_ == _rhs.span_ && _lhs.index_ == _rhs.index_;
206 return !(_lhs == _rhs);
211 return _lhs.index_ < _rhs.index_;
216 return !(_rhs < _lhs);
226 return !(_rhs > _lhs);
249 detail::ptrdiff_t, Count != dynamic_extent ?
250 Count : (Extent != dynamic_extent ? Extent - Offset : Extent)> {};
256 template <
typename T, detail::ptrdiff_t Extent>
259 Extent == dynamic_extent ?
260 Extent : static_cast<detail::ptrdiff_t>(sizeof(T) * Extent)> {};
262 template <detail::ptrdiff_t From, detail::ptrdiff_t To>
264 bool, From == To || From == dynamic_extent || To == dynamic_extent> {};
266 template <
class From,
class To>
268 bool, std::is_convertible<From(*)[], To(*)[]>::value> {};
273 template <
class T, detail::ptrdiff_t Extent>
280 template <
typename T>
287 template <
typename T>
294 template <
class InputIt1,
class InputIt2,
298 InputIt2 first2, InputIt2 last2) {
300 for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
301 if (comp(*first1, *first2)) {
304 if (comp(*first2, *first1)) {
308 return first1 == last1 && first2 != last2;
381 template <
typename T,
402 size_(_count), data_(_ptr) {
408 size_(_last - _first), data_(_first) {
413 template <std::
size_t N>
417 template <
class Container,
418 class =
typename std::enable_if<
420 std::is_convertible<
typename Container::pointer,
423 typename Container::pointer,
424 decltype(std::declval<Container>().data())>::value>>
426 size_(_cont.size()), data_(_cont.data()) {}
428 template <
class Container,
429 class =
typename std::enable_if<
431 std::is_convertible<typename Container::pointer, pointer>::value &&
433 typename Container::pointer,
434 decltype(std::declval<Container>().data())>::value>>
436 data_(_cont.data()) {}
439 class =
typename std::enable_if<
449 size_ = _other.size();
450 data_ = _other.data();
461 return {
this, size()};
469 return {
this, size()};
494 return this->operator[](_idx);
506 return size() *
sizeof(T);
514 template <detail::ptrdiff_t Count >
517 return {data(), Count};
523 return {data(), _count};
526 template <detail::ptrdiff_t Count >
529 return {data() + size() - Count, Count};
535 return subspan(size() - _count, _count);
546 detail::ExtentValue<Extent, Offset, Count>::value> {
547 SPAN_CHECK(Offset >= 0 && (Offset < size() || size() == 0));
549 Count >= 0 && Offset + Count <= size());
551 return {data() + Offset, Count == dynamic_extent ? size() - Offset : Count};
557 SPAN_CHECK(_offset >= 0 && (_offset < size() || size() == 0));
559 (_count >= 0 && _offset + _count <= size()));
561 return {data() + _offset, _count ==
562 dynamic_extent ? size() - _offset : _count};
570 template <
class T, detail::ptrdiff_t X,
class U, detail::ptrdiff_t Y>
577 if (*l_beg != *r_beg) {
584 template <
class T, detail::ptrdiff_t X,
class U, detail::ptrdiff_t Y>
589 template <
class T, detail::ptrdiff_t X,
class U, detail::ptrdiff_t Y>
595 template <
class T, detail::ptrdiff_t X,
class U, detail::ptrdiff_t Y>
600 template <
class T, detail::ptrdiff_t X,
class U, detail::ptrdiff_t Y>
608 template <
class T, detail::ptrdiff_t X,
class U, detail::ptrdiff_t Y>
613 template <
class T, detail::ptrdiff_t E>
619 template <
class T, detail::ptrdiff_t E>
628 #if defined(_MSC_VER) &&_MSC_VER < 1910 630 #pragma pop_macro("constexpr") 631 #undef __span_noexcept 632 #endif // _MSC_VER < 1910 634 #endif // XGBOOST_COMMON_SPAN_H_ byte
Definition: span.h:106
XGBOOST_DEVICE constexpr bool operator>=(Span< T, X > l, Span< U, Y > r)
Definition: span.h:609
detail::ptrdiff_t index_
Definition: span.h:231
XGBOOST_DEVICE constexpr friend bool operator>=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:224
typename std::remove_cv< ElementType >::type value_type
Definition: span.h:119
XGBOOST_DEVICE Span< element_type, Count > first() const
Definition: span.h:515
XGBOOST_DEVICE constexpr index_type size() const __span_noexcept
Definition: span.h:502
XGBOOST_DEVICE Span(pointer _first, pointer _last)
Definition: span.h:407
XGBOOST_DEVICE constexpr bool empty() const __span_noexcept
Definition: span.h:509
XGBOOST_DEVICE SpanIterator & operator--()
Definition: span.h:161
XGBOOST_DEVICE SpanIterator operator--(int)
Definition: span.h:167
XGBOOST_DEVICE constexpr SpanIterator()
Definition: span.h:126
XGBOOST_DEVICE constexpr SpanIterator(const SpanIterator< SpanType, B > &other_) __span_noexcept
Definition: span.h:135
XGBOOST_DEVICE constexpr bool operator>(Span< T, X > l, Span< U, Y > r)
Definition: span.h:601
XGBOOST_DEVICE constexpr iterator end() const __span_noexcept
Definition: span.h:460
detail::ptrdiff_t index_type
Definition: span.h:387
XGBOOST_DEVICE constexpr Span() __span_noexcept
Definition: span.h:399
XGBOOST_DEVICE SpanIterator operator-(difference_type n) const
Definition: span.h:189
int64_t ptrdiff_t
Definition: span.h:97
XGBOOST_DEVICE SpanIterator & operator+=(difference_type n)
Definition: span.h:178
XGBOOST_DEVICE constexpr friend bool operator<=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:214
XGBOOST_DEVICE SpanIterator operator+(difference_type n) const
Definition: span.h:173
T element_type
Definition: span.h:385
XGBOOST_DEVICE auto as_bytes(Span< T, E > s) __span_noexcept -> Span< const byte, detail::ExtentAsBytesValue< T, E >::value >
Definition: span.h:614
detail::ptrdiff_t difference_type
Definition: span.h:388
XGBOOST_DEVICE constexpr Span(const Span &_other) __span_noexcept
Definition: span.h:445
T & reference
Definition: span.h:390
XGBOOST_DEVICE auto as_writable_bytes(Span< T, E > s) __span_noexcept -> Span< byte, detail::ExtentAsBytesValue< T, E >::value >
Definition: span.h:620
XGBOOST_DEVICE constexpr friend bool operator!=(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:204
XGBOOST_DEVICE constexpr bool operator()(const T &_x, const T &_y) const
Definition: span.h:289
XGBOOST_DEVICE Span(Container &_cont)
Definition: span.h:425
std::random_access_iterator_tag iterator_category
Definition: span.h:118
span class implementation, based on ISO++20 span<T>. The interface should be the same.
Definition: span.h:109
XGBOOST_DEVICE SpanIterator & operator++()
Definition: span.h:149
typename std::conditional< IsConst, const ElementType, ElementType >::type & reference
Definition: span.h:123
XGBOOST_DEVICE SpanIterator & operator-=(difference_type n)
Definition: span.h:194
XGBOOST_DEVICE bool LexicographicalCompare(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
Definition: span.h:297
XGBOOST_DEVICE constexpr friend bool operator>(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:219
typename std::remove_cv< T >::type value_type
Definition: span.h:386
constexpr detail::ptrdiff_t dynamic_extent
Definition: span.h:103
XGBOOST_DEVICE Span< element_type, Count > last() const
Definition: span.h:527
XGBOOST_DEVICE constexpr pointer data() const __span_noexcept
Definition: span.h:497
XGBOOST_DEVICE constexpr const_reverse_iterator crend() const __span_noexcept
Definition: span.h:484
XGBOOST_DEVICE constexpr reference operator()(index_type _idx) const
Definition: span.h:493
XGBOOST_DEVICE Span(pointer _ptr, index_type _count)
Definition: span.h:401
XGBOOST_DEVICE constexpr SpanIterator(const SpanType *_span, typename SpanType::index_type _idx) __span_noexcept
Definition: span.h:128
XGBOOST_DEVICE constexpr reverse_iterator rbegin() const __span_noexcept
Definition: span.h:472
XGBOOST_DEVICE constexpr bool operator()(const T &_x, const T &_y) const
Definition: span.h:282
XGBOOST_DEVICE Span< element_type, dynamic_extent > subspan(detail::ptrdiff_t _offset, detail::ptrdiff_t _count=dynamic_extent) const
Definition: span.h:554
XGBOOST_DEVICE constexpr bool operator!=(Span< T, X > l, Span< U, Y > r)
Definition: span.h:585
#define XGBOOST_DEVICE
Tag function as usable by device.
Definition: base.h:75
XGBOOST_DEVICE Span< element_type, dynamic_extent > last(detail::ptrdiff_t _count) const
Definition: span.h:532
typename SpanType::index_type difference_type
Definition: span.h:120
namespace of xgboost
Definition: base.h:79
XGBOOST_DEVICE constexpr reverse_iterator rend() const __span_noexcept
Definition: span.h:476
XGBOOST_DEVICE Span< element_type, dynamic_extent > first(detail::ptrdiff_t _count) const
Definition: span.h:520
XGBOOST_DEVICE constexpr const_reverse_iterator crbegin() const __span_noexcept
Definition: span.h:480
const SpanType * span_
Definition: span.h:230
XGBOOST_DEVICE auto subspan() const -> Span< element_type, detail::ExtentValue< Extent, Offset, Count >::value >
Definition: span.h:544
XGBOOST_DEVICE constexpr Span(element_type(&arr)[N]) __span_noexcept
Definition: span.h:414
XGBOOST_DEVICE Span(const Container &_cont)
Definition: span.h:435
XGBOOST_DEVICE constexpr const_iterator cbegin() const __span_noexcept
Definition: span.h:464
XGBOOST_DEVICE SpanIterator operator++(int)
Definition: span.h:155
T * pointer
Definition: span.h:389
#define SPAN_CHECK
Definition: span.h:87
XGBOOST_DEVICE reference operator[](index_type _idx) const
Definition: span.h:488
XGBOOST_DEVICE constexpr friend bool operator<(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:209
XGBOOST_DEVICE constexpr index_type size_bytes() const __span_noexcept
Definition: span.h:505
XGBOOST_DEVICE constexpr const_iterator cend() const __span_noexcept
Definition: span.h:468
#define __span_noexcept
span class based on ISO++20 span
Definition: span.h:63
XGBOOST_DEVICE Span & operator=(const Span &_other) __span_noexcept
Definition: span.h:448
XGBOOST_DEVICE constexpr friend bool operator==(SpanIterator _lhs, SpanIterator _rhs) __span_noexcept
Definition: span.h:199
typename std::add_pointer< reference >::type pointer
Definition: span.h:124
XGBOOST_DEVICE constexpr Span(const Span< U, OtherExtent > &_other) __span_noexcept
Definition: span.h:442
XGBOOST_DEVICE constexpr iterator begin() const __span_noexcept
Definition: span.h:456
XGBOOST_DEVICE difference_type operator-(SpanIterator rhs) const
Definition: span.h:184
XGBOOST_DEVICE ~Span() __span_noexcept
Definition: span.h:454
XGBOOST_DEVICE reference operator*() const
Definition: span.h:139
XGBOOST_DEVICE pointer operator->() const
Definition: span.h:144
XGBOOST_DEVICE bool operator==(Span< T, X > l, Span< U, Y > r)
Definition: span.h:571