ibex::Interval Tube::getY(const ibex::Interval& intv_t) { if(!m_intv_t.intersects(intv_t)) return ibex::Interval::EMPTY_SET; else if(isSlice() || intv_t.is_unbounded() || intv_t.is_superset(m_intv_t)) return m_intv_y; else return m_first_subtube->getY(intv_t) | m_second_subtube->getY(intv_t); }
Interval Tube::operator[](const ibex::Interval& intv_t) const { // Write access is not allowed for this operator: // a further call to computeTree() is needed when values change, // this call cannot be garanteed with a direct access to m_intv_y // For write access: use setY() if(intv_t.lb() == intv_t.ub()) return (*this)[intv_t.lb()]; Interval intersection = m_intv_t & intv_t; if(intersection.is_empty()) return Interval::EMPTY_SET; else if(isSlice() || intv_t == m_intv_t || intv_t.is_unbounded() || intv_t.is_superset(m_intv_t)) { if(m_tree_computation_needed) computeTree(); return m_intv_y; } else { Interval inter_firstsubtube = m_first_subtube->getT() & intersection; Interval inter_secondsubtube = m_second_subtube->getT() & intersection; if(inter_firstsubtube == inter_secondsubtube) return (*m_first_subtube)[inter_firstsubtube.lb()] & (*m_second_subtube)[inter_secondsubtube.lb()]; else if(inter_firstsubtube.lb() == inter_firstsubtube.ub() && inter_secondsubtube.lb() != inter_secondsubtube.ub()) return (*m_second_subtube)[inter_secondsubtube]; else if(inter_firstsubtube.lb() != inter_firstsubtube.ub() && inter_secondsubtube.lb() == inter_secondsubtube.ub()) return (*m_first_subtube)[inter_firstsubtube]; else return (*m_first_subtube)[inter_firstsubtube] | (*m_second_subtube)[inter_secondsubtube]; } }