22#ifndef Rcpp__sugar__median_h
23#define Rcpp__sugar__median_h
55inline bool less(T lhs, T rhs) {
61 if (lhs.r < rhs.r)
return true;
62 if (lhs.i < rhs.i)
return true;
69inline double half(
double lhs) {
73inline double half(
int lhs) {
74 return static_cast<double>(lhs) / 2.0;
77inline Rcomplex
half(Rcomplex lhs) {
86template <
int RTYPE,
bool NA,
typename T,
bool NA_RM = false>
110 R_xlen_t n =
x.size() / 2;
112 x.begin(),
x.begin() + n,
x.end(),
115 if (
x.size() % 2)
return x[n];
117 x[n] + *std::max_element(
118 x.begin(),
x.begin() + n,
124template <
int RTYPE,
bool NA,
typename T>
144 R_xlen_t n =
x.size() / 2;
146 x.begin(),
x.begin() + n,
x.end(),
149 if (
x.size() % 2)
return x[n];
151 x[n] + *std::max_element(
152 x.begin(),
x.begin() + n,
158template <
int RTYPE,
typename T,
bool NA_RM>
178 R_xlen_t n =
x.size() / 2;
180 x.begin(),
x.begin() + n,
x.end(),
183 if (
x.size() % 2)
return x[n];
185 x[n] + *std::max_element(
186 x.begin(),
x.begin() + n,
195template <
bool NA,
typename T,
bool NA_RM>
210 if (!(
x.size() % 2)) {
218 R_xlen_t n =
x.size() / 2;
226template <
bool NA,
typename T>
241 if (!(
x.size() % 2)) {
245 R_xlen_t n =
x.size() / 2;
268 if (!(
x.size() % 2)) {
272 R_xlen_t n =
x.size() / 2;
281template <
int RTYPE,
bool NA,
typename T>
storage_type< RTYPE >::type get_na()
sugar::IsNa< RTYPE, NA, T > is_na(const Rcpp::VectorBase< RTYPE, NA, T > &t)
bool any(InputIterator first, InputIterator last, const T &value)
sugar::median_detail::result< RTYPE >::type median(const Rcpp::VectorBase< RTYPE, NA, T > &x, bool na_rm=false)
Vector< RTYPE > na_omit(const VectorBase< RTYPE, NA, T > &t)