xgboost
Classes | Namespaces | Macros | Typedefs | Enumerations | Functions | Variables
span.h File Reference
#include <xgboost/base.h>
#include <xgboost/logging.h>
#include <cinttypes>
#include <limits>
#include <iterator>
#include <type_traits>
#include <cstdio>
Include dependency graph for span.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  xgboost::common::Span< T, Extent >
 span class implementation, based on ISO++20 span<T>. The interface should be the same. More...
 
class  xgboost::common::detail::SpanIterator< SpanType, IsConst >
 
struct  xgboost::common::detail::ExtentValue< Extent, Offset, Count >
 
struct  xgboost::common::detail::ExtentAsBytesValue< T, Extent >
 
struct  xgboost::common::detail::IsAllowedExtentConversion< From, To >
 
struct  xgboost::common::detail::IsAllowedElementTypeConversion< From, To >
 
struct  xgboost::common::detail::IsSpanOracle< T >
 
struct  xgboost::common::detail::IsSpanOracle< Span< T, Extent > >
 
struct  xgboost::common::detail::IsSpan< T >
 
struct  xgboost::common::detail::Less< T >
 
struct  xgboost::common::detail::Greater< T >
 
class  xgboost::common::Span< T, Extent >
 span class implementation, based on ISO++20 span<T>. The interface should be the same. More...
 

Namespaces

 xgboost
 namespace of xgboost
 
 xgboost::common
 
 xgboost::common::detail
 

Macros

#define __span_noexcept   noexcept
 span class based on ISO++20 span More...
 
#define KERNEL_CHECK(cond)
 
#define SPAN_CHECK(cond)
 

Typedefs

using xgboost::common::detail::ptrdiff_t = typename std::conditional< std::is_same< std::ptrdiff_t, std::int64_t >::value, std::ptrdiff_t, std::int64_t >::type
 

Enumerations

enum  xgboost::common::byte : unsigned char
 

Functions

template<class InputIt1 , class InputIt2 , class Compare = detail::Less<decltype(std::declval<InputIt1>().operator*())>>
XGBOOST_DEVICE bool xgboost::common::detail::LexicographicalCompare (InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
 
template<class T , std::size_t X, class U , std::size_t Y>
XGBOOST_DEVICE bool xgboost::common::operator== (Span< T, X > l, Span< U, Y > r)
 
template<class T , std::size_t X, class U , std::size_t Y>
XGBOOST_DEVICE constexpr bool xgboost::common::operator!= (Span< T, X > l, Span< U, Y > r)
 
template<class T , std::size_t X, class U , std::size_t Y>
XGBOOST_DEVICE constexpr bool xgboost::common::operator< (Span< T, X > l, Span< U, Y > r)
 
template<class T , std::size_t X, class U , std::size_t Y>
XGBOOST_DEVICE constexpr bool xgboost::common::operator<= (Span< T, X > l, Span< U, Y > r)
 
template<class T , std::size_t X, class U , std::size_t Y>
XGBOOST_DEVICE constexpr bool xgboost::common::operator> (Span< T, X > l, Span< U, Y > r)
 
template<class T , std::size_t X, class U , std::size_t Y>
XGBOOST_DEVICE constexpr bool xgboost::common::operator>= (Span< T, X > l, Span< U, Y > r)
 
template<class T , std::size_t E>
XGBOOST_DEVICE auto xgboost::common::as_bytes (Span< T, E > s) __span_noexcept -> Span< const byte, detail::ExtentAsBytesValue< T, E >::value >
 
template<class T , std::size_t E>
XGBOOST_DEVICE auto xgboost::common::as_writable_bytes (Span< T, E > s) __span_noexcept -> Span< byte, detail::ExtentAsBytesValue< T, E >::value >
 

Variables

constexpr std::size_t xgboost::common::dynamic_extent = std::numeric_limits<std::size_t>::max()
 

Macro Definition Documentation

◆ __span_noexcept

#define __span_noexcept   noexcept

span class based on ISO++20 span

Copyright 2018 XGBoost contributors About NOLINTs in this file:

If we want Span to work with std interface, like range for loop, the naming must be consistant with std, not XGBoost. Also, the interface also conflicts with XGBoost coding style, specifically, the use of `explicit' keyword.

Some of the code is copied from Guidelines Support Library, here is the license:

Copyright (c) 2015 Microsoft Corporation. All rights reserved.

This code is licensed under the MIT License (MIT).

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

The version number 1910 is picked up from GSL.

We might want to use MOODYCAMEL_NOEXCEPT from dmlc/concurrentqueue.h. But there are a lot more definitions in that file would cause warnings/troubles in MSVC 2013. Currently we try to keep the closure of Span as minimal as possible.

There are other workarounds for MSVC, like _Unwrapped, _Verify_range ... Some of these are hiden magics of MSVC and I tried to avoid them. Should any of them become needed, please consult the source code of GSL, and possibily some explanations from this thread:

https://github.com/Microsoft/GSL/pull/664

TODO(trivialfis): Group these MSVC workarounds into a manageable place.

◆ KERNEL_CHECK

#define KERNEL_CHECK (   cond)
Value:
do { \
if (!(cond)) { \
printf("\nKernel error:\n" \
"In: %s: %d\n" \
"\t%s\n\tExpecting: %s\n" \
"\tBlock: [%d, %d, %d], Thread: [%d, %d, %d]\n\n", \
__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, blockIdx.x, \
blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z); \
asm("trap;"); \
} \
} while (0);

◆ SPAN_CHECK

#define SPAN_CHECK (   cond)
Value:
do { \
if (XGBOOST_EXPECT(!(cond), false)) { \
fprintf(stderr, "[xgboost] Condition %s failed.\n", #cond); \
fflush(stderr); /* It seems stderr on Windows is beffered? */ \
std::terminate(); \
} \
} while (0);
#define XGBOOST_EXPECT(cond, ret)
Definition: base.h:75