Chunked input stream
-
Ich habe einen vector mit bestimmten Datenstrukturen, die u.a. byte arrays enthalten. Über diese byte arrays würde ich gern eine istream Schnittstelle anbieten. Die Daten liegen nicht zusammenhängend im Speicher, deswegen "chunked".
Ich könnte von streambuf ableiten, aber das will ich nicht, weil dann müsste ich die Daten kopieren, und darauf würde ich gern verzichten. Gibts da schon was mehr oder weniger fertiges?
-
Bist du gegenüber Boost abgeneigt?* Die read-Funktion müsste für dich einfach zum implementieren sein, weil du entscheiden darfst, wie viel du liest. Das Kopieren übernimmt Boost für dich.
^* Die Dokumentation ist ein Frameset auf das man nicht richtig verlinken kann! Was sind das nur für Leute bei Boost ...^
-
Mit boost hätte ich kein Problem, benutze das eh schon. Kenn mich mit boost iostreams kaum aus, hab aber auf die Schnelle nichts gesehen, was ohne Kopien auskommt.
Auf das Kopieren würde ich aus Performancegründen verzichten wollen. Kann sein, dass ich die Streams jeweils kurzfristig erstelle, um paar Daten zu lesen, da will ich nicht ständig die Daten rumkopieren.
-
Andere Ideen/Vorschläge?
-
Was heißt denn hier "Kopieren"? Ohne deinen Lösungsansatz zu sehen, kann ich nichts Sinnvolles dazu sagen.
-
TyRoXx schrieb:
Was heißt denn hier "Kopieren"?
Naja, streambuf hantiert mit paar Zeigern rum. Damit kann man nicht nahtlos verschiedene Speicherbereiche als einen Speicherblock abdecken. Wenn ich das richtig sehe, müsste ich für streambuf also die Daten wieder in einen einzigen Speicherblock zusammenkopieren. Zwar erst bei Bedarf und nicht alle auf einmal, aber sobald ein Block zu Ende geht, kann ich die internen Zeiger nicht einfach auf den nächsten Block zeigen lassen, sonst wär der vorhergehende nicht mehr zugreifbar.
-
Mechanics schrieb:
Naja, streambuf hantiert mit paar Zeigern rum. Damit kann man nicht nahtlos verschiedene Speicherbereiche als einen Speicherblock abdecken. Wenn ich das richtig sehe, müsste ich für streambuf also die Daten wieder in einen einzigen Speicherblock zusammenkopieren. Zwar erst bei Bedarf und nicht alle auf einmal, aber sobald ein Block zu Ende geht, kann ich die internen Zeiger nicht einfach auf den nächsten Block zeigen lassen, sonst wär der vorhergehende nicht mehr zugreifbar.
Das siehst Du falsch. Du musst die Daten nicht zusammenkopieren. Schau Dir die Methoden von std::streambuf nochmal an.
Du setzt die get-Zeiger auf den ersten chunk und bei jedem Aufruf von underflow auf den nächsten.
-
Ok, ich habs mit boost::iostreams und einem eigenen Device gemacht. Ich glaub, da werden die Daten auch nicht kopiert. Kann ich aber noch nicht testen, weil das drumherum noch nicht passt.