• [^] # Re: ==

    Posté par . En réponse au journal OSv : l'OS pour les nuages. Évalué à 7.

    Une variante du void*.

    L'idée c'est un truc du genre

    struct my_custom {
     struct rb_node rbnode;
     ...
     // other fields
    };

    On insère les rbnode dans l'arbre avec un rb_insert. Et on utilise la macro magique container_of pour récupérer l'adresse de my_custom en faisant un truc du genre

    container_of(ptr, struct my_custom, rbnode);

    Évidemment, à ce moment, si quelqu'un a introduit un truc qui n'est pas de type my_custom dans le rbtree, ça va faire n'importe quoi. Et il n'y a rien qui l'empêche (à par la vigilance des reviewers).

    Pour info, container_of, c'est

    #define container_of(ptr, type, member) ({ \
     const typeof( ((type *)0)->member ) *__mptr = (ptr); \
     (type *)( (char *)__mptr - offsetof(type,member) );})

    Je n'irai pas jusqu'à dire que c'est une solution simple :) Élégante peut être pour une certaine définition de l'élégance. Mais clairement pas type-safe là ou on pourrait "sans problème" avoir une solution type-safe en C++.