2012-08-15 29 views
6

In termini astratti, una pipe è un contenitore di flusso/FIFO con una lettura distruttiva. Ha un metodo read() che copia blocchi di dati tutti in una volta e funziona come get e put per singoli byte. Quando viene restituito lo read o get, i dati che sono stati copiati dalla pipe vengono rimossi dal buffer interno della pipe, diversamente da un file o da qualsiasi altro tipo di contenitore.Esiste una classe STL C++ che funziona come una pipe?

La maggior parte (tutti?) Dei contenitori STL non fornisce un comando simile read() in un buffer. Esiste un tipo di contenitore di tipo fifo con un membro pop_many()?

stringstream è la cosa più vicina a cui riesco a pensare poiché mantiene un puntatore interno di lettura e le future letture si bloccheranno fino a quando il flusso non si riempie nuovamente. Il contenitore è vuoto dal punto di vista dell'API, ma i dati consumati dovrebbero essere raccolti manualmente.

Esiste un contenitore o una classe di flusso equivalente in C++ che esegue questa operazione o si tratta di eseguire il roll-your-own (come nell'esempio stringstream)?

+4

forse una coda? – Gir

+2

Potrei inserire un loop attorno a queue.pop(), ma non è efficiente. Voglio essere in grado di rimuovere grandi blocchi di dati e la coda/fifo si ridimensiona automaticamente dopo averli rimossi. –

+2

Per cosa ti serve? –

risposta

1

I commenti hanno già menzionato std::deque che a prima vista sembra essere la scelta migliore.

Se ciò non funziona, utilizzare std::list<std::vector<unsigned char> >. Metti pezzi su un vettore alla volta e li aggiungi a splice in un altro elenco quando stai spuntando. Dovresti fornire una piccola quantità di codice wrapper comodo, e questo potrebbe non essere sufficiente se tu non vuoi leggere tutti gli elementi di uno dei sub-vettori contemporaneamente.

+0

Fondamentalmente l'API funziona in questo modo: l'utente attende il descrittore di file per un messaggio, quando arriva il messaggio chiamano i metodi Read per ottenere il primo byte per determinare il tipo di messaggio (e quindi la lunghezza del resto del messaggio), quindi passare l'oggetto e varie parti dell'applicazione utilizzano il metodo Read per leggere i dati in un buffer char *. Quindi, per ora, sto guardando 'std :: stringstream' perché mi dà un metodo di lettura (char *, int), e decrementa automaticamente un puntatore get. Fornisce anche un metodo readsome() che non blocca se l'applicazione tenta di leggere più dati. –

+0

BTW, Non la mia API. Non lo farei mai in questo modo! –

Problemi correlati