internal Nodo(int orden, int posicion, int padre, IGaseosasTamañoTextoFijo <T> gaseosa) { if ((orden < OrdenMinimo) || (orden > OrdenMaximo)) { throw new ArgumentException("No es valido el tamaño"); } if (posicion < 0) { throw new ArgumentOutOfRangeException("Posicion invalida"); } Orden = orden; Posicion = posicion; Padre = padre; LimpiarNodo(gaseosa); }
private void LimpiarNodo(IGaseosasTamañoTextoFijo <T> gaseosas) { Hijos = new List <int>(); for (int i = 0; i < Orden; i++) { Hijos.Add(Utilidades.apuntadoVacio); } Llaves = new List <string>(); for (int i = 0; i < Orden - 1; i++) { Llaves.Add("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); } Datos = new List <T>(); for (int i = 0; i < Orden - 1; i++) { Datos.Add(gaseosas.CreateNulo()); } }
public ArbolBAsterisk(int orden, string nombreArchivo, IGaseosasTamañoTextoFijo <T> bebidas) { _archivoNombre = nombreArchivo; _gaseosa = bebidas; _archivo = new FileStream(_archivoNombre, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read); _raiz = Utilidades.LeerEntero(_archivo, 0); _ultimaPosicionLibre = Utilidades.LeerEntero(_archivo, 1); Tamaño = Utilidades.LeerEntero(_archivo, 2); Orden = Utilidades.LeerEntero(_archivo, 3); Altura = Utilidades.LeerEntero(_archivo, 4); if (_ultimaPosicionLibre == Utilidades.apuntadoVacio) { _ultimaPosicionLibre = 0; } if (Tamaño == Utilidades.apuntadoVacio) { Tamaño = 0; } if (Orden == Utilidades.apuntadoVacio) { Orden = orden; } if (Altura == Utilidades.apuntadoVacio) { Altura = 1; } if (_raiz == Utilidades.apuntadoVacio) { Nodo <T> nodoCabeza = new Nodo <T>(Orden, _ultimaPosicionLibre, Utilidades.apuntadoVacio, _gaseosa); _ultimaPosicionLibre++; _raiz = nodoCabeza.Posicion; nodoCabeza.GuardarNodoEnDisco(_archivo, _tamañoEncabezadoBinario); } GuardarEncabezado(); }
internal void LimpiarNodoEnDisco(FileStream archivo, int tamañoEncabezado, IGaseosasTamañoTextoFijo <T> gaseosas) { LimpiarNodo(gaseosas); GuardarNodoEnDisco(archivo, tamañoEncabezado); }
internal static Nodo <T> LeerNodoDesdeDisco(FileStream archivo, int tamañoEncabezado, int orden, int posicion, IGaseosasTamañoTextoFijo <T> gaseosas) { if (archivo == null) { throw new ArgumentNullException("archivo"); } if (tamañoEncabezado < 0) { throw new ArgumentOutOfRangeException("tamañoEncabezado"); } if ((orden < OrdenMinimo) || (orden > OrdenMaximo)) { throw new ArgumentOutOfRangeException("orden"); } if (posicion < 0) { throw new ArgumentOutOfRangeException("posicion"); } if (gaseosas == null) { throw new ArgumentNullException("fabrica"); } Nodo <T> nuevoNodo = new Nodo <T>(orden, posicion, 0, gaseosas); byte[] datosBinario = new byte[nuevoNodo.TamañoEnBytes]; string datosCadena = ""; string[] datosSeparados = null; int PosicionEnDatosCadena = 1; archivo.Seek(nuevoNodo.CalcularPosicionEnDisco(tamañoEncabezado), SeekOrigin.Begin); archivo.Read(datosBinario, 0, nuevoNodo.TamañoEnBytes); datosCadena = Utilidades.ConvertirBinarioYTexto(datosBinario); datosCadena = datosCadena.Replace(Utilidades.TextoNuevaLinea, ""); datosCadena = datosCadena.Replace("".PadRight(3, Utilidades.TextoSeparador), Utilidades.TextoSeparador.ToString()); datosSeparados = datosCadena.Split(Utilidades.TextoSeparador); nuevoNodo.Padre = Convert.ToInt32(datosSeparados[PosicionEnDatosCadena]); PosicionEnDatosCadena++; for (int i = 0; i < nuevoNodo.Hijos.Count; i++) { nuevoNodo.Hijos[i] = Convert.ToInt32(datosSeparados[PosicionEnDatosCadena]); PosicionEnDatosCadena++; } for (int i = 0; i < nuevoNodo.Llaves.Count; i++) { nuevoNodo.Llaves[i] = datosSeparados[PosicionEnDatosCadena]; PosicionEnDatosCadena++; } for (int i = 0; i < nuevoNodo.Datos.Count; i++) { datosSeparados[PosicionEnDatosCadena] = datosSeparados[PosicionEnDatosCadena].Replace(Utilidades.TextoSustitutoSeparador, Utilidades.TextoSeparador); nuevoNodo.Datos[i] = gaseosas.Create(datosSeparados[PosicionEnDatosCadena]); PosicionEnDatosCadena++; } return(nuevoNodo); }