13#ifndef ROOT_RHYSD_SPAN_H
14#define ROOT_RHYSD_SPAN_H
16#if __cplusplus >= 202002
17# if __has_include(<span>)
22#if !defined(__cpp_lib_span)
25#if __cplusplus >= 201402L
26#define R__CONSTEXPR_IF_CXX14 constexpr
28#define R__CONSTEXPR_IF_CXX14
40#include <initializer_list>
49 static bool const value =
false;
51template<
class T,
size_t N>
53 static bool const value =
true;
57 static bool const value =
true;
60struct is_array_class<std::initializer_list<T>> {
61 static bool const value =
true;
66template<
size_t... Indices >
68 static constexpr size_t value[
sizeof...(Indices)] = {Indices...};
71template<
class IndicesType,
size_t Next>
74template<
size_t... Indices,
size_t Next>
79template<
class IndicesType,
size_t Next,
size_t Tail>
82template<
size_t... Indices,
size_t Next,
size_t Tail>
87template<
size_t First,
size_t Step,
size_t N,
class =
void>
90template<
size_t First,
size_t Step,
size_t N>
95 typename std::enable_if<(N == 0)>
::type
100template<
size_t First,
size_t Step,
size_t N>
105 typename std::enable_if<(N == 1)>
::type
110template<
size_t First,
size_t Step,
size_t N>
115 typename std::enable_if<(N > 1 && N % 2 == 0)>
::type
118 typename ROOT::Detail::make_indices_impl<First, Step, N / 2>::type,
123template<
size_t First,
size_t Step,
size_t N>
124struct make_indices_impl<
128 typename std::enable_if<(N > 1 && N % 2 == 1)>
::type
131 typename ROOT::Detail::make_indices_impl<First, Step, N / 2>::type,
132 First + N / 2 * Step,
133 First + (N - 1) * Step
137template<
size_t First,
size_t Last,
size_t Step = 1>
142 ((Last - First) + (Step - 1)) / Step
146template <
size_t Start,
size_t Last,
size_t Step = 1 >
154inline namespace __ROOT {
158struct check_bound_t {};
159static constexpr check_bound_t check_bound{};
167 typedef T element_type;
168 typedef std::remove_cv<T> value_type;
169 typedef element_type * pointer;
170 typedef element_type
const* const_pointer;
171 typedef element_type & reference;
172 typedef element_type
const& const_reference;
173 typedef element_type * iterator;
174 typedef element_type
const* const_iterator;
175 typedef ptrdiff_t difference_type;
176 typedef std::size_t size_type;
177 typedef std::reverse_iterator<iterator> reverse_iterator;
178 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
183 constexpr span() noexcept
184 : length_(0), data_(
nullptr)
187 constexpr span(span
const&)
noexcept =
default;
188 constexpr span(span &&) noexcept = default;
192 template<size_type
N>
193 span(std::array<T,
N> &
a) noexcept
194 : length_(
N), data_(
N > 0 ?
a.data() :
nullptr)
199 template<
size_type N>
200 span(
T(&
a)[
N]) noexcept
201 : length_(
N), data_(
N > 0 ? std::addressof(
a[0]) :
nullptr)
203 static_assert(
N > 0,
"Zero-length array is not permitted in ISO C++.");
212 template <class U = T, class = typename std::enable_if<std::is_const<U>::value>::type>
213 span(std::vector<
typename std::remove_cv<T>::type>
const&
v) noexcept
214 : length_(
v.size()), data_(
v.empty() ?
nullptr :
v.data())
217 span(std::vector<
typename std::remove_cv<T>::type> &
v) noexcept
218 : length_(
v.size()), data_(
v.empty() ?
nullptr :
v.data())
221 constexpr span(pointer
a, size_type
const n) noexcept
222 : length_(
n), data_(
a)
227 class =
typename std::enable_if<
229 typename std::remove_cv<T>::type,
230 typename std::iterator_traits<InputIterator>::value_type
234 span(InputIterator
start, InputIterator last)
235 : length_(std::distance(
start, last)), data_(&*
start)
238 span(std::initializer_list<T>
const&
l)
239 : length_(
l.size()), data_(std::begin(
l))
242 span& operator=(span
const&)
noexcept =
default;
243 span& operator=(span &&) noexcept = delete;
248 constexpr iterator begin() const noexcept
252 constexpr iterator end() const noexcept
254 return data_ + length_;
256 constexpr const_iterator cbegin() const noexcept
260 constexpr const_iterator cend() const noexcept
264 reverse_iterator rbegin()
const
268 reverse_iterator rend()
const
272 const_reverse_iterator crbegin()
const
276 const_reverse_iterator crend()
const
284 constexpr size_type size() const noexcept
288 constexpr size_type length() const noexcept
292 constexpr size_type max_size() const noexcept
296 constexpr bool empty() const noexcept
300 constexpr reference operator[](size_type
const n)
const noexcept
304 constexpr reference at(size_type
const n)
const
309 return n >= length_ ?
throw std::out_of_range(
"span::at()") : *(data_ +
n);
311 constexpr pointer data() const noexcept
315 constexpr const_reference front() const noexcept
319 constexpr const_reference back() const noexcept
321 return *(data_ + length_ - 1);
329 constexpr span<T> slice(check_bound_t, size_type
const pos, size_type
const slicelen)
const
336 return pos >= length_ ||
pos + slicelen >= length_ ?
throw std::out_of_range(
"span::slice()") : span<
T>{begin() +
pos, begin() +
pos + slicelen};
338 constexpr span<T> slice_before(check_bound_t, size_type
const pos)
const
345 return pos >= length_ ? std::out_of_range(
"span::slice()") : span<
T>{begin(), begin() +
pos};
347 constexpr span<T> slice_after(check_bound_t, size_type
const pos)
const
354 return pos >= length_ ? std::out_of_range(
"span::slice()") : span<
T>{begin() +
pos, end()};
358 constexpr span<T> slice(size_type
const pos, size_type
const slicelen)
const
360 return span<T>{begin() +
pos, begin() +
pos + slicelen};
362 constexpr span<T> slice_before(size_type
const pos)
const
364 return span<T>{begin(), begin() +
pos};
366 constexpr span<T> slice_after(size_type
const pos)
const
368 return span<T>{begin() +
pos, end()};
374 constexpr span<T> slice(check_bound_t, iterator
start, iterator last)
const
384 return (
start >= end() ||
387 static_cast<size_t>(std::distance(
start, last > end() ? end() : last)) > length_ - std::distance(begin(),
start) ) ?
throw std::out_of_range(
"span::slice()") : span<
T>{
start, last > end() ? end() : last};
389 constexpr span<T> slice_before(check_bound_t, iterator
const pos)
const
396 return pos < begin() ||
pos > end() ?
throw std::out_of_range(
"span::slice()") : span<
T>{begin(),
pos > end() ? end() :
pos};
398 constexpr span<T> slice_after(check_bound_t, iterator
const pos)
const
405 return pos < begin() ||
pos > end() ?
throw std::out_of_range(
"span::slice()") : span<
T>{
pos < begin() ? begin() :
pos, end()};
409 constexpr span<T> slice(iterator
start, iterator last)
const
411 return span<T>{
start, last};
413 constexpr span<T> slice_before(iterator
const pos)
const
415 return span<T>{begin(),
pos};
417 constexpr span<T> slice_after(iterator
const pos)
const
419 return span<T>{
pos, end()};
427 template<class Allocator = std::allocator<typename std::remove_cv<T>::type>>
428 auto to_vector(Allocator
const& alloc = Allocator{})
const
429 -> std::vector<
typename std::remove_cv<T>::type, Allocator>
431 return {begin(), end(), alloc};
435 auto to_array() const
441 template<
size_t...
I>
442 auto to_array_impl(ROOT::Detail::indices<I...>)
const
443 -> std::array<
T,
sizeof...(I)>
445 return {{(
I < length_ ? *(data_ +
I) :
T{} )...}};
460template<
class ArrayL,
class ArrayR >
462bool operator_equal_impl(ArrayL
const& lhs,
size_t const lhs_size, ArrayR
const& rhs,
size_t const rhs_size)
464 if (lhs_size != rhs_size) {
468 auto litr = std::begin(lhs);
469 auto ritr = std::begin(rhs);
470 for (; litr != std::end(lhs); ++litr, ++ritr) {
471 if (!(*litr == *ritr)) {
482inline namespace __ROOT {
484template<
class T1,
class T2>
486bool operator==(span<T1>
const& lhs, span<T2>
const& rhs)
494 class =
typename std::enable_if<
499bool operator==(span<T>
const& lhs, Array
const& rhs)
504template<
class T1,
class T2,
size_t N>
514 class =
typename std::enable_if<
515 is_array<Array>::value
519bool operator!=(span<T>
const& lhs, Array
const& rhs)
521 return !(lhs == rhs);
527 class =
typename std::enable_if<
528 is_array<Array>::value
532bool operator==(Array
const& lhs, span<T>
const& rhs)
540 class =
typename std::enable_if<
541 is_array<Array>::value,
546bool operator!=(Array
const& lhs, span<T>
const& rhs)
548 return !(rhs == lhs);
555 class =
typename std::enable_if<
560auto make_view(Array
const&
a)
561-> span<typename Array::value_type>
566template<
class T,
size_t N>
568span<T> make_view(T
const (&
a)[
N])
575span<T> make_view(T
const* p,
typename span<T>::size_type
const n)
577 return span<T>{p,
n};
580template<class InputIterator, class Result = span<typename std::iterator_traits<InputIterator>::value_type>>
582Result make_view(InputIterator begin, InputIterator end)
584 return Result{begin, end};
589span<T> make_view(std::initializer_list<T>
const&
l)
607#include <type_traits>
619 static constexpr int rank = Rank;
620 using reference = ptrdiff_t &;
621 using const_reference =
const ptrdiff_t &;
622 using size_type = size_t;
623 using value_type = ptrdiff_t;
626 std::array<value_type, Rank> m_B;
629 constexpr bounds() noexcept;
631 constexpr bounds(value_type
b) noexcept: m_B{{
b}} { };
636 reference operator[](size_type i)
noexcept {
return m_B[i]; }
638 constexpr const_reference operator[](
639 size_type i)
const noexcept {
return m_B[i]; };
642 bool operator==(
const bounds &rhs)
const noexcept;
644 bool operator!=(
const bounds &rhs)
const noexcept;
646 bounds
operator+(
const index<rank> &rhs)
const noexcept;
648 bounds
operator-(
const index<rank> &rhs)
const noexcept;
650 bounds &
operator+=(
const index<rank> &rhs)
noexcept;
652 bounds &
operator-=(
const index<rank> &rhs)
noexcept;
654 constexpr size_type
size() const noexcept;
656 bool contains(const index<rank> &idx) const noexcept;
667 static constexpr int rank = Rank;
668 using reference = ptrdiff_t &;
669 using const_reference =
const ptrdiff_t &;
670 using size_type = size_t;
671 using value_type = ptrdiff_t;
674 constexpr index() noexcept;
676 constexpr index(value_type) noexcept;
678 constexpr index(const initializer_list<value_type> &) noexcept;
680 constexpr index(const index &) noexcept;
682 index &operator=(const index &) noexcept;
684 reference operator[](size_type component_idx) noexcept;
686 constexpr const_reference operator[](size_type component_idx) const noexcept;
688 bool operator==(const index &rhs) const noexcept;
690 bool operator!=(const index &rhs) const noexcept;
692 index operator+(const index &rhs) const noexcept;
694 index operator-(const index &rhs) const noexcept;
696 index &operator+=(const index &rhs) noexcept;
698 index &operator-=(const index &rhs) noexcept;
700 index &operator++() noexcept;
702 index operator++(
int) noexcept;
704 index &operator--() noexcept;
706 index operator--(
int) noexcept;
708 index operator+() const noexcept;
710 index operator-() const noexcept;
715template<typename ValueType,
int Rank = 1>
718 static constexpr int rank = Rank;
719 using size_type = index<rank>;
720 using bounds_type = bounds<rank>;
721 using size_type =
typename bounds_type::size_type;
722 using value_type = ValueType;
723 using pointer =
typename std::add_pointer_t<value_type>;
724 using reference =
typename std::add_lvalue_reference_t<value_type>;
726 constexpr span() noexcept;
728 constexpr explicit span(std::vector<ValueType> &cont) noexcept;
730 template<typename ArrayType>
731 constexpr explicit span(ArrayType &data) noexcept;
733 template<typename ViewValueType>
734 constexpr span(const span<ViewValueType, rank> &rhs) noexcept;
736 template<typename Container>
737 constexpr span(bounds_type bounds, Container &cont) noexcept;
739 constexpr span(bounds_type bounds, pointer data) noexcept;
741 template<typename ViewValueType>
742 span &operator=(const span<ViewValueType, rank> &rhs) noexcept;
744 constexpr bounds_type bounds() const noexcept;
745 constexpr size_type
size() const noexcept;
746 constexpr size_type stride() const noexcept;
748 constexpr pointer data() const noexcept;
749 constexpr reference operator[](const size_type& idx) const noexcept;
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
Bool_t operator!=(const TDatime &d1, const TDatime &d2)
Bool_t operator==(const TDatime &d1, const TDatime &d2)
TString operator+(const TString &s1, const TString &s2)
Use the special concatenation constructor.
std::string & operator+=(std::string &left, const TString &right)
TTime operator-(const TTime &t1, const TTime &t2)
RVec< T0 > & operator-=(RVec< T0 > &v, const T1 &y)
Special implementation of ROOT::RRangeCast for TCollection, including a check that the cast target ty...
typename make_indices_< Start, Last, Step >::type make_indices
bool operator_equal_impl(ArrayL const &lhs, size_t const lhs_size, ArrayR const &rhs, size_t const rhs_size)
#define R__CONSTEXPR_IF_CXX14
static constexpr size_t value[sizeof...(Indices)]
indices< Indices...,(Indices+Next)..., Tail > type
indices< Indices...,(Indices+Next)... > type