// recorre el vector de intervalos
foreach( $this->intervalos as $i ) {
// si se superpone con alguno, fusionar con ese
- if($i->seSuperpone($intervalo)) {
+ if($i->seSuperpone($intervalo) || $i->esAdyacente($intervalo)) {
$intervalo->fusionar($i);
} else {
if($i->inicio->greater($intervalo->inicio) && ! $insertado) {
return $c;
}
- // XXX - Amplié el método para comparar con varios intervalos a la vez,
- // si el argumento no es un array, anda de todas maneras.
+ /**
+ * Chequea si el intervalo se superpone con otros.
+ * @param $intervalos Intervalo o array de Intervalo con los cuales chequear.
+ * @return true si se superpone con uno o más intervalos.
+ */
function seSuperpone($intervalos)
{
if (!is_array($intervalos)) {
$intervalos = array($intervalos);
}
foreach ($intervalos as $i) {
- if ($i->fin->greater($this->inicio) &&
- $this->fin->greater($i->inicio))
- {
+ if ($i->fin->greater($this->inicio) && $this->fin->greater($i->inicio)) {
return true;
}
- if ($this->fin->greater($i->inicio) &&
- $i->fin->greater($this->inicio))
- {
+ if ($this->fin->greater($i->inicio) && $i->fin->greater($this->inicio)) {
return true;
}
}
return false;
}
- function fusionar($f)
+ /**
+ * Chequea si el intervalo es adyacente a otro.
+ * Ejemplo:
+ * <pre>
+ * A B
+ * |-----------|------------| Adyacentes
+ *
+ * A B
+ * |-----------| |--------| No adyacentes
+ * </pre>
+ * @param $intervalo Intervalo con el cual chequear.
+ * @return true si se son adyacentes.
+ */
+ function esAdyacente($intervalo)
+ {
+ if ($i->fin->equal($this->inicio) || $this->fin->equal($i->inicio)) {
+ return true;
+ }
+ return false;
+ }
+
+ function fusionar($i)
{
- if (!$this->seSuperpone($f)) {
+ if (!$this->seSuperpone($i) && !$this->esAdyacente($i)) {
return false;
}
- if ($f->fin->greater($this->fin)) {
- $this->fin = $f->fin;
+ if ($i->fin->greater($this->fin)) {
+ $this->fin = $i->fin;
}
- if ($f->inicio->lower($this->inicio)) {
- $this->inicio = $f->inicio;
+ if ($i->inicio->lower($this->inicio)) {
+ $this->inicio = $i->inicio;
}
return true;
}