Подскажите, как правильно спроектировать
От: Saby  
Дата: 05.11.10 02:49
Оценка:
В принципе недавно сделал свой велосипед архива
Есть у меня такой мега класс — 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.
В данной ситуации ума не приложу, как поступить . Всю ночь сижу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.