.
Este código se puede traducir fácilmente a ANSI C. su implementanción es facil y es una pequeña practica que me estoy dejando ( Crear varias clases para C/C++, fáciles de usar ).

La clase aun no esta terminada (Esta apenas al 30%, pero ya esta funcional).

Código: Seleccionar todo


#ifndef CLIST_H
#define CLIST_H

#include <stdio.h>
#include "../include/citerator.h"
#include "../include/mutiles.h"


template <class T>
class clist
{
    protected:
        size_t          _szt_ln;        //  Cantidad de elementos en {**__pp_T}
        T               **__pp_T;       //  Datos.
        clist           *__p_link;      //  Puntero con relación a otra lista.
        T               *__p_rT;        //  Vector que contiene ordenada la lista {**__pp_T}.

    private:

        void deleteelement( size_t _szt_index )
        {
            if ( this->_szt_ln==0 ) return;
            if ( this->check( _szt_index )==false ) return;

            T **__pp_T   = this->__pp_T;                                                //  Respaldamos para posteriormente eliminar el vector.
            --this->_szt_ln;
            if ( this->_szt_ln>0 ) {
                this->__pp_T = new T*[this->_szt_ln];
                if ( this->_szt_ln>1 ) {
                    memcicle( &__pp_T[_szt_index] , &__pp_T[this->_szt_ln+1] , -1 , sizeof(T*) );  //  Giramos hacia la izquierda ( esto deja {_szt_index1} en la ultima posicion ).
                }
                memcpy( &this->__pp_T[0] , &__pp_T[0] , this->_szt_ln*sizeof(T*) );     //  Copiamos la cantidad deseada de punteros.
            } else {
                this->__pp_T = NULL;
            }
            delete[] __pp_T;                                                            //  Eliminamos el vector anterior a los punteros.
        }
        size_t addelement( T *_r_T ) {
            T **__pp_T   = this->__pp_T;                                                //  Respaldamos para posteriormente eliminar el vector.
            size_t      _szt_ret = this->_szt_ln++;
            this->__pp_T = new T*[this->_szt_ln];
            if ( _szt_ret>0 ) {
                memcpy( &this->__pp_T[0] , &__pp_T[0] , _szt_ret*sizeof(T*) );          //  Creamos una nueva cantidad de punteros y copiamos.
            }
            delete[] __pp_T;                                                            //  Eliminamos el vector anterior a los punteros.
            this->__pp_T[_szt_ret] = _r_T;                                              //  Apuntamos al elemento.
            return _szt_ret;
        }
        inline bool check   (size_t _szt_index) { if (_szt_index<this->_szt_ln)
                                                    return true; else return false;   }

    public:

        typedef _T_iterator_normal<T , clist>    iterator;

                     clist()    { this->_szt_ln=0; this->__pp_T=NULL; this->__p_link=NULL; this->__p_rT=NULL; }
        virtual     ~clist()    { if ( __pp_T != NULL ) { delete[] __pp_T; } }

        clist      &operator<<( T &__r_it )  { this->add(&__r_it);    return *this; }
        clist      &operator>>( T &__r_it )  {
            iterator _it_ret = this->find( &__r_it );
            if ( _it_ret.reference() !=NULL ) { this->remove(_it_ret.index()); }
            return *this;
        }

        iterator operator[](size_t _szt_index) {
            if ( this->_szt_ln==0 ) {
                iterator _it_ret;
                return _it_ret;
            }
            if ( _szt_index >= this->_szt_ln ) { _szt_index = this->_szt_ln; }
            iterator _it_ret( &this->__pp_T[0] , _szt_index , &this->_szt_ln , this );
            return _it_ret;
        }

        size_t count () { return this->_szt_ln; }
        iterator add    ( T *_p_it ) {
            iterator _it_ret( &this->__pp_T[0] , this->addelement(_p_it) , &this->_szt_ln , this );
            return _it_ret;
        }
        iterator add        ( T **_pp_it ) {}
        size_t remove     ( size_t _szt_index ) { deleteelement(_szt_index); return this->_szt_ln; }

        bool replace        ( size_t _szt_index, T &__r_vT ) { if (this->check(_szt_index)==false) { return false; } this->__pp_T[_szt_index] = &__r_vT; return true; };
        iterator find( T *__p_vT ) {
            size_t _szt_i = 0;
            for(;_szt_i<this->_szt_ln;++_szt_i )
                if ( __p_vT == this->__pp_T[_szt_i] ) {
                    iterator _it_ret( &this->__pp_T[0] , _szt_i , &this->_szt_ln , this );
                    return _it_ret;
                }
            iterator _it_ret( NULL , 0 , NULL , NULL );
            return _it_ret;
        }
        T       *getptr     ( size_t _szt_index ) { return this->check( _szt_index )==true? this->__pp_T[_szt_index] : NULL; }
};

#endif // CLIST_H

Última edición por BlackZeroX el 20 Jun 2011, 23:13, editado 1 vez en total.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
un ejemplo de su uso:

Código: Seleccionar todo


#include <stdio.h>
//#include "include/cbyte.h"
//#include "include/mutiles.h"
#include "include/clist.h"

int main () {
    char s[] ="0123456789";

    clist<char> f;
    clist<char>::iterator _it;

    f << s[0] << s[1] << s[2] << s[3] << s[4] << s[5] << s[6] << s[7] << s[8] << s[9]; // Agregamos Todos estos elementos...
    //f
    _it = f[0];

    fprintf( stdout , "Cantidad de elementos %d\n", _it.reference()->count() );

    f >> s[0] >> s[3] >> s[9]; // Sacamos estos elementos de la colección.
    //_it = f[0];

    fprintf( stdout , "Cantidad de elementos %d\n", _it.reference()->count() );

    fprintf( stdout , "{%d - %d}\t%c\n" , _it.getptr() , _it.index() , (char)*_it );    _it++;
    fprintf( stdout , "{%d - %d}\t%c\n" , _it.getptr() , _it.index() , (char)*_it );    _it++;
    fprintf( stdout , "{%d - %d}\t%c\n" , _it.getptr() , _it.index() , (char)*_it );    _it++;
    fprintf( stdout , "{%d - %d}\t%c\n" , _it.getptr() , _it.index() , (char)*_it );    _it++;
    fprintf( stdout , "{%d - %d}\t%c\n" , _it.getptr() , _it.index() , (char)*_it );    _it++;
    fprintf( stdout , "{%d - %d}\t%c\n" , _it.getptr() , _it.index() , (char)*_it );    _it++;
    fprintf( stdout , "{%d - %d}\t%c\n" , _it.getptr() , _it.index() , (char)*_it );    _it++;
    fprintf( stdout , "{%d - %d}\t%c\n" , _it.getptr() , _it.index() , (char)*_it );    _it++;
    fprintf( stdout , "{%d - %d}\t%c\n" , _it.getptr() , _it.index() , (char)*_it );    _it++;
/*
    _it = _it;
    _it = s[0];
    f << s[4] << s[5] << s[6] << s[7];

    f.remove(11);

    fprintf( stdout , "Cantidad de elementos %d\n", _it.reference()->count() );
    fprintf( stdout , "%c\n", *_it++ );
    fprintf( stdout , "%c\n", *_it++ );
    fprintf( stdout , "%c\n", *_it++ );
    fprintf( stdout , "%c\n", *_it++ );
    fprintf( stdout , "%c\n", *_it++ );
    fprintf( stdout , "%c\n", *_it++ );
    fprintf( stdout , "%c\n", *_it++ );
    fprintf( stdout , "%c\n", *_it++ );
    fprintf( stdout , "%c\n", *_it++ );
    fprintf( stdout , "%c\n", *_it++ );
    fprintf( stdout , "%c\n", *_it++ );
    fprintf( stdout , "%c\n", *_it++ );


    bytes a((const byte*)s, 10);
    bytes b( a.substr( 0 , 10 ) );

    for (bytes::iterator it=b.begin(); it!=b.end(); it++) {
        fprintf( stdout , "%c", (char)*it );
    }
    fprintf( stdout , "\n" );
    for (bytes::reverse_iterator it=b.rbegin(); it!=b.rend(); it++) {
        fprintf( stdout , "%c", (char)*it );
    }
*/
    getchar();
    return 0;

}

Dulces Lunas!¡.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
Buenísimo, solo que veo el código un poco críptico, el de la clase, creo que se podría pulir un poco, pero por su puesto está al 30%, y solo es un prototipo :P
http://kevinsecurity.altervista.org/
KevinSec escribió:Buenísimo, solo que veo el código un poco críptico, el de la clase, creo que se podría pulir un poco, pero por su puesto está al 30%, y solo es un prototipo :P
podrias indicarme que lineas/secciones son las que estan un tanto esbosas?.

Dulces Lunas!¡.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
BlackZeroX escribió:
KevinSec escribió:Buenísimo, solo que veo el código un poco críptico, el de la clase, creo que se podría pulir un poco, pero por su puesto está al 30%, y solo es un prototipo :P
podrias indicarme que lineas/secciones son las que estan un tanto esbosas?.

Dulces Lunas!¡.
Pues aun estoi aprendiendo , pero yo creo que se refiere a que se repite mucho codigo , y segun uno de mis "profesores" si un trozo de codigo se repite muchas veces, es que ahi algo esta mal jejej. No me he parado a leer todo el codigo , pero un for (por ejemplo) para esos printf te ahorra escribir lo mismo tantas veces .

Tambien te has buscado nombres complicados XD
willyf escribió:
BlackZeroX escribió: Pues aun estoi aprendiendo , pero yo creo que se refiere a que se repite mucho codigo , y segun uno de mis "profesores" si un trozo de codigo se repite muchas veces, es que ahi algo esta mal jejej. No me he parado a leer todo el codigo , pero un for (por ejemplo) para esos printf te ahorra escribir lo mismo tantas veces .

Tambien te has buscado nombres complicados XD

El ejemplo si se repite codigo por que intento dar ejemplos limpios, no meti un for por que la vdd no era mi objetivo realmente,

Por otro lado cuando se busca velocidad se deben tomar en consideracion el stack y si es una instruccion que no sobrepasa los 16Bytes de memoria no tiene caso creale un proceso ya que esto conlleva a gastar mas bytes y por ende las llamadas a otras parte de un codigo X son mas lentas... en pocas palabras hay que saber cuando hacer los procesos para las instrucciones X... de lo contrario se alentisa el proceso.

Dulces Lunas!¡.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
Responder

Volver a “Fuentes”