16#if __cplusplus > 201402L
17#define R__RVEC_NODISCARD [[nodiscard]]
19#define R__RVEC_NODISCARD
24 #ifndef _USE_MATH_DEFINES
25 #define _USE_MATH_DEFINES
28 #undef _USE_MATH_DEFINES
30 #define _VECOPS_USE_EXTERN_TEMPLATES false
32 #define _VECOPS_USE_EXTERN_TEMPLATES true
55#include <vdt/vdtMath.h>
80constexpr bool All(
const bool *vals, std::size_t
size)
82 for (
auto i = 0u;
i <
size; ++
i)
88template <
typename... T>
91 constexpr const auto nArgs =
sizeof...(T);
92 const std::size_t sizes[] = {vs.
size()...};
94 for (
auto i = 1UL;
i < nArgs;
i++) {
95 if (sizes[0] == sizes[
i])
98 msg +=
": input RVec instances have different lengths!";
99 throw std::runtime_error(msg);
105template <
typename F,
typename... RVecs>
111 for (
auto i = 0UL;
i <
size;
i++)
112 ret[
i] =
f(vs[
i]...);
117template <
typename Tuple_t, std::size_t... Is>
119 ->
decltype(
MapImpl(std::get<std::tuple_size<Tuple_t>::value - 1>(t), std::get<Is>(t)...))
121 constexpr const auto tupleSizeM1 = std::tuple_size<Tuple_t>::value - 1;
122 return MapImpl(std::get<tupleSizeM1>(t), std::get<Is>(t)...);
154 static constexpr size_t SizeTypeMax() {
return std::numeric_limits<Size_T>::max(); }
162 void grow_pod(
void *FirstEl,
size_t MinSize,
size_t TSize);
166 static void report_size_overflow(
size_t MinSize);
169 static void report_at_maximum_capacity();
192 throw std::runtime_error(
"Setting size to a value greater than capacity.");
215 return const_cast<void *
>(
reinterpret_cast<const void *
>(
reinterpret_cast<const char *
>(
this) +
288 throw std::runtime_error(
"`front` called on an empty RVec");
296 throw std::runtime_error(
"`front` called on an empty RVec");
304 throw std::runtime_error(
"`back` called on an empty RVec");
312 throw std::runtime_error(
"`back` called on an empty RVec");
326template <
typename T,
bool = (std::is_trivially_copy_constructible<T>::value) &&
327 (std::is_trivially_move_constructible<T>::value) &&
328 std::is_trivially_destructible<T>::value>
343 template <
typename It1,
typename It2>
346 std::uninitialized_copy(std::make_move_iterator(
I), std::make_move_iterator(E), Dest);
351 template <
typename It1,
typename It2>
354 std::uninitialized_copy(
I, E, Dest);
367 ::new ((
void *)this->
end()) T(Elt);
375 ::new ((
void *)this->
end()) T(::std::move(Elt));
387template <
typename T,
bool TriviallyCopyable>
392 if (MinSize > this->SizeTypeMax())
393 this->report_size_overflow(MinSize);
399 if (this->capacity() == this->SizeTypeMax())
400 this->report_at_maximum_capacity();
403 size_t NewCapacity = size_t(
NextPowerOf2(this->capacity() + 2));
404 NewCapacity = std::min(std::max(NewCapacity, MinSize), this->SizeTypeMax());
405 T *NewElts =
static_cast<T *
>(
malloc(NewCapacity *
sizeof(T)));
409 this->uninitialized_move(this->begin(), this->end(), NewElts);
413 destroy_range(this->begin(), this->end());
416 if (!this->isSmall())
420 this->fBeginX = NewElts;
421 this->fCapacity = NewCapacity;
440 template <
typename It1,
typename It2>
449 template <
typename It1,
typename It2>
453 std::uninitialized_copy(
I, E, Dest);
458 template <
typename T1,
typename T2>
461 typename std::enable_if<std::is_same<
typename std::remove_const<T1>::type,
T2>
::value>
::type * =
nullptr)
468 memcpy(
reinterpret_cast<void *
>(Dest),
I, (E -
I) *
sizeof(T));
488 memcpy(
reinterpret_cast<void *
>(this->
end()), &Elt,
sizeof(T));
497template <
typename T,
unsigned N>
515#ifdef R__HAS_HARDWARE_INTERFERENCE_SIZE
516 constexpr std::size_t
cacheLineSize = std::hardware_destructive_interference_size;
530template <
typename ForwardIt>
533#if __cplusplus < 201703L
534 for (; first != last; ++first)
535 new (
static_cast<void *
>(std::addressof(*first)))
typename std::iterator_traits<ForwardIt>::value_type();
537 std::uninitialized_value_construct(first, last);
603 }
else if (
N > this->
size()) {
606 for (
auto I = this->
end(), E = this->
begin() +
N;
I != E; ++
I)
618 }
else if (
N > this->
size()) {
621 std::uninitialized_fill(this->
end(), this->
begin() +
N, NV);
634 if (this->
size() < NumItems) {
635 throw std::runtime_error(
"Popping back more elements than those available.");
644 T Result = ::std::move(this->
back());
652 template <
typename in_iter,
653 typename =
typename std::enable_if<std::is_convertible<
654 typename std::iterator_traits<in_iter>::iterator_category, std::input_iterator_tag>
::value>
::type>
655 void append(in_iter in_start, in_iter in_end)
657 size_type NumInputs = std::distance(in_start, in_end);
659 this->
grow(this->
size() + NumInputs);
669 this->
grow(this->
size() + NumInputs);
671 std::uninitialized_fill_n(this->
end(), NumInputs, Elt);
675 void append(std::initializer_list<T> IL) {
append(IL.begin(), IL.end()); }
687 std::uninitialized_fill(this->
begin(), this->
end(), Elt);
690 template <
typename in_iter,
691 typename =
typename std::enable_if<std::is_convertible<
692 typename std::iterator_traits<in_iter>::iterator_category, std::input_iterator_tag>
::value>
::type>
693 void assign(in_iter in_start, in_iter in_end)
711 throw std::runtime_error(
"The iterator passed to `erase` is out of bounds.");
716 std::move(
I + 1, this->
end(),
I);
728 if (S < this->
begin() || E > this->
end() || S > E) {
729 throw std::runtime_error(
"Invalid start/end pair passed to `erase` (out of bounds or start > end).");
744 if (
I == this->
end()) {
746 return this->
end() - 1;
750 throw std::runtime_error(
"The iterator passed to `insert` is out of bounds.");
754 size_t EltNo =
I - this->
begin();
756 I = this->begin() + EltNo;
759 ::new ((
void *)this->
end()) T(::std::move(this->
back()));
761 std::move_backward(
I, this->
end() - 1, this->
end());
767 if (
I <= EltPtr && EltPtr < this->
end())
770 *
I = ::std::move(*EltPtr);
776 if (
I == this->
end()) {
778 return this->
end() - 1;
782 throw std::runtime_error(
"The iterator passed to `insert` is out of bounds.");
786 size_t EltNo =
I - this->
begin();
788 I = this->begin() + EltNo;
790 ::new ((
void *)this->
end()) T(std::move(this->
back()));
792 std::move_backward(
I, this->
end() - 1, this->
end());
797 const T *EltPtr = &Elt;
798 if (
I <= EltPtr && EltPtr < this->
end())
808 size_t InsertElt =
I - this->
begin();
810 if (
I == this->
end()) {
812 return this->begin() + InsertElt;
816 throw std::runtime_error(
"The iterator passed to `insert` is out of bounds.");
823 I = this->begin() + InsertElt;
829 if (
size_t(this->
end() -
I) >= NumToInsert) {
830 T *OldEnd = this->
end();
831 append(std::move_iterator<iterator>(this->
end() - NumToInsert), std::move_iterator<iterator>(this->
end()));
834 std::move_backward(
I, OldEnd - NumToInsert, OldEnd);
836 std::fill_n(
I, NumToInsert, Elt);
844 T *OldEnd = this->
end();
846 size_t NumOverwritten = OldEnd -
I;
850 std::fill_n(
I, NumOverwritten, Elt);
853 std::uninitialized_fill_n(OldEnd, NumToInsert - NumOverwritten, Elt);
857 template <
typename ItTy,
858 typename =
typename std::enable_if<std::is_convertible<
859 typename std::iterator_traits<ItTy>::iterator_category, std::input_iterator_tag>
::value>
::type>
863 size_t InsertElt =
I - this->
begin();
865 if (
I == this->
end()) {
867 return this->begin() + InsertElt;
871 throw std::runtime_error(
"The iterator passed to `insert` is out of bounds.");
874 size_t NumToInsert = std::distance(From, To);
880 I = this->begin() + InsertElt;
886 if (
size_t(this->
end() -
I) >= NumToInsert) {
887 T *OldEnd = this->
end();
888 append(std::move_iterator<iterator>(this->
end() - NumToInsert), std::move_iterator<iterator>(this->
end()));
891 std::move_backward(
I, OldEnd - NumToInsert, OldEnd);
893 std::copy(From, To,
I);
901 T *OldEnd = this->
end();
903 size_t NumOverwritten = OldEnd -
I;
907 for (T *J =
I; NumOverwritten > 0; --NumOverwritten) {
920 template <
typename... ArgTypes>
925 ::new ((
void *)this->
end()) T(std::forward<ArgTypes>(Args)...);
953 temp = std::move(RHS);
954 RHS = std::move(*
this);
955 *
this = std::move(temp);
957 }
else if (RHS.
isSmall() && !this->Owns()) {
959 temp = std::move(*
this);
960 *
this = std::move(RHS);
961 RHS = std::move(temp);
965 if (RHS.
size() > this->capacity())
971 size_t NumShared = this->
size();
972 if (NumShared > RHS.
size())
973 NumShared = RHS.
size();
979 size_t EltDiff = this->
size() - RHS.
size();
985 }
else if (RHS.
size() > this->size()) {
986 size_t EltDiff = RHS.
size() - this->
size();
1004 size_t RHSSize = RHS.
size();
1005 size_t CurSize = this->
size();
1006 if (CurSize >= RHSSize) {
1010 NewEnd = std::copy(RHS.
begin(), RHS.
begin() + RHSSize, this->begin());
1012 NewEnd = this->
begin();
1034 this->
grow(RHSSize);
1035 }
else if (CurSize) {
1037 std::copy(RHS.
begin(), RHS.
begin() + CurSize, this->begin());
1048template <
typename T>
1056 if (!RHS.isSmall()) {
1063 this->
fSize = RHS.fSize;
1071 size_t RHSSize = RHS.size();
1072 size_t CurSize = this->
size();
1073 if (CurSize >= RHSSize) {
1077 NewEnd = std::move(RHS.begin(), RHS.end(), NewEnd);
1102 this->
grow(RHSSize);
1103 }
else if (CurSize) {
1105 std::move(RHS.begin(), RHS.begin() + CurSize, this->begin());
1118template <
typename T>
1124template <
typename T>
1151template <
typename T,
unsigned int N>
1174 template <
typename ItTy,
1175 typename =
typename std::enable_if<std::is_convertible<
1176 typename std::iterator_traits<ItTy>::iterator_category, std::input_iterator_tag>
::value>
::type>
1244 return begin()[idx];
1249 return begin()[idx];
1252 template <typename V, unsigned M, typename = std::enable_if<std::is_convertible<V, bool>::value>>
1257 if (
n != this->
size()) {
1258 std::string msg =
"Cannot index RVecN of size " + std::to_string(this->
size()) +
1259 " with condition vector of different size (" + std::to_string(
n) +
").";
1260 throw std::runtime_error(msg);
1264 for (
auto c : conds)
1280 template <typename U, unsigned M, typename = std::enable_if<std::is_convertible<T, U>::value>>
1289 std::string msg =
"RVecN::at: size is " + std::to_string(this->
fSize) +
" but out-of-bounds index " +
1290 std::to_string(pos) +
" was requested.";
1291 throw std::out_of_range(msg);
1299 std::string msg =
"RVecN::at: size is " + std::to_string(this->
fSize) +
" but out-of-bounds index " +
1300 std::to_string(pos) +
" was requested.";
1301 throw std::out_of_range(msg);
1529template <
typename T>
1530class R__CLING_PTRCHECK(off)
RVec :
public RVecN<T, Internal::VecOps::RVecInlineStorageSize<T>::value> {
1549 template <
typename ItTy,
1550 typename =
typename std::enable_if<std::is_convertible<
1551 typename std::iterator_traits<ItTy>::iterator_category, std::input_iterator_tag>
::value>
::type>
1576 template <
unsigned N>
1579 template <
unsigned N>
1587 template <typename U, typename = std::enable_if<std::is_convertible<T, U>::value>>
1593 using SuperClass::operator[];
1595 template <typename V, typename = std::enable_if<std::is_convertible<V, bool>::value>>
1598 return RVec(SuperClass::operator[](conds));
1608template <
typename T,
unsigned N>
1611 return X.capacity_in_bytes();
1617#define RVEC_UNARY_OPERATOR(OP) \
1618template <typename T> \
1619RVec<T> operator OP(const RVec<T> &v) \
1622 for (auto &x : ret) \
1631#undef RVEC_UNARY_OPERATOR
1637#define ERROR_MESSAGE(OP) \
1638 "Cannot call operator " #OP " on vectors of different sizes."
1640#define RVEC_BINARY_OPERATOR(OP) \
1641template <typename T0, typename T1> \
1642auto operator OP(const RVec<T0> &v, const T1 &y) \
1643 -> RVec<decltype(v[0] OP y)> \
1645 RVec<decltype(v[0] OP y)> ret(v.size()); \
1646 auto op = [&y](const T0 &x) { return x OP y; }; \
1647 std::transform(v.begin(), v.end(), ret.begin(), op); \
1651template <typename T0, typename T1> \
1652auto operator OP(const T0 &x, const RVec<T1> &v) \
1653 -> RVec<decltype(x OP v[0])> \
1655 RVec<decltype(x OP v[0])> ret(v.size()); \
1656 auto op = [&x](const T1 &y) { return x OP y; }; \
1657 std::transform(v.begin(), v.end(), ret.begin(), op); \
1661template <typename T0, typename T1> \
1662auto operator OP(const RVec<T0> &v0, const RVec<T1> &v1) \
1663 -> RVec<decltype(v0[0] OP v1[0])> \
1665 if (v0.size() != v1.size()) \
1666 throw std::runtime_error(ERROR_MESSAGE(OP)); \
1668 RVec<decltype(v0[0] OP v1[0])> ret(v0.size()); \
1669 auto op = [](const T0 &x, const T1 &y) { return x OP y; }; \
1670 std::transform(v0.begin(), v0.end(), v1.begin(), ret.begin(), op); \
1682#undef RVEC_BINARY_OPERATOR
1688#define RVEC_ASSIGNMENT_OPERATOR(OP) \
1689template <typename T0, typename T1> \
1690RVec<T0>& operator OP(RVec<T0> &v, const T1 &y) \
1692 auto op = [&y](T0 &x) { return x OP y; }; \
1693 std::transform(v.begin(), v.end(), v.begin(), op); \
1697template <typename T0, typename T1> \
1698RVec<T0>& operator OP(RVec<T0> &v0, const RVec<T1> &v1) \
1700 if (v0.size() != v1.size()) \
1701 throw std::runtime_error(ERROR_MESSAGE(OP)); \
1703 auto op = [](T0 &x, const T1 &y) { return x OP y; }; \
1704 std::transform(v0.begin(), v0.end(), v1.begin(), v0.begin(), op); \
1718#undef RVEC_ASSIGNMENT_OPERATOR
1724#define RVEC_LOGICAL_OPERATOR(OP) \
1725template <typename T0, typename T1> \
1726auto operator OP(const RVec<T0> &v, const T1 &y) \
1729 RVec<int> ret(v.size()); \
1730 auto op = [y](const T0 &x) -> int { return x OP y; }; \
1731 std::transform(v.begin(), v.end(), ret.begin(), op); \
1735template <typename T0, typename T1> \
1736auto operator OP(const T0 &x, const RVec<T1> &v) \
1739 RVec<int> ret(v.size()); \
1740 auto op = [x](const T1 &y) -> int { return x OP y; }; \
1741 std::transform(v.begin(), v.end(), ret.begin(), op); \
1745template <typename T0, typename T1> \
1746auto operator OP(const RVec<T0> &v0, const RVec<T1> &v1) \
1749 if (v0.size() != v1.size()) \
1750 throw std::runtime_error(ERROR_MESSAGE(OP)); \
1752 RVec<int> ret(v0.size()); \
1753 auto op = [](const T0 &x, const T1 &y) -> int { return x OP y; }; \
1754 std::transform(v0.begin(), v0.end(), v1.begin(), ret.begin(), op); \
1766#undef RVEC_LOGICAL_OPERATOR
1773template <
typename T>
struct PromoteTypeImpl;
1775template <>
struct PromoteTypeImpl<float> {
using Type = float; };
1776template <>
struct PromoteTypeImpl<
double> {
using Type =
double; };
1777template <>
struct PromoteTypeImpl<long
double> {
using Type =
long double; };
1779template <
typename T>
struct PromoteTypeImpl {
using Type = double; };
1781template <
typename T>
1782using PromoteType =
typename PromoteTypeImpl<T>::Type;
1784template <
typename U,
typename V>
1785using PromoteTypes =
decltype(PromoteType<U>() + PromoteType<V>());
1789#define RVEC_UNARY_FUNCTION(NAME, FUNC) \
1790 template <typename T> \
1791 RVec<PromoteType<T>> NAME(const RVec<T> &v) \
1793 RVec<PromoteType<T>> ret(v.size()); \
1794 auto f = [](const T &x) { return FUNC(x); }; \
1795 std::transform(v.begin(), v.end(), ret.begin(), f); \
1799#define RVEC_BINARY_FUNCTION(NAME, FUNC) \
1800 template <typename T0, typename T1> \
1801 RVec<PromoteTypes<T0, T1>> NAME(const T0 &x, const RVec<T1> &v) \
1803 RVec<PromoteTypes<T0, T1>> ret(v.size()); \
1804 auto f = [&x](const T1 &y) { return FUNC(x, y); }; \
1805 std::transform(v.begin(), v.end(), ret.begin(), f); \
1809 template <typename T0, typename T1> \
1810 RVec<PromoteTypes<T0, T1>> NAME(const RVec<T0> &v, const T1 &y) \
1812 RVec<PromoteTypes<T0, T1>> ret(v.size()); \
1813 auto f = [&y](const T0 &x) { return FUNC(x, y); }; \
1814 std::transform(v.begin(), v.end(), ret.begin(), f); \
1818 template <typename T0, typename T1> \
1819 RVec<PromoteTypes<T0, T1>> NAME(const RVec<T0> &v0, const RVec<T1> &v1) \
1821 if (v0.size() != v1.size()) \
1822 throw std::runtime_error(ERROR_MESSAGE(NAME)); \
1824 RVec<PromoteTypes<T0, T1>> ret(v0.size()); \
1825 auto f = [](const T0 &x, const T1 &y) { return FUNC(x, y); }; \
1826 std::transform(v0.begin(), v0.end(), v1.begin(), ret.begin(), f); \
1830#define RVEC_STD_UNARY_FUNCTION(F) RVEC_UNARY_FUNCTION(F, std::F)
1831#define RVEC_STD_BINARY_FUNCTION(F) RVEC_BINARY_FUNCTION(F, std::F)
1878#undef RVEC_STD_UNARY_FUNCTION
1885#define RVEC_VDT_UNARY_FUNCTION(F) RVEC_UNARY_FUNCTION(F, vdt::F)
1887RVEC_VDT_UNARY_FUNCTION(fast_expf)
1888RVEC_VDT_UNARY_FUNCTION(fast_logf)
1889RVEC_VDT_UNARY_FUNCTION(fast_sinf)
1890RVEC_VDT_UNARY_FUNCTION(fast_cosf)
1891RVEC_VDT_UNARY_FUNCTION(fast_tanf)
1892RVEC_VDT_UNARY_FUNCTION(fast_asinf)
1893RVEC_VDT_UNARY_FUNCTION(fast_acosf)
1894RVEC_VDT_UNARY_FUNCTION(fast_atanf)
1896RVEC_VDT_UNARY_FUNCTION(fast_exp)
1897RVEC_VDT_UNARY_FUNCTION(fast_log)
1898RVEC_VDT_UNARY_FUNCTION(fast_sin)
1899RVEC_VDT_UNARY_FUNCTION(fast_cos)
1900RVEC_VDT_UNARY_FUNCTION(fast_tan)
1901RVEC_VDT_UNARY_FUNCTION(fast_asin)
1902RVEC_VDT_UNARY_FUNCTION(fast_acos)
1903RVEC_VDT_UNARY_FUNCTION(fast_atan)
1904#undef RVEC_VDT_UNARY_FUNCTION
1908#undef RVEC_UNARY_FUNCTION
1923template <
typename T,
typename V>
1926 if (
v0.size() !=
v1.size())
1927 throw std::runtime_error(
"Cannot compute inner product of vectors of different sizes");
1928 return std::inner_product(
v0.begin(),
v0.end(),
v1.begin(),
decltype(
v0[0] *
v1[0])(0));
1954template <
typename T>
1957 return std::accumulate(
v.begin(),
v.end(), zero);
1962 return std::accumulate(
v.begin(),
v.end(), zero);
1966template <
typename T>
1969 return std::accumulate(
v.begin(),
v.end(), init, std::multiplies<T>());
1984template <
typename T>
1987 if (
v.empty())
return 0.;
2016template <
typename T,
typename R = T>
2019 if (
v.empty())
return zero;
2020 return Sum(
v, zero) /
v.size();
2033template <
typename T>
2036 return *std::max_element(
v.begin(),
v.end());
2049template <
typename T>
2052 return *std::min_element(
v.begin(),
v.end());
2067template <
typename T>
2070 return std::distance(
v.begin(), std::max_element(
v.begin(),
v.end()));
2085template <
typename T>
2088 return std::distance(
v.begin(), std::min_element(
v.begin(),
v.end()));
2102template <
typename T>
2105 const std::size_t
size =
v.size();
2106 if (
size < std::size_t(2))
return 0.;
2107 T sum_squares(0), squared_sum(0);
2108 auto pred = [&sum_squares, &squared_sum](
const T&
x) {sum_squares+=
x*
x; squared_sum+=
x;};
2109 std::for_each(
v.begin(),
v.end(), pred);
2110 squared_sum *= squared_sum;
2112 return 1. / (dsize - 1.) * (sum_squares - squared_sum / dsize );
2126template <
typename T>
2129 return std::sqrt(
Var(
v));
2150template <
typename... Args>
2163 constexpr auto nArgs =
sizeof...(Args);
2166 "Map: the first N-1 arguments must be RVecs or references to RVecs");
2169 std::make_index_sequence<
sizeof...(args) - 1>());
2182template <
typename T,
typename F>
2185 const auto thisSize =
v.size();
2187 w.reserve(thisSize);
2188 for (
auto &&val :
v) {
2190 w.emplace_back(val);
2205template <
typename T>
2209 if (
static_cast<bool>(
e) ==
true)
2224template <
typename T>
2228 if (
static_cast<bool>(
e) ==
false)
2233template <
typename T>
2250template <
typename T>
2255 std::iota(
i.begin(),
i.end(), 0);
2256 std::sort(
i.begin(),
i.end(), [&
v](size_type i1, size_type i2) { return v[i1] < v[i2]; });
2271template <
typename T,
typename Compare>
2276 std::iota(
i.begin(),
i.end(), 0);
2277 std::sort(
i.begin(),
i.end(),
2278 [&
v, &
c](size_type i1, size_type i2) { return c(v[i1], v[i2]); });
2295template <
typename T>
2300 std::iota(
i.begin(),
i.end(), 0);
2301 std::stable_sort(
i.begin(),
i.end(), [&
v](size_type i1, size_type i2) { return v[i1] < v[i2]; });
2318template <
typename T,
typename Compare>
2323 std::iota(
i.begin(),
i.end(), 0);
2324 std::stable_sort(
i.begin(),
i.end(), [&
v, &
c](size_type i1, size_type i2) { return c(v[i1], v[i2]); });
2339template <
typename T>
2343 const size_type isize =
i.size();
2345 for (size_type k = 0; k < isize; k++)
2351template <
typename T>
2355 const size_type isize =
i.size();
2357 for (size_type k = 0; k < isize; k++)
2359 if (
i[k] <
v.size() &&
i[k]>=0){
2382template <
typename T>
2386 const size_type
size =
v.size();
2387 const size_type absn = std::abs(
n);
2389 const auto msg = std::to_string(absn) +
" elements requested from Take but input contains only " +
2390 std::to_string(
size) +
" elements.";
2391 throw std::runtime_error(msg);
2395 for (size_type k = 0; k < absn; k++)
2396 r[k] =
v[
size - absn + k];
2398 for (size_type k = 0; k < absn; k++)
2423template <
typename T>
2427 const size_type
size =
v.size();
2428 const size_type absn = std::abs(
n);
2440 const auto num_to_fill = absn -
size;
2448template <
typename T>
2452 std::sort(idxs.begin(), idxs.end());
2453 idxs.erase(std::unique(idxs.begin(), idxs.end()), idxs.end());
2456 if (
v.size() > idxs.size())
2457 r.reserve(
v.size() - idxs.size());
2459 auto discardIt = idxs.begin();
2461 for (sz_t
i = 0u;
i <
v.size(); ++
i) {
2462 if (discardIt != idxs.end() &&
i == *discardIt)
2465 r.emplace_back(
v[
i]);
2481template <
typename T>
2485 std::reverse(
r.begin(),
r.end());
2502template <
typename T>
2506 std::sort(
r.begin(),
r.end());
2527template <
typename T,
typename Compare>
2531 std::sort(
r.begin(),
r.end(), std::forward<Compare>(
c));
2551template <
typename T>
2555 std::stable_sort(
r.begin(),
r.end());
2587template <
typename T,
typename Compare>
2591 std::stable_sort(
r.begin(),
r.end(), std::forward<Compare>(
c));
2609 using size_type = std::size_t;
2611 r[0].resize(size1*size2);
2612 r[1].resize(size1*size2);
2614 for(size_type
i=0;
i<size1;
i++) {
2615 for(size_type j=0; j<size2; j++) {
2638template <
typename T1,
typename T2>
2663template <
typename T>
2667 const size_type s =
v.size();
2669 throw std::runtime_error(
"Cannot make unique combinations of size " + std::to_string(
n) +
2670 " from vector of size " + std::to_string(s) +
".");
2674 for(size_type k=0; k<s; k++)
2677 const auto innersize = [=] {
2678 size_type inners = s -
n + 1;
2679 for (size_type
m = s -
n + 2;
m <= s; ++
m)
2682 size_type factn = 1;
2683 for (size_type
i = 2;
i <=
n; ++
i)
2691 size_type inneridx = 0;
2692 for (size_type k = 0; k <
n; k++)
2697 bool run_through =
true;
2701 run_through =
false;
2709 for (
long j=
i+1; j<(long)
n; j++)
2711 for (size_type k = 0; k <
n; k++)
2727template <
typename T>
2732 const auto size =
v.size();
2734 for(size_type
i=0;
i<
size;
i++) {
2758template <
typename T>
2762 if (!v2_is_sorted) v2_sorted =
Sort(
v2);
2763 const auto v2_begin = v2_is_sorted ?
v2.begin() : v2_sorted.
begin();
2764 const auto v2_end = v2_is_sorted ?
v2.end() : v2_sorted.
end();
2766 const auto size =
v1.size();
2769 for(size_type
i=0;
i<
size;
i++) {
2770 if (std::binary_search(v2_begin, v2_end,
v1[
i])) {
2771 r.emplace_back(
v1[
i]);
2792template <
typename T>
2796 const size_type
size =
c.size();
2799 for (size_type
i=0;
i<
size;
i++) {
2800 r.emplace_back(
c[
i] != 0 ?
v1[
i] :
v2[
i]);
2820template <
typename T>
2824 const size_type
size =
c.size();
2827 for (size_type
i=0;
i<
size;
i++) {
2828 r.emplace_back(
c[
i] != 0 ?
v1[
i] :
v2);
2848template <
typename T>
2852 const size_type
size =
c.size();
2855 for (size_type
i=0;
i<
size;
i++) {
2856 r.emplace_back(
c[
i] != 0 ?
v1 :
v2[
i]);
2874template <
typename T>
2878 const size_type
size =
c.size();
2881 for (size_type
i=0;
i<
size;
i++) {
2882 r.emplace_back(
c[
i] != 0 ?
v1 :
v2);
2897template <typename T0, typename T1, typename Common_t = typename std::common_type<T0, T1>::type>
2902 std::copy(
v0.begin(),
v0.end(), std::back_inserter(res));
2903 std::copy(
v1.begin(),
v1.end(), std::back_inserter(res));
2913template <
typename T0,
typename T1 = T0,
typename Common_t = std::common_type_t<T0, T1>>
2916 static_assert(std::is_floating_point<T0>::value && std::is_floating_point<T1>::value,
2917 "DeltaPhi must be called with floating point values.");
2918 auto r = std::fmod(
v2 -
v1, 2.0 *
c);
2934template <
typename T0,
typename T1 = T0,
typename Common_t =
typename std::common_type_t<T0, T1>>
2938 const size_type
size =
v1.size();
2940 for (size_type
i = 0;
i <
size;
i++) {
2952template <
typename T0,
typename T1 = T0,
typename Common_t =
typename std::common_type_t<T0, T1>>
2956 const size_type
size =
v1.size();
2958 for (size_type
i = 0;
i <
size;
i++) {
2970template <
typename T0,
typename T1 = T0,
typename Common_t =
typename std::common_type_t<T0, T1>>
2974 const size_type
size =
v2.size();
2976 for (size_type
i = 0;
i <
size;
i++) {
2989template <
typename T0,
typename T1 = T0,
typename T2 = T0,
typename T3 = T0,
typename Common_t = std::common_type_t<T0, T1, T2, T3>>
2992 const auto dphi =
DeltaPhi(phi1, phi2,
c);
2993 return (eta1 - eta2) * (eta1 - eta2) + dphi * dphi;
3003template <
typename T0,
typename T1 = T0,
typename T2 = T0,
typename T3 = T0,
typename Common_t = std::common_type_t<T0, T1, T2, T3>>
3016template <
typename T0,
typename T1 = T0,
typename T2 = T0,
typename T3 = T0,
typename Common_t = std::common_type_t<T0, T1, T2, T3>>
3019 const auto dphi =
DeltaPhi(phi1, phi2,
c);
3020 return std::sqrt((eta1 - eta2) * (eta1 - eta2) + dphi * dphi);
3028template <
typename T0,
typename T1 = T0,
typename T2 = T0,
typename T3 = T0,
typename T4 = T0,
3029 typename T5 = T0,
typename T6 = T0,
typename T7 = T0,
typename Common_t = std::common_type_t<T0, T1, T2, T3, T4, T5, T6, T7>>
3041 for (std::size_t
i = 0u;
i <
size; ++
i) {
3043 const auto x1 = pt1[
i] * std::cos(phi1[
i]);
3044 const auto y1 = pt1[
i] * std::sin(phi1[
i]);
3045 const auto z1 = pt1[
i] * std::sinh(eta1[
i]);
3046 const auto e1 = std::sqrt(
x1 *
x1 +
y1 *
y1 + z1 * z1 + mass1[
i] * mass1[
i]);
3048 const auto x2 = pt2[
i] * std::cos(phi2[
i]);
3049 const auto y2 = pt2[
i] * std::sin(phi2[
i]);
3050 const auto z2 = pt2[
i] * std::sinh(eta2[
i]);
3051 const auto e2 = std::sqrt(
x2 *
x2 +
y2 *
y2 + z2 * z2 + mass2[
i] * mass2[
i]);
3054 const auto e = e1 + e2;
3055 const auto x =
x1 +
x2;
3056 const auto y =
y1 +
y2;
3057 const auto z = z1 + z2;
3059 inv_masses[
i] = std::sqrt(
e *
e -
x *
x -
y *
y - z * z);
3071template <
typename T0,
typename T1 = T0,
typename T2 = T0,
typename T3 = T0,
typename Common_t = std::common_type_t<T0, T1, T2, T3>>
3074 const std::size_t
size =
pt.size();
3078 Common_t x_sum = 0.;
3079 Common_t y_sum = 0.;
3080 Common_t z_sum = 0.;
3081 Common_t e_sum = 0.;
3083 for (std::size_t
i = 0u;
i <
size; ++
i) {
3085 const auto x =
pt[
i] * std::cos(phi[
i]);
3087 const auto y =
pt[
i] * std::sin(phi[
i]);
3089 const auto z =
pt[
i] * std::sinh(eta[
i]);
3091 const auto e = std::sqrt(
x *
x +
y *
y + z * z + mass[
i] * mass[
i]);
3096 return std::sqrt(e_sum * e_sum - x_sum * x_sum - y_sum * y_sum - z_sum * z_sum);
3117template <
typename T,
typename... Args_t>
3123 for (
auto i = 0UL;
i <
size; ++
i) {
3137template <
typename T>
3140 const auto size =
v.size();
3143 for (
auto i = 0UL;
i <
size; ++
i) {
3171 ret.
reserve(begin < end ? end - begin : 0u);
3172 for (
auto i = begin;
i < end; ++
i)
3193 throw std::runtime_error(
"Range: the stride must not be zero");
3196 float ret_cap = std::ceil(
static_cast<float>(end-begin) / stride);
3202 ret.
reserve(
static_cast<size_t>(ret_cap));
3205 for (
auto i = begin;
i < end;
i+=stride)
3210 for (
auto i = begin;
i > end;
i+=stride)
3222 constexpr bool mustConvert = std::is_same<char, T>::value || std::is_same<signed char, T>::value ||
3223 std::is_same<unsigned char, T>::value || std::is_same<wchar_t, T>::value ||
3224 std::is_same<char16_t, T>::value || std::is_same<char32_t, T>::value;
3225 using Print_t =
typename std::conditional<mustConvert, long long int, T>::type;
3227 auto size =
v.size();
3229 for (std::size_t
i = 0;
i <
size - 1; ++
i) {
3230 os << (Print_t)
v[
i] <<
", ";
3232 os << (Print_t)
v[
size - 1];
3238#if (_VECOPS_USE_EXTERN_TEMPLATES)
3240#define RVEC_EXTERN_UNARY_OPERATOR(T, OP) \
3241 extern template RVec<T> operator OP<T>(const RVec<T> &);
3243#define RVEC_EXTERN_BINARY_OPERATOR(T, OP) \
3244 extern template auto operator OP<T, T>(const T &x, const RVec<T> &v) \
3245 -> RVec<decltype(x OP v[0])>; \
3246 extern template auto operator OP<T, T>(const RVec<T> &v, const T &y) \
3247 -> RVec<decltype(v[0] OP y)>; \
3248 extern template auto operator OP<T, T>(const RVec<T> &v0, const RVec<T> &v1)\
3249 -> RVec<decltype(v0[0] OP v1[0])>;
3251#define RVEC_EXTERN_ASSIGN_OPERATOR(T, OP) \
3252 extern template RVec<T> &operator OP<T, T>(RVec<T> &, const T &); \
3253 extern template RVec<T> &operator OP<T, T>(RVec<T> &, const RVec<T> &);
3255#define RVEC_EXTERN_LOGICAL_OPERATOR(T, OP) \
3256 extern template RVec<int> operator OP<T, T>(const RVec<T> &, const T &); \
3257 extern template RVec<int> operator OP<T, T>(const T &, const RVec<T> &); \
3258 extern template RVec<int> operator OP<T, T>(const RVec<T> &, const RVec<T> &);
3260#define RVEC_EXTERN_FLOAT_TEMPLATE(T) \
3261 extern template class RVec<T>; \
3262 RVEC_EXTERN_UNARY_OPERATOR(T, +) \
3263 RVEC_EXTERN_UNARY_OPERATOR(T, -) \
3264 RVEC_EXTERN_UNARY_OPERATOR(T, !) \
3265 RVEC_EXTERN_BINARY_OPERATOR(T, +) \
3266 RVEC_EXTERN_BINARY_OPERATOR(T, -) \
3267 RVEC_EXTERN_BINARY_OPERATOR(T, *) \
3268 RVEC_EXTERN_BINARY_OPERATOR(T, /) \
3269 RVEC_EXTERN_ASSIGN_OPERATOR(T, +=) \
3270 RVEC_EXTERN_ASSIGN_OPERATOR(T, -=) \
3271 RVEC_EXTERN_ASSIGN_OPERATOR(T, *=) \
3272 RVEC_EXTERN_ASSIGN_OPERATOR(T, /=) \
3273 RVEC_EXTERN_LOGICAL_OPERATOR(T, <) \
3274 RVEC_EXTERN_LOGICAL_OPERATOR(T, >) \
3275 RVEC_EXTERN_LOGICAL_OPERATOR(T, ==) \
3276 RVEC_EXTERN_LOGICAL_OPERATOR(T, !=) \
3277 RVEC_EXTERN_LOGICAL_OPERATOR(T, <=) \
3278 RVEC_EXTERN_LOGICAL_OPERATOR(T, >=) \
3279 RVEC_EXTERN_LOGICAL_OPERATOR(T, &&) \
3280 RVEC_EXTERN_LOGICAL_OPERATOR(T, ||)
3282#define RVEC_EXTERN_INTEGER_TEMPLATE(T) \
3283 extern template class RVec<T>; \
3284 RVEC_EXTERN_UNARY_OPERATOR(T, +) \
3285 RVEC_EXTERN_UNARY_OPERATOR(T, -) \
3286 RVEC_EXTERN_UNARY_OPERATOR(T, ~) \
3287 RVEC_EXTERN_UNARY_OPERATOR(T, !) \
3288 RVEC_EXTERN_BINARY_OPERATOR(T, +) \
3289 RVEC_EXTERN_BINARY_OPERATOR(T, -) \
3290 RVEC_EXTERN_BINARY_OPERATOR(T, *) \
3291 RVEC_EXTERN_BINARY_OPERATOR(T, /) \
3292 RVEC_EXTERN_BINARY_OPERATOR(T, %) \
3293 RVEC_EXTERN_BINARY_OPERATOR(T, &) \
3294 RVEC_EXTERN_BINARY_OPERATOR(T, |) \
3295 RVEC_EXTERN_BINARY_OPERATOR(T, ^) \
3296 RVEC_EXTERN_ASSIGN_OPERATOR(T, +=) \
3297 RVEC_EXTERN_ASSIGN_OPERATOR(T, -=) \
3298 RVEC_EXTERN_ASSIGN_OPERATOR(T, *=) \
3299 RVEC_EXTERN_ASSIGN_OPERATOR(T, /=) \
3300 RVEC_EXTERN_ASSIGN_OPERATOR(T, %=) \
3301 RVEC_EXTERN_ASSIGN_OPERATOR(T, &=) \
3302 RVEC_EXTERN_ASSIGN_OPERATOR(T, |=) \
3303 RVEC_EXTERN_ASSIGN_OPERATOR(T, ^=) \
3304 RVEC_EXTERN_ASSIGN_OPERATOR(T, >>=) \
3305 RVEC_EXTERN_ASSIGN_OPERATOR(T, <<=) \
3306 RVEC_EXTERN_LOGICAL_OPERATOR(T, <) \
3307 RVEC_EXTERN_LOGICAL_OPERATOR(T, >) \
3308 RVEC_EXTERN_LOGICAL_OPERATOR(T, ==) \
3309 RVEC_EXTERN_LOGICAL_OPERATOR(T, !=) \
3310 RVEC_EXTERN_LOGICAL_OPERATOR(T, <=) \
3311 RVEC_EXTERN_LOGICAL_OPERATOR(T, >=) \
3312 RVEC_EXTERN_LOGICAL_OPERATOR(T, &&) \
3313 RVEC_EXTERN_LOGICAL_OPERATOR(T, ||)
3315RVEC_EXTERN_INTEGER_TEMPLATE(
char)
3316RVEC_EXTERN_INTEGER_TEMPLATE(
short)
3317RVEC_EXTERN_INTEGER_TEMPLATE(
int)
3318RVEC_EXTERN_INTEGER_TEMPLATE(
long)
3321RVEC_EXTERN_INTEGER_TEMPLATE(
unsigned char)
3322RVEC_EXTERN_INTEGER_TEMPLATE(
unsigned short)
3323RVEC_EXTERN_INTEGER_TEMPLATE(
unsigned int)
3324RVEC_EXTERN_INTEGER_TEMPLATE(
unsigned long)
3327RVEC_EXTERN_FLOAT_TEMPLATE(
float)
3328RVEC_EXTERN_FLOAT_TEMPLATE(
double)
3330#undef RVEC_EXTERN_UNARY_OPERATOR
3331#undef RVEC_EXTERN_BINARY_OPERATOR
3332#undef RVEC_EXTERN_ASSIGN_OPERATOR
3333#undef RVEC_EXTERN_LOGICAL_OPERATOR
3334#undef RVEC_EXTERN_INTEGER_TEMPLATE
3335#undef RVEC_EXTERN_FLOAT_TEMPLATE
3337#define RVEC_EXTERN_UNARY_FUNCTION(T, NAME, FUNC) \
3338 extern template RVec<PromoteType<T>> NAME(const RVec<T> &);
3340#define RVEC_EXTERN_STD_UNARY_FUNCTION(T, F) RVEC_EXTERN_UNARY_FUNCTION(T, F, std::F)
3342#define RVEC_EXTERN_BINARY_FUNCTION(T0, T1, NAME, FUNC) \
3343 extern template RVec<PromoteTypes<T0, T1>> NAME(const RVec<T0> &, const T1 &); \
3344 extern template RVec<PromoteTypes<T0, T1>> NAME(const T0 &, const RVec<T1> &); \
3345 extern template RVec<PromoteTypes<T0, T1>> NAME(const RVec<T0> &, const RVec<T1> &);
3347#define RVEC_EXTERN_STD_BINARY_FUNCTION(T, F) RVEC_EXTERN_BINARY_FUNCTION(T, T, F, std::F)
3349#define RVEC_EXTERN_STD_FUNCTIONS(T) \
3350 RVEC_EXTERN_STD_UNARY_FUNCTION(T, abs) \
3351 RVEC_EXTERN_STD_BINARY_FUNCTION(T, fdim) \
3352 RVEC_EXTERN_STD_BINARY_FUNCTION(T, fmod) \
3353 RVEC_EXTERN_STD_BINARY_FUNCTION(T, remainder) \
3354 RVEC_EXTERN_STD_UNARY_FUNCTION(T, exp) \
3355 RVEC_EXTERN_STD_UNARY_FUNCTION(T, exp2) \
3356 RVEC_EXTERN_STD_UNARY_FUNCTION(T, expm1) \
3357 RVEC_EXTERN_STD_UNARY_FUNCTION(T, log) \
3358 RVEC_EXTERN_STD_UNARY_FUNCTION(T, log10) \
3359 RVEC_EXTERN_STD_UNARY_FUNCTION(T, log2) \
3360 RVEC_EXTERN_STD_UNARY_FUNCTION(T, log1p) \
3361 RVEC_EXTERN_STD_BINARY_FUNCTION(T, pow) \
3362 RVEC_EXTERN_STD_UNARY_FUNCTION(T, sqrt) \
3363 RVEC_EXTERN_STD_UNARY_FUNCTION(T, cbrt) \
3364 RVEC_EXTERN_STD_BINARY_FUNCTION(T, hypot) \
3365 RVEC_EXTERN_STD_UNARY_FUNCTION(T, sin) \
3366 RVEC_EXTERN_STD_UNARY_FUNCTION(T, cos) \
3367 RVEC_EXTERN_STD_UNARY_FUNCTION(T, tan) \
3368 RVEC_EXTERN_STD_UNARY_FUNCTION(T, asin) \
3369 RVEC_EXTERN_STD_UNARY_FUNCTION(T, acos) \
3370 RVEC_EXTERN_STD_UNARY_FUNCTION(T, atan) \
3371 RVEC_EXTERN_STD_BINARY_FUNCTION(T, atan2) \
3372 RVEC_EXTERN_STD_UNARY_FUNCTION(T, sinh) \
3373 RVEC_EXTERN_STD_UNARY_FUNCTION(T, cosh) \
3374 RVEC_EXTERN_STD_UNARY_FUNCTION(T, tanh) \
3375 RVEC_EXTERN_STD_UNARY_FUNCTION(T, asinh) \
3376 RVEC_EXTERN_STD_UNARY_FUNCTION(T, acosh) \
3377 RVEC_EXTERN_STD_UNARY_FUNCTION(T, atanh) \
3378 RVEC_EXTERN_STD_UNARY_FUNCTION(T, floor) \
3379 RVEC_EXTERN_STD_UNARY_FUNCTION(T, ceil) \
3380 RVEC_EXTERN_STD_UNARY_FUNCTION(T, trunc) \
3381 RVEC_EXTERN_STD_UNARY_FUNCTION(T, round) \
3382 RVEC_EXTERN_STD_UNARY_FUNCTION(T, erf) \
3383 RVEC_EXTERN_STD_UNARY_FUNCTION(T, erfc) \
3384 RVEC_EXTERN_STD_UNARY_FUNCTION(T, lgamma) \
3385 RVEC_EXTERN_STD_UNARY_FUNCTION(T, tgamma) \
3387RVEC_EXTERN_STD_FUNCTIONS(
float)
3388RVEC_EXTERN_STD_FUNCTIONS(
double)
3389#undef RVEC_EXTERN_STD_UNARY_FUNCTION
3390#undef RVEC_EXTERN_STD_BINARY_FUNCTION
3391#undef RVEC_EXTERN_STD_UNARY_FUNCTIONS
3395#define RVEC_EXTERN_VDT_UNARY_FUNCTION(T, F) RVEC_EXTERN_UNARY_FUNCTION(T, F, vdt::F)
3397RVEC_EXTERN_VDT_UNARY_FUNCTION(
float, fast_expf)
3398RVEC_EXTERN_VDT_UNARY_FUNCTION(
float, fast_logf)
3399RVEC_EXTERN_VDT_UNARY_FUNCTION(
float, fast_sinf)
3400RVEC_EXTERN_VDT_UNARY_FUNCTION(
float, fast_cosf)
3401RVEC_EXTERN_VDT_UNARY_FUNCTION(
float, fast_tanf)
3402RVEC_EXTERN_VDT_UNARY_FUNCTION(
float, fast_asinf)
3403RVEC_EXTERN_VDT_UNARY_FUNCTION(
float, fast_acosf)
3404RVEC_EXTERN_VDT_UNARY_FUNCTION(
float, fast_atanf)
3406RVEC_EXTERN_VDT_UNARY_FUNCTION(
double, fast_exp)
3407RVEC_EXTERN_VDT_UNARY_FUNCTION(
double, fast_log)
3408RVEC_EXTERN_VDT_UNARY_FUNCTION(
double, fast_sin)
3409RVEC_EXTERN_VDT_UNARY_FUNCTION(
double, fast_cos)
3410RVEC_EXTERN_VDT_UNARY_FUNCTION(
double, fast_tan)
3411RVEC_EXTERN_VDT_UNARY_FUNCTION(
double, fast_asin)
3412RVEC_EXTERN_VDT_UNARY_FUNCTION(
double, fast_acos)
3413RVEC_EXTERN_VDT_UNARY_FUNCTION(
double, fast_atan)
#define R__unlikely(expr)
true
Register systematic variations for multiple existing columns using auto-generated tags.
RInterface< RDFDetail::RFilter< F, Proxied >, DS_t > Filter(F f, const ColumnNames_t &columns={}, std::string_view name="")
Append a filter to the call graph.
#define R__RVEC_NODISCARD
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
TBuffer & operator<<(TBuffer &buf, const Tmpl *obj)
#define R__CLING_PTRCHECK(ONOFF)
static Double_t Product(const Double_t *x, const Float_t *y)
Product.
Int_t Compare(const void *item1, const void *item2)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void w
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 r
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 x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char y2
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
Option_t Option_t TPoint TPoint const char y1
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, const T &Elt)
typename SuperClass::iterator iterator
typename SuperClass::size_type size_type
void append(in_iter in_start, in_iter in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void assign(std::initializer_list< T > IL)
typename SuperClass::const_iterator const_iterator
void resize(size_type N, const T &NV)
void reserve(size_type N)
iterator insert(iterator I, ItTy From, ItTy To)
reference emplace_back(ArgTypes &&...Args)
Internal::VecOps::SmallVectorTemplateBase< T > SuperClass
void assign(in_iter in_start, in_iter in_end)
iterator insert(iterator I, const T &Elt)
iterator insert(iterator I, size_type NumToInsert, const T &Elt)
RVecImpl & operator=(const RVecImpl &RHS)
iterator erase(const_iterator CS, const_iterator CE)
typename SuperClass::reference reference
void append(size_type NumInputs, const T &Elt)
Append NumInputs copies of Elt to the end.
iterator erase(const_iterator CI)
RVecImpl & operator=(RVecImpl &&RHS)
void pop_back_n(size_type NumItems)
RVecImpl(const RVecImpl &)=delete
void append(std::initializer_list< T > IL)
void insert(iterator I, std::initializer_list< T > IL)
This is all the stuff common to all SmallVectors.
SmallVectorBase(void *FirstEl, size_t TotalCapacity)
static constexpr size_t SizeTypeMax()
The maximum value of the Size_T used.
Size_T fCapacity
Always >= -1. fCapacity == -1 indicates the RVec is in "memory adoption" mode.
void grow_pod(void *FirstEl, size_t MinSize, size_t TSize)
This is an implementation of the grow() method which only works on POD-like data types and is out of ...
bool Owns() const
If false, the RVec is in "memory adoption" mode, i.e. it is acting as a view on a memory buffer it do...
size_t capacity() const noexcept
void set_size(size_t N)
Set the array size to N, which the current array must have enough capacity for.
typename SuperClass::iterator iterator
void grow(size_t MinSize=0)
Double the size of the allocated memory, guaranteeing space for at least one more element or MinSize ...
typename SuperClass::size_type size_type
typename SuperClass::reference reference
void push_back(const T &Elt)
static void uninitialized_move(It1 I, It1 E, It2 Dest)
Move the range [I, E) onto the uninitialized memory starting with "Dest", constructing elements into ...
SmallVectorTemplateCommon< T > SuperClass
SmallVectorTemplateBase(size_t Size)
typename SuperClass::const_iterator const_iterator
static void uninitialized_copy(T1 *I, T1 *E, T2 *Dest, typename std::enable_if< std::is_same< typename std::remove_const< T1 >::type, T2 >::value >::type *=nullptr)
Copy the range [I, E) onto the uninitialized memory starting with "Dest", constructing elements into ...
static void destroy_range(T *, T *)
static void uninitialized_copy(It1 I, It1 E, It2 Dest)
Copy the range [I, E) onto the uninitialized memory starting with "Dest", constructing elements into ...
SmallVectorTemplateBase<TriviallyCopyable = false> - This is where we put method implementations that...
void push_back(const T &Elt)
void grow(size_t MinSize=0)
Grow the allocated memory (without initializing new elements), doubling the size of the allocated mem...
static void uninitialized_move(It1 I, It1 E, It2 Dest)
Move the range [I, E) into the uninitialized memory starting with "Dest", constructing elements as ne...
SmallVectorTemplateBase(size_t Size)
static void destroy_range(T *S, T *E)
static void uninitialized_copy(It1 I, It1 E, It2 Dest)
Copy the range [I, E) onto the uninitialized memory starting with "Dest", constructing elements as ne...
This is the part of SmallVectorTemplateBase which does not depend on whether the type T is a POD.
size_type max_size() const noexcept
const_iterator cbegin() const noexcept
void grow_pod(size_t MinSize, size_t TSize)
ptrdiff_t difference_type
reverse_iterator rbegin() noexcept
const_iterator cend() const noexcept
const_reference back() const
void resetToSmall()
Put this vector in a state of being small.
iterator begin() noexcept
std::reverse_iterator< iterator > reverse_iterator
const T & const_reference
bool isSmall() const
Return true if this is a smallvector which has not had dynamic memory allocated for it.
const_reverse_iterator crend() const noexcept
const_iterator end() const noexcept
SmallVectorTemplateCommon(size_t Size)
const_reverse_iterator crbegin() const noexcept
pointer data() noexcept
Return a pointer to the vector's buffer, even if empty().
size_t capacity_in_bytes() const
reverse_iterator rend() noexcept
const_reverse_iterator rbegin() const noexcept
const_reference front() const
size_type size_in_bytes() const
std::reverse_iterator< const_iterator > const_reverse_iterator
size_t capacity() const noexcept
const_iterator begin() const noexcept
const_pointer data() const noexcept
Return a pointer to the vector's buffer, even if empty().
void * getFirstEl() const
Find the address of the first element.
const_reverse_iterator rend() const noexcept
A "std::vector"-like collection of values implementing handy operation to analyse them.
RVecN< bool, Internal::VecOps::RVecInlineStorageSize< bool >::value > SuperClass
RVecN(Detail::VecOps::RVecImpl< T > &&RHS)
reference operator[](size_type idx)
typename Internal::VecOps::SmallVectorTemplateCommon< T >::const_reference const_reference
RVecN operator[](const RVecN< V, M > &conds) const
RVecN(std::initializer_list< T > IL)
const_reference at(size_type pos) const
RVecN & operator=(Detail::VecOps::RVecImpl< T > &&RHS)
RVecN & operator=(RVecN &&RHS)
typename Internal::VecOps::SmallVectorTemplateCommon< T >::size_type size_type
value_type at(size_type pos, value_type fallback) const
No exception thrown. The user specifies the desired value in case the RVecN is shorter than pos.
RVecN & operator=(std::initializer_list< T > IL)
RVecN & operator=(const RVecN &RHS)
RVecN(const std::vector< T > &RHS)
RVecN(size_t Size, const T &Value)
reference at(size_type pos)
value_type at(size_type pos, value_type fallback)
No exception thrown. The user specifies the desired value in case the RVecN is shorter than pos.
typename Internal::VecOps::SmallVectorTemplateCommon< T >::reference reference
typename Internal::VecOps::SmallVectorTemplateCommon< T >::value_type value_type
const_reference operator[](size_type idx) const
A "std::vector"-like collection of values implementing handy operation to analyse them.
RVecN< T, Internal::VecOps::RVecInlineStorageSize< T >::value > SuperClass
RVec(RVecN< T, N > &&RHS)
typename SuperClass::reference reference
RVec(const RVecN< T, N > &RHS)
RVec(size_t Size, const T &Value)
RVec & operator=(RVec &&RHS)
RVec operator[](const RVec< V > &conds) const
RVec(std::initializer_list< T > IL)
typename SuperClass::const_reference const_reference
RVec(const std::vector< T > &RHS)
typename SuperClass::size_type size_type
RVec(Detail::VecOps::RVecImpl< T > &&RHS)
typename SuperClass::value_type value_type
RVec & operator=(const RVec &RHS)
Type
enumeration specifying the integration types.
T Max(const RVec< T > &v)
Get the greatest element of an RVec.
RVec< T > Reverse(const RVec< T > &v)
Return copy of reversed vector.
RVec< T > Intersect(const RVec< T > &v1, const RVec< T > &v2, bool v2_is_sorted=false)
Return the intersection of elements of two RVecs.
auto All(const RVec< T > &v) -> decltype(v[0]==false)
Return true if all of the elements equate to true, return false otherwise.
RVec< Common_t > DeltaR(const RVec< T0 > &eta1, const RVec< T1 > &eta2, const RVec< T2 > &phi1, const RVec< T3 > &phi2, const Common_t c=M_PI)
Return the distance on the - plane ( ) from the collections eta1, eta2, phi1 and phi2.
RVec< PromoteType< T > > asinh(const RVec< T > &v)
RVec< PromoteType< T > > expm1(const RVec< T > &v)
RVec< PromoteType< T > > lgamma(const RVec< T > &v)
RVec< typename RVec< T >::size_type > Nonzero(const RVec< T > &v)
Return the indices of the elements which are not zero.
RVec< PromoteTypes< T0, T1 > > remainder(const T0 &x, const RVec< T1 > &v)
#define RVEC_UNARY_OPERATOR(OP)
RVec< Common_t > DeltaR2(const RVec< T0 > &eta1, const RVec< T1 > &eta2, const RVec< T2 > &phi1, const RVec< T3 > &phi2, const Common_t c=M_PI)
Return the square of the distance on the - plane ( ) from the collections eta1, eta2,...
RVec< PromoteType< T > > cosh(const RVec< T > &v)
RVec< PromoteType< T > > abs(const RVec< T > &v)
#define RVEC_ASSIGNMENT_OPERATOR(OP)
RVec< PromoteType< T > > round(const RVec< T > &v)
RVec< T > Sort(const RVec< T > &v)
Return copy of RVec with elements sorted in ascending order.
RVec< typename RVec< T >::size_type > StableArgsort(const RVec< T > &v)
Return an RVec of indices that sort the input RVec while keeping the order of equal elements.
RVec< PromoteType< T > > tgamma(const RVec< T > &v)
RVec< PromoteType< T > > log2(const RVec< T > &v)
Common_t DeltaPhi(T0 v1, T1 v2, const Common_t c=M_PI)
Return the angle difference of two scalars.
RVec< Common_t > Concatenate(const RVec< T0 > &v0, const RVec< T1 > &v1)
Return the concatenation of two RVecs.
RVec< PromoteType< T > > tan(const RVec< T > &v)
RVec< PromoteType< T > > erf(const RVec< T > &v)
RVec< PromoteType< T > > cos(const RVec< T > &v)
RVec< PromoteType< T > > floor(const RVec< T > &v)
RVec< PromoteTypes< T0, T1 > > pow(const T0 &x, const RVec< T1 > &v)
RVec< PromoteType< T > > atanh(const RVec< T > &v)
RVec< PromoteType< T > > acosh(const RVec< T > &v)
RVec< PromoteType< T > > ceil(const RVec< T > &v)
RVec< PromoteType< T > > cbrt(const RVec< T > &v)
T Sum(const RVec< T > &v, const T zero=T(0))
Sum elements of an RVec.
double Mean(const RVec< T > &v)
Get the mean of the elements of an RVec.
RVec< Common_t > InvariantMasses(const RVec< T0 > &pt1, const RVec< T1 > &eta1, const RVec< T2 > &phi1, const RVec< T3 > &mass1, const RVec< T4 > &pt2, const RVec< T5 > &eta2, const RVec< T6 > &phi2, const RVec< T7 > &mass2)
Return the invariant mass of two particles given the collections of the quantities transverse momentu...
RVec< T > Take(const RVec< T > &v, const RVec< typename RVec< T >::size_type > &i)
Return elements of a vector at given indices.
RVec< PromoteType< T > > asin(const RVec< T > &v)
void swap(RVec< T > &lhs, RVec< T > &rhs)
RVec< PromoteTypes< T0, T1 > > hypot(const T0 &x, const RVec< T1 > &v)
RVec< PromoteType< T > > log(const RVec< T > &v)
RVec< T > Construct(const RVec< Args_t > &... args)
Build an RVec of objects starting from RVecs of input to their constructors.
RVec< PromoteTypes< T0, T1 > > atan2(const T0 &x, const RVec< T1 > &v)
RVec< PromoteType< T > > trunc(const RVec< T > &v)
RVec< PromoteType< T > > llround(const RVec< T > &v)
RVec< PromoteTypes< T0, T1 > > fdim(const T0 &x, const RVec< T1 > &v)
#define RVEC_STD_BINARY_FUNCTION(F)
RVec< PromoteType< T > > lround(const RVec< T > &v)
#define RVEC_BINARY_OPERATOR(OP)
RVec< T > Drop(const RVec< T > &v, RVec< typename RVec< T >::size_type > idxs)
Return a copy of the container without the elements at the specified indices.
Common_t InvariantMass(const RVec< T0 > &pt, const RVec< T1 > &eta, const RVec< T2 > &phi, const RVec< T3 > &mass)
Return the invariant mass of multiple particles given the collections of the quantities transverse mo...
T Min(const RVec< T > &v)
Get the smallest element of an RVec.
size_t CapacityInBytes(const RVecN< T, N > &X)
#define RVEC_LOGICAL_OPERATOR(OP)
RVec< PromoteType< T > > sinh(const RVec< T > &v)
RVec< PromoteType< T > > sqrt(const RVec< T > &v)
RVec< PromoteType< T > > erfc(const RVec< T > &v)
RVec< RVec< std::size_t > > Combinations(const std::size_t size1, const std::size_t size2)
Return the indices that represent all combinations of the elements of two RVecs.
#define RVEC_STD_UNARY_FUNCTION(F)
RVec< PromoteType< T > > log10(const RVec< T > &v)
RVec< typename RVec< T >::size_type > Enumerate(const RVec< T > &v)
For any Rvec v produce another RVec with entries starting from 0, and incrementing by 1 until a N = v...
RVec< PromoteTypes< T0, T1 > > fmod(const T0 &x, const RVec< T1 > &v)
auto Map(Args &&... args)
Create new collection applying a callable to the elements of the input collection.
RVec< PromoteType< T > > exp(const RVec< T > &v)
RVec< T > Where(const RVec< int > &c, const RVec< T > &v1, const RVec< T > &v2)
Return the elements of v1 if the condition c is true and v2 if the condition c is false.
double StdDev(const RVec< T > &v)
Get the standard deviation of the elements of an RVec.
auto Any(const RVec< T > &v) -> decltype(v[0]==true)
Return true if any of the elements equates to true, return false otherwise.
RVec< PromoteType< T > > tanh(const RVec< T > &v)
RVec< PromoteType< T > > acos(const RVec< T > &v)
RVec< PromoteType< T > > log1p(const RVec< T > &v)
RVec< typename RVec< T >::size_type > Argsort(const RVec< T > &v)
Return an RVec of indices that sort the input RVec.
std::size_t ArgMin(const RVec< T > &v)
Get the index of the smallest element of an RVec In case of multiple occurrences of the minimum value...
RVec< PromoteType< T > > atan(const RVec< T > &v)
RVec< T > StableSort(const RVec< T > &v)
Return copy of RVec with elements sorted in ascending order while keeping the order of equal elements...
RVec< PromoteType< T > > sin(const RVec< T > &v)
double Var(const RVec< T > &v)
Get the variance of the elements of an RVec.
RVec< PromoteType< T > > exp2(const RVec< T > &v)
std::size_t ArgMax(const RVec< T > &v)
Get the index of the greatest element of an RVec In case of multiple occurrences of the maximum value...
bool IsSmall(const ROOT::VecOps::RVec< T > &v)
bool IsAdopting(const ROOT::VecOps::RVec< T > &v)
Special implementation of ROOT::RRangeCast for TCollection, including a check that the cast target ty...
auto MapImpl(F &&f, RVecs &&... vs) -> RVec< decltype(f(vs[0]...))>
void ResetView(RVec< T > &v, T *addr, std::size_t sz)
An unsafe function to reset the buffer for which this RVec is acting as a view.
ROOT::VecOps::RVec< T > RVec
uint64_t NextPowerOf2(uint64_t A)
Return the next power of two (in 64-bits) that is strictly greater than A.
constexpr bool All(const bool *vals, std::size_t size)
std::size_t GetVectorsSize(const std::string &id, const RVec< T > &... vs)
void UninitializedValueConstruct(ForwardIt first, ForwardIt last)
auto MapFromTuple(Tuple_t &&t, std::index_sequence< Is... >) -> decltype(MapImpl(std::get< std::tuple_size< Tuple_t >::value - 1 >(t), std::get< Is >(t)...))
namespace associated R package for ROOT.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
ROOT::VecOps::RVec< unsigned int > RVecU
ROOT::VecOps::RVec< long long int > RVecLL
ROOT::VecOps::RVec< float > RVecF
ROOT::VecOps::RVec< char > RVecC
ROOT::VecOps::RVec< long int > RVecL
ROOT::VecOps::RVec< unsigned long int > RVecUL
ROOT::VecOps::RVec< bool > RVecB
ROOT::VecOps::RVec< unsigned long long int > RVecULL
ROOT::VecOps::RVec< double > RVecD
ROOT::VecOps::RVec< int > RVecI
The size of the inline storage of an RVec.
static constexpr std::size_t cacheLineSize
static constexpr unsigned maxInlineByteSize
static constexpr unsigned value
static constexpr unsigned elementsPerCacheLine
Used to figure out the offset of the first element of an RVec.
char Base[sizeof(SmallVectorBase)]
Storage for the SmallVector elements.
char InlineElts[N *sizeof(T)]