19 #ifndef ALIGN_FUNCS_HPP
20 #define ALIGN_FUNCS_HPP
24 #include "globals.hpp"
29 template <
typename FIter,
typename T>
31 static T f(FIter b, FIter e) {
32 if (e-b == 0)
return Global::ZNAN;
33 return std::accumulate(b, e,
static_cast<T
>(0)) / (e-b);
37 template <
typename FIter,
typename T>
39 static T f(FIter b, FIter e) {
40 if (e-b == 0)
return Global::ZNAN;
41 return *std::max_element(b, e);
45 template <
typename FIter,
typename T>
47 static T f(FIter b, FIter e) {
48 if (e-b == 0)
return Global::ZNAN;
49 return *std::min_element(b, e);
53 template <
typename FIter,
typename T>
55 static T f(FIter b, FIter e) {
56 if (e-b == 0)
return 0;
61 template <
typename FIter,
typename T>
63 static T f(FIter b, FIter e) {
64 if (e-b == 0)
return Global::ZNAN;
66 std::priority_queue<double> left;
69 std::priority_queue<double>::container_type,
73 for (
auto i=b; i!=e; ++i) {
74 if (left.size() == right.size()) {
75 if (!left.size() || *i < left.top()) {
82 else if (left.size() < right.size()) {
83 if (*i < right.top()) {
87 left.push(right.top());
93 if (*i > left.top()) {
97 right.push(left.top());
104 if (left.size() == right.size())
return (left.top() + right.top())/2.0;
105 if (left.size() < right.size())
return right.top();
106 else return left.top();
111 template <
typename FIter,
typename F>
113 static void f(
double d, FIter b, FIter e) {
114 std::for_each(b, e, [d](
double &n){ n = F()(n, d); });