From 35d673c897d35a9b95dae93cd289c46e6c53e646 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Thu, 29 Apr 2004 23:06:08 +0000 Subject: [PATCH] Se modifica Intervalo::seSuperpone() para que no tome como superpuestos a intervalos adyacentes y se hace un metodo Intervalo::esAdyacente() para hacer ese chequeo. --- lib/MECON/Tiempo/Banda.php | 2 +- lib/MECON/Tiempo/Intervalo.php | 48 ++++++++++++++++++++++++---------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/lib/MECON/Tiempo/Banda.php b/lib/MECON/Tiempo/Banda.php index fefffaf..a235e03 100644 --- a/lib/MECON/Tiempo/Banda.php +++ b/lib/MECON/Tiempo/Banda.php @@ -263,7 +263,7 @@ class MECON_Tiempo_Banda { // 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) { diff --git a/lib/MECON/Tiempo/Intervalo.php b/lib/MECON/Tiempo/Intervalo.php index 3fff5b4..c20c7d8 100644 --- a/lib/MECON/Tiempo/Intervalo.php +++ b/lib/MECON/Tiempo/Intervalo.php @@ -115,38 +115,58 @@ class MECON_Tiempo_Intervalo { 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: + *
+     *       A            B
+     * |-----------|------------|  Adyacentes
+     *
+     *       A              B
+     * |-----------|   |--------|  No adyacentes
+     * 
+ * @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; } -- 2.43.0