X-Git-Url: https://git.llucax.com/mecon/meconlib.git/blobdiff_plain/d374755a39b0fc94d14a25590acea0a3f5ce6633..c0cc0ddabd54d39b68079ef97f414b799211aa67:/lib/MECON/Tiempo/Intervalo.php diff --git a/lib/MECON/Tiempo/Intervalo.php b/lib/MECON/Tiempo/Intervalo.php index 01a005d..0cc2068 100644 --- a/lib/MECON/Tiempo/Intervalo.php +++ b/lib/MECON/Tiempo/Intervalo.php @@ -59,15 +59,14 @@ class MECON_Tiempo_Intervalo { * fin es anterior a la de inicio. * */ - function MECON_Tiempo_Intervalo( $inicio = null, $fin = null, $chequear = true ) { - if (is_null($inicio)) + function MECON_Tiempo_Intervalo($inicio = null, $fin = null, $chequear = true) + { + if (!$inicio) { $inicio = new MECON_Tiempo_Hora; - if (is_null($fin)) + } + if (!$fin) { $fin = new MECON_Tiempo_Hora; - if(!is_a($inicio, 'mecon_tiempo_hora')) - return false; - if(!is_a($fin, 'mecon_tiempo_hora')) - return false; + } $this->inicio = $inicio; $this->fin = $fin; if ($chequear) { @@ -75,7 +74,8 @@ class MECON_Tiempo_Intervalo { } } - function _chequear() { + function _chequear() + { $a = $this->fin; if($a->lower($this->inicio)) { $tmp = $this->fin; @@ -84,13 +84,12 @@ class MECON_Tiempo_Intervalo { } } - function invertido() { + function invertido() + { return $this->fin->lower($this->inicio); } - function setInicio( $inicio ) { - if(! is_a($inicio, 'mecon_tiempo_hora')) - return false; + function setInicio($inicio) { $this->inicio = $inicio; $this->_chequear(); } @@ -102,59 +101,86 @@ class MECON_Tiempo_Intervalo { * @param var $fin * */ - function setFin( $fin ) { - if(! is_a($fin,'mecon_tiempo_hora')) - return false; + function setFin($fin) + { $this->fin = $fin; $this->_chequear(); } - function getDuracion() { + function getDuracion() + { $c = new MECON_Tiempo_Hora; $c->copy($this->fin); $c->subtract($this->inicio); 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. - function seSuperpone( $intervalos ) { - if (!is_array($intervalos)) + /** + * 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 (is_a($i, 'mecon_tiempo_intervalo')) { - if ($i->fin->greaterEqual($this->inicio) && - $this->fin->greaterEqual($i->inicio)) - return true; - if ($this->fin->greaterEqual($i->inicio) && - $i->fin->greaterEqual($this->inicio)) - return true; + if ($i->fin->greater($this->inicio) && $this->fin->greater($i->inicio)) { + return true; + } + if ($this->fin->greater($i->inicio) && $i->fin->greater($this->inicio)) { + return true; } } return false; } - function fusionar( $f ) { - if(! is_a($f, 'mecon_tiempo_intervalo')) - return false; - if(! $this->seSuperpone( $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 ($intervalo->fin->equal($this->inicio) || $this->fin->equal($intervalo->inicio)) { + return true; + } + return false; + } + + function fusionar($i) + { + if (!$this->seSuperpone($i) && !$this->esAdyacente($i)) { return false; - if($f->fin->greater($this->fin)) - $this->fin = $f->fin; - if($f->inicio->lower($this->inicio)) - $this->inicio = $f->inicio; + } + if ($i->fin->greater($this->fin)) { + $this->fin = $i->fin; + } + if ($i->inicio->lower($this->inicio)) { + $this->inicio = $i->inicio; + } return true; } - function superponer( $i ) { - if(! is_a($i, 'mecon_tiempo_intervalo')) - return false; + function superponer($i) + { $inicio = $this->inicio; $fin = $this->fin; - if($this->inicio->lower($i->inicio)) + if ($this->inicio->lower($i->inicio)) { $inicio = $i->inicio; - if($this->fin->greater( $i->fin )) + } + if ($this->fin->greater($i->fin)) { $fin = $i->fin; + } $fin->subtract($inicio); return $fin; } @@ -168,14 +194,13 @@ class MECON_Tiempo_Intervalo { * * @return object Intervalo Intervalo anterior al punto de corte. */ - function cortar($c) { + function cortar($c) + { if(is_a($c, 'mecon_tiempo_hora')) { return $this->cortarHora($c); - } - elseif (is_a($c, 'mecon_tiempo_intervalo')) { + } elseif (is_a($c, 'mecon_tiempo_intervalo')) { return $this->cortarIntervalo($c); - } - else { + } else { return false; } } @@ -188,9 +213,8 @@ class MECON_Tiempo_Intervalo { * * @return object Intervalo Intervalo anterior a la hora de corte. */ - function cortarHora($h) { - if (!is_a($h, 'mecon_tiempo_hora')) - return false; + function cortarHora($h) + { $class = get_class($this); $r = new $class; $r->copy($this); @@ -215,9 +239,8 @@ class MECON_Tiempo_Intervalo { * * @return object Intervalo Intervalo anterior al intervalo de corte. */ - function cortarIntervalo($i) { - if (!is_a($i, 'mecon_tiempo_intervalo')) - return false; + function cortarIntervalo($i) + { $ant = $this->cortarHora($i->inicio); $this->cortarHora($i->fin); return $ant; @@ -227,21 +250,18 @@ class MECON_Tiempo_Intervalo { return 'inicio: ' . $this->inicio->format() . ' | fin: ' . $this->fin->format(); } - function copy($int = null) { - if (!(is_a($int, 'mecon_tiempo_intervalo'))) - return false; - $this->inicio = new MECON_Tiempo_Hora($int->inicio->get - ()); - $this->fin = new MECON_Tiempo_Hora($int->fin->get - ()); + function copy($i) + { + $this->inicio = $i->inicio->__clone(); + $this->fin = $i->fin->__clone(); return true; } - function __clone() { + function __clone() + { $class = get_class($this); $i = new $class; - $i->inicio = $this->inicio->__clone(); - $i->fin = $this->fin->__clone(); + $i->copy($this); return $i; }