Je me sens mal répondre à ma propre question, mais il me preocupied pendant un certain temps, et c'est la solution que je suis venu avec :
int istream_seek(struct SDL_RWops *context, int offset, int whence)
{
std::istream* stream = (std::istream*) context->hidden.unknown.data1;
if (whence == SEEK_SET)
stream->seekg (offset, std::ios::beg);
else if (whence == SEEK_CUR)
stream->seekg (offset, std::ios::cur);
else if (whence == SEEK_END)
stream->seekg (offset, std::ios::end);
return stream->fail() ? -1 : stream->tellg();
}
int istream_read(SDL_RWops *context, void *ptr, int size, int maxnum)
{
if (size == 0) return -1;
std::istream* stream = (std::istream*) context->hidden.unknown.data1;
stream->read((char*)ptr, size * maxnum);
return stream->bad() ? -1 : stream->gcount()/size;
}
int istream_close(SDL_RWops *context)
{
if (context) {
SDL_FreeRW(context);
}
return 0;
}
SDL_RWops *SDL_RWFromIStream(std::istream& stream)
{
SDL_RWops *rwops;
rwops = SDL_AllocRW();
if (rwops != NULL)
{
rwops->seek = istream_seek;
rwops->read = istream_read;
rwops->write = NULL;
rwops->close = istream_close;
rwops->hidden.unknown.data1 = &stream;
}
return rwops;
}
Fonctionne sous les hypothèses qui ne sont jamais IStream de libéré par SDL (et qu'ils vivent à travers l'opération). De plus, seul le support istream est en place, une fonction séparée serait faite pour ostream - je sais que je pourrais passer iostream, mais cela ne permettrait pas de passer un istream à la fonction de conversion: /.
Tous les conseils sur les erreurs ou les mises à niveau sont les bienvenus.
Vous voulez créer une structure RWops à partir d'un istream? –
bon indice, je vais l'essayer. –
Ce n'était pas un succès, je ne comprends pas ce que vous essayez de faire. –