Я чувствую себя плохо, отвечая на мой собственный вопрос, но preocupied меня в течение некоторого времени, и это решение, которое я придумал :
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;
}
работы в предположении, что IStream-х никогда не освобожденным от СВД (и что они живут за счет эксплуатации). Также поддерживается только поддержка istream, для ostream будет выполняться отдельная функция - я знаю, что могу передавать iostream, но это не позволило бы передать istream в функцию преобразования: /.
Любые советы по ошибкам или обновлениям приветствуются.
Вы имеете в виду, что хотите создать структуру RWops из istream? –
хороший намек, я попробую. –
Это не было хитом, я не понимаю, что вы пытаетесь сделать. –