double resp_time(Iter highest, Iter end, double bound)
{
    typedef typename std::iterator_traits<Iter>::value_type Type;

    double r = 0;            // rt, used for the internal loop
    double r_old = 0;        // used for the internal loop
    double r_latest = 0;     // the greatest rt among all instances
    int k = 0;               // instance number
    Iter task = end-1;       // task under analysis

    // starting point: r^0
    for (Iter x = highest; x!=end; ++x) r += x->get_wcet();

    // for_each(highest, end, [&r](Type a) {
    //         r += a.get_wcet();
    //     });

    do {
        k++;
        while (r_old < r) {
            r_old = r;
            r = k * task->get_wcet() + workload(highest, task, 0, r_old);
            if (r > bound) throw RespTimeTooLarge(toString(r));
        }
        r_latest = std::max(r_latest, r - (k-1) * task->get_period());
        if (r > k * task->get_period()) r+=task->get_wcet();
    } while (r > k * task->get_period());
    return r_latest;
}
double workload(Iter first, Iter end, double t1, double t2)
{
    typedef typename std::iterator_traits<Iter>::value_type Type;
    double r = 0;

    for (Iter x = first; x!=end; ++x)
        r += get_num_arrived_instances(*x, t1, t2) * x->get_wcet();

    // for_each(first, end, [&r, t1, t2](Type i) {
    //         r += get_num_arrived_instances(i, t1, t2) *
    //             i.get_wcet();
    //     });
    return r;
}