14#ifndef ROOT_RHYSD_SPAN_H 
   15#define ROOT_RHYSD_SPAN_H 
   17#if __cplusplus >= 202002 
   18# if __has_include(<span>) 
   23#if !defined(__cpp_lib_span) 
   26#if __cplusplus >= 201402L 
   27#define R__CONSTEXPR_IF_CXX14 constexpr 
   29#define R__CONSTEXPR_IF_CXX14 
   41#include <initializer_list> 
   50  static bool const value = 
false;
 
   52template<
class T, 
size_t N>
 
   54  static bool const value = 
true;
 
   58  static bool const value = 
true;
 
   61struct is_array_class<std::initializer_list<T>> {
 
   62  static bool const value = 
true;
 
   67template< 
size_t... Indices >
 
   69  static constexpr size_t value[
sizeof...(Indices)] = {Indices...};
 
   72template<
class IndicesType, 
size_t Next>
 
   75template<
size_t... Indices, 
size_t Next>
 
   80template<
class IndicesType, 
size_t Next, 
size_t Tail>
 
   83template<
size_t... Indices, 
size_t Next, 
size_t Tail>
 
   88template<
size_t First, 
size_t Step, 
size_t N, 
class = 
void>
 
   91template<
size_t First, 
size_t Step, 
size_t N>
 
   96   typename std::enable_if<(N == 0)>
::type 
  101template<
size_t First, 
size_t Step, 
size_t N>
 
  106   typename std::enable_if<(N == 1)>
::type 
  111template<
size_t First, 
size_t Step, 
size_t N>
 
  116   typename std::enable_if<(N > 1 && N % 2 == 0)>
::type 
  119      typename ROOT::Detail::make_indices_impl<First, Step, N / 2>::type,
 
  124template<
size_t First, 
size_t Step, 
size_t N>
 
  125struct make_indices_impl<
 
  129   typename std::enable_if<(N > 1 && N % 2 == 1)>
::type 
  132      typename ROOT::Detail::make_indices_impl<First, Step, N / 2>::type,
 
  133      First + N / 2 * Step,
 
  134      First + (N - 1) * Step
 
  138template<
size_t First, 
size_t Last, 
size_t Step = 1>
 
  143      ((Last - First) + (Step - 1)) / Step
 
  147template < 
size_t Start, 
size_t Last, 
size_t Step = 1 >
 
  155inline namespace __ROOT {
 
  159struct check_bound_t {};
 
  160static constexpr check_bound_t check_bound{};
 
  168  typedef T element_type;
 
  169  typedef std::remove_cv<T>     value_type;
 
  170  typedef element_type *        pointer;
 
  171  typedef element_type 
const*   const_pointer;
 
  172  typedef element_type &        reference;
 
  173  typedef element_type 
const&   const_reference;
 
  174  typedef element_type *        iterator;
 
  175  typedef element_type 
const*   const_iterator;
 
  176  typedef ptrdiff_t             difference_type;
 
  177  typedef std::size_t           size_type;
 
  178  typedef std::reverse_iterator<iterator> reverse_iterator;
 
  179  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
  184  constexpr span() noexcept
 
  185     : length_(0), data_(
nullptr)
 
  188  constexpr span(span 
const&) 
noexcept = 
default;
 
  189  constexpr span(span &&) noexcept = default;
 
  193  template<size_type 
N>
 
  194   span(std::array<T, 
N> & 
a) noexcept
 
  195     : length_(
N), data_(
N > 0 ? 
a.data() : 
nullptr)
 
  200  template<
size_type N>
 
  201   span(
T(& 
a)[
N]) noexcept
 
  202     : length_(
N), data_(
N > 0 ? std::addressof(
a[0]) : nullptr)
 
  204    static_assert(
N > 0, 
"Zero-length array is not permitted in ISO C++.");
 
  207   span(std::vector<
typename std::remove_cv<T>::type> 
const& 
v) noexcept
 
  208     : length_(
v.size()), data_(
v.empty() ? 
nullptr : 
v.
data())
 
  211   span(std::vector<
typename std::remove_cv<T>::type> & 
v) noexcept
 
  212     : length_(
v.size()), data_(
v.empty() ? 
nullptr : 
v.
data())
 
  215   constexpr span(pointer 
a, size_type 
const n) noexcept
 
  216     : length_(
n), data_(
a)
 
  221     class = 
typename std::enable_if<
 
  223           typename std::remove_cv<T>::type,
 
  224           typename std::iterator_traits<InputIterator>::value_type
 
  228  span(InputIterator start, InputIterator last)
 
  229     : length_(std::distance(
start, last)), data_(&*
start)
 
  232  span(std::initializer_list<T> 
const& 
l)
 
  233     : length_(
l.
size()), data_(std::begin(
l))
 
  236  span& 
operator=(span 
const&) 
noexcept = 
default;
 
  237  span& 
operator=(span &&) noexcept = delete;
 
  242  constexpr iterator begin() const noexcept
 
  246  constexpr iterator 
end() const noexcept
 
  248    return data_ + length_;
 
  250  constexpr const_iterator cbegin() const noexcept
 
  254  constexpr const_iterator cend() const noexcept
 
  258  reverse_iterator rbegin()
 const 
  262  reverse_iterator rend()
 const 
  266  const_reverse_iterator crbegin()
 const 
  270  const_reverse_iterator crend()
 const 
  278  constexpr size_type 
size() const noexcept
 
  282  constexpr size_type 
length() const noexcept
 
  286  constexpr size_type max_size() const noexcept
 
  290  constexpr bool empty() const noexcept
 
  294  constexpr reference operator[](size_type 
const n) 
const noexcept 
  298  constexpr reference at(size_type 
const n)
 const 
  303    return n >= length_ ? 
throw std::out_of_range(
"span::at()") : *(data_ + 
n);
 
  305  constexpr pointer 
data() const noexcept
 
  309  constexpr const_reference front() const noexcept
 
  313  constexpr const_reference back() const noexcept
 
  315    return *(data_ + length_ - 1);
 
  323  constexpr span<T> slice(check_bound_t, size_type 
const pos, size_type 
const slicelen)
 const 
  330    return pos >= length_ || pos + slicelen >= length_ ? 
throw std::out_of_range(
"span::slice()") : span<
T>{begin() + pos, begin() + pos + slicelen};
 
  332  constexpr span<T> slice_before(check_bound_t, size_type 
const pos)
 const 
  339    return pos >= length_ ? std::out_of_range(
"span::slice()") : span<
T>{begin(), begin() + pos};
 
  341  constexpr span<T> slice_after(check_bound_t, size_type 
const pos)
 const 
  348    return pos >= length_ ? std::out_of_range(
"span::slice()") : span<
T>{begin() + pos, 
end()};
 
  352  constexpr span<T> slice(size_type 
const pos, size_type 
const slicelen)
 const 
  354    return span<T>{begin() + pos, begin() + pos + slicelen};
 
  356  constexpr span<T> slice_before(size_type 
const pos)
 const 
  358    return span<T>{begin(), begin() + pos};
 
  360  constexpr span<T> slice_after(size_type 
const pos)
 const 
  362    return span<T>{begin() + pos, 
end()};
 
  368  constexpr span<T> slice(check_bound_t, iterator start, iterator last)
 const 
  378    return ( start >= 
end() ||
 
  381             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};
 
  383  constexpr span<T> slice_before(check_bound_t, iterator 
const pos)
 const 
  390    return pos < begin() || pos > 
end() ? 
throw std::out_of_range(
"span::slice()") : span<
T>{begin(), pos > 
end() ? 
end() : pos};
 
  392  constexpr span<T> slice_after(check_bound_t, iterator 
const pos)
 const 
  399    return pos < begin() || pos > 
end() ? 
throw std::out_of_range(
"span::slice()") : span<
T>{pos < begin() ? begin() : pos, 
end()};
 
  403  constexpr span<T> slice(iterator start, iterator last)
 const 
  405    return span<T>{
start, last};
 
  407  constexpr span<T> slice_before(iterator 
const pos)
 const 
  409    return span<T>{begin(), pos};
 
  411  constexpr span<T> slice_after(iterator 
const pos)
 const 
  413    return span<T>{pos, 
end()};
 
  421  template<class Allocator = std::allocator<typename std::remove_cv<T>::type>>
 
  422  auto to_vector(Allocator 
const& alloc = Allocator{}) 
const 
  423  -> std::vector<
typename std::remove_cv<T>::type, Allocator>
 
  425    return {begin(), 
end(), alloc};
 
  429  auto to_array() const
 
  435  template<
size_t... 
I>
 
  437  -> std::array<
T, 
sizeof...(I)>
 
  439    return {{(
I < length_ ? *(data_ + 
I) : 
T{} )...}};
 
  454template< 
class ArrayL, 
class ArrayR >
 
  456bool operator_equal_impl(ArrayL 
const& lhs, 
size_t const lhs_size, ArrayR 
const& rhs, 
size_t const rhs_size)
 
  458  if (lhs_size != rhs_size) {
 
  462  auto litr = std::begin(lhs);
 
  463  auto ritr = std::begin(rhs);
 
  464  for (; litr != std::end(lhs); ++litr, ++ritr) {
 
  465    if (!(*litr == *ritr)) {
 
  476inline namespace __ROOT {
 
  478template<
class T1, 
class T2>
 
  480bool operator==(span<T1> 
const& lhs, span<T2> 
const& rhs)
 
  488   class = 
typename std::enable_if<
 
  493bool operator==(span<T> 
const& lhs, Array 
const& rhs)
 
  498template<
class T1, 
class T2, 
size_t N>
 
  508   class = 
typename std::enable_if<
 
  509      is_array<Array>::value
 
  513bool operator!=(span<T> 
const& lhs, Array 
const& rhs)
 
  515  return !(lhs == rhs);
 
  521   class = 
typename std::enable_if<
 
  522      is_array<Array>::value
 
  526bool operator==(Array 
const& lhs, span<T> 
const& rhs)
 
  534   class = 
typename std::enable_if<
 
  535      is_array<Array>::value,
 
  540bool operator!=(Array 
const& lhs, span<T> 
const& rhs)
 
  542  return !(rhs == lhs);
 
  549   class = 
typename std::enable_if<
 
  554auto make_view(Array 
const& 
a)
 
  555-> span<typename Array::value_type>
 
  560template< 
class T, 
size_t N>
 
  562span<T> make_view(T 
const (&
a)[
N])
 
  569span<T> make_view(T 
const* 
p, 
typename span<T>::size_type 
const n)
 
  571  return span<T>{
p, 
n};
 
  574template<class InputIterator, class Result = span<typename std::iterator_traits<InputIterator>::value_type>>
 
  576Result make_view(InputIterator begin, InputIterator end)
 
  578  return Result{begin, 
end};
 
  583span<T> make_view(std::initializer_list<T> 
const& 
l)
 
  601#include <type_traits> 
  613  static constexpr int rank = Rank;
 
  614  using reference = ptrdiff_t &;
 
  615  using const_reference = 
const ptrdiff_t &;
 
  616  using size_type = size_t;
 
  617  using value_type = ptrdiff_t;
 
  620  std::array<value_type, Rank> m_B;
 
  623  constexpr bounds() noexcept;
 
  625  constexpr bounds(value_type 
b) noexcept: m_B{{
b}} { };
 
  630  reference operator[](size_type i) 
noexcept { 
return m_B[i]; }
 
  632  constexpr const_reference operator[](
 
  633     size_type i) 
const noexcept { 
return m_B[i]; };
 
  636  bool operator==(
const bounds &rhs) 
const noexcept;
 
  638  bool operator!=(
const bounds &rhs) 
const noexcept;
 
  640  bounds 
operator+(
const index<rank> &rhs) 
const noexcept;
 
  642  bounds 
operator-(
const index<rank> &rhs) 
const noexcept;
 
  644  bounds &
operator+=(
const index<rank> &rhs) 
noexcept;
 
  646  bounds &
operator-=(
const index<rank> &rhs) 
noexcept;
 
  648  constexpr size_type 
size() const noexcept;
 
  650  bool contains(const 
index<rank> &idx) const noexcept;
 
  661  static constexpr int rank = Rank;
 
  662  using reference = ptrdiff_t &;
 
  663  using const_reference = 
const ptrdiff_t &;
 
  664  using size_type = size_t;
 
  665  using value_type = ptrdiff_t;
 
  668  constexpr index() noexcept;
 
  670  constexpr 
index(value_type) noexcept;
 
  672  constexpr 
index(const initializer_list<value_type> &) noexcept;
 
  678  reference operator[](size_type component_idx) noexcept;
 
  680  constexpr const_reference operator[](size_type component_idx) const noexcept;
 
  682  bool operator==(const 
index &rhs) const noexcept;
 
  684  bool operator!=(const 
index &rhs) const noexcept;
 
  686  index operator+(const 
index &rhs) const noexcept;
 
  688  index operator-(const 
index &rhs) const noexcept;
 
  694  index &operator++() noexcept;
 
  696  index operator++(
int) noexcept;
 
  698  index &operator--() noexcept;
 
  700  index operator--(
int) noexcept;
 
  702  index operator+() const noexcept;
 
  704  index operator-() const noexcept;
 
  709template<typename ValueType, 
int Rank = 1>
 
  712  static constexpr int rank = Rank;
 
  713  using size_type = index<rank>;
 
  714  using bounds_type = bounds<rank>;
 
  715  using size_type = 
typename bounds_type::size_type;
 
  716  using value_type = ValueType;
 
  717  using pointer = 
typename std::add_pointer_t<value_type>;
 
  718  using reference = 
typename std::add_lvalue_reference_t<value_type>;
 
  720  constexpr span() noexcept;
 
  722  constexpr explicit span(std::vector<ValueType> &cont) noexcept;
 
  724  template<typename ArrayType>
 
  725  constexpr explicit span(ArrayType &
data) noexcept;
 
  727  template<typename ViewValueType>
 
  728  constexpr span(const span<ViewValueType, rank> &rhs) noexcept;
 
  730  template<typename Container>
 
  731  constexpr span(bounds_type bounds, Container &cont) noexcept;
 
  733  constexpr span(bounds_type bounds, pointer 
data) noexcept;
 
  735  template<typename ViewValueType>
 
  736  span &operator=(const span<ViewValueType, rank> &rhs) noexcept;
 
  738  constexpr bounds_type bounds() const noexcept;
 
  739  constexpr size_type 
size() const noexcept;
 
  740  constexpr size_type stride() const noexcept;
 
  742  constexpr pointer 
data() const noexcept;
 
  743  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)
 
winID h TVirtualViewer3D TVirtualGLPainter p
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
 
Binding & operator=(OUT(*fun)(void))
 
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)
 
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)
 
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.
 
#define R__CONSTEXPR_IF_CXX14
 
static constexpr size_t value[sizeof...(Indices)]