1 #ifndef HPP_DTK_SPAN_INCLUDED
2 # define HPP_DTK_SPAN_INCLUDED
13 struct DynamicExtent : std::integral_constant<std::size_t, static_cast< std::size_t >( -1 )>{};
15 template <
class T, std::
size_t Extent = DynamicExtent::value>
class Span;
33 static auto const extent = DynamicExtent::value;
36 : m_data(
nullptr ), m_size( 0u )
40 : m_data( data ), m_size( n )
43 template <
class Iterator>
Span( Iterator begin, Iterator end )
44 : m_data( &( *begin ) )
45 , m_size( static_cast< std::size_t >( end - begin ) )
48 template <
class Range>
Span( Range&& range )
49 : m_data( std::forward<Range>( range ).data() )
50 , m_size( std::forward<Range>( range ).size() )
64 return m_data + m_size;
72 return m_data + m_size;
77 auto const off = offset > m_size ? m_size : offset;
78 return Span( m_data + off, ( count > m_size - off ? ( m_size - off ) : count ) );
97 return s.subspan( n );
134 return ConstBuffer(
reinterpret_cast< char const*
>( data ), n *
sizeof( T ) );
138 return ConstBuffer(
reinterpret_cast< char const*
>( data ), n *
sizeof( T ) );
142 typedef typename std::remove_pointer<decltype( std::forward<Range>( range ).data() )>::type Element;
143 return ConstBuffer(
reinterpret_cast< char const*
>( std::forward<Range>( range ).data() ), std::forward<Range>( range ).size() *
sizeof( Element ) );
147 return MutableBuffer(
reinterpret_cast<char*
>( data ), n *
sizeof( T ) );
151 return ConstBuffer(
reinterpret_cast<char const*
>( data ), n *
sizeof( T ) );
153 template <
class Range>
auto as_buffer( Range&& range ) -> decltype(
as_buffer( std::forward<Range>( range ).data(), std::forward<Range>( range ).size() ) )
155 return as_buffer( std::forward<Range>( range ).data(), std::forward<Range>( range ).size() );