В принципе недавно сделал свой велосипед архива
Есть у меня такой мега класс — Pack, который в зависимости от переданной в конструктор строки (путь к директории или путь к файлу) создает требуемый пак (shared_ptr< PackBase >)
Есть два типа архива, наследуемых от интерфейса PackBase — PackArchive/PackFileSystem.
Поскольку в архиве вполне могут лежать файлы, сжатые разными алгоритмами, то есть у меня на этот случай интерфейс PackStreamBase. От него наследуются LZMAPackStream, ZIPPackStream и NonPackedPackStream.
Соответственно "юзверь"-программист (то бишь йа

) может создавать Pack, и указывая, какой файл оттуда выдрать, вне зависимсоти от типа архива получает нужный StreamPtr на файл.
Дабы не быть голословным и чуть прояснить ситуацию
namespace pack
{
class PackBase;
class PackStreamBase;
class Pack
: private boost::noncopyable
{
private:
Pack() {}
boost::shared_ptr< PackBase > pack_;
public:
explicit Pack( const wchar_t* fullpath );
~Pack() {}
bool isRelativePathExist( const char* relativePath );
boost::shared_ptr< PackStreamBase > createStreamPtr( const char* relativePath );
};
} // namespace pack
Теперь переделываю тыренный SoundManager под свои нужды.
То есть запихиваю туда интерфейс PackStream'а.
// Лишнее удалено
namespace sound
{
class PackStreamBase;
class OggSoundData
: public BaseSoundData
{
private:
OggSoundData() {}
boost::shared_ptr< PackStreamBase > packStream_;
static size_t read( void *ptr, size_t size, size_t nmemb, void *dataSource );
public:
OggSoundData( boost::shared_ptr< PackStreamBase > packStream );
virtual ~OggSoundData() {}
};
} // namespace sound
Теперь вопрос: — что делать со структурой ov_callback?
http://www.xiph.org/vorbis/doc/vorbisfile/datastructures.html
Ее функции имеют вид типа
read( void *ptr, size_t size, size_t nmemb, void *dataSource )
где требуется из указателя void* вновь получать нужный нам PackStream.
В данной ситуации ума не приложу, как поступить

. Всю ночь сижу
Забыл нужный namespace поставить
Йэээххх

— тему можно удалять