Significa che ho 3 diversi costruttori, uno per costruire uno stream bassato su file, uno per la memoria, uno per i socket, modificando opportunamente i campi della union interna, la funzione string_get è un esempio di una funzione nascosta all'interno di un modulo, che serve ad implementare l'estrazione di un byte da una stringa, la funzione stream_get è la funzione che dato un qualsiasi tipo di stream restituisce un byte....

se io scrivo un algoritmo che necessita uno stream, posso poi usarlo sia per lavorare con dati su un file, con dati che arrivano dalla rete o dati letti dalla memoria senza modificare l'algoritmo.

Lo svantaggio rispetto ai template C++ è che qui devo dinamicamente decidere il tipo di dato con cui sto lavorando (lo switch(this->type)), mentre un template C++ è risolto staticamente dal compilatore...., il vantaggio è che ho programmato quasi OOP con il C, ad esempio per una piattaforma senza compilatore C++.