Как лучше всего разделять объект stream между разными частями библиотечного кода?
Вопрос: как разделять объект класса по работе со стримом (поток байтов) между разными частями библиотечного кода? Во всех этих частях кода нужно иметь возможность изменять стрим.
Такая же проблема о разделении стрима по библиотечному коду встречается и при разработке библиотеки логирования подобной log4j архитектуре. Когда имеется только один файл, но при этом различные уровни, к примеру такой: 'com.supersite.componentname.applicationname'.
UPD
Пишу библиотеку по работе с PE-форматом. Для работы как с 32- так и 64-битными образами. Образы бывают файловые (на диске, флешке) и виртуальные (процесс запущен на выполнение).
Мне надо:
- получать доступ по чтению к уже существующей в образе информации;
- добавлять новую информацию в образ;
- удалять\изменять существующую информацию из\в образа\зе.
Я не хочу привязываться к файлу или памяти и поэтому решил работать с интерфейсом стрима. В текущий момент времени сделано так:
template<typename arch_type>
class Image {
public:
Image(std::iostream& stream_) : stream(stream_) {}
std::iostream& getStream() const { return stream; }
const IMAGE_EXPORT_DIRECTORY& getExportDirHeader() const { return exportDirHeader; }
const ImportDescriptors_t& getImportDirHeaders() const { return importDirDescriptors; }
private:
std::iostream& stream;
IMAGE_EXPORT_DIRECTORY exportDir;
ImportDescriptors_t importDirDescriptors;
}
Это минимальный интерфейс класса, есть еще с десяток методов. Также есть другие методы по работе с экспортом, импортом, баундом и др. концепциями, которые возвращают подробности, т.е. список экспортируемых\импортируемых элементов их rva, названия и др. полезные детали.
Пока все выглядит так:
using namespace PE;
using namespace std;
ifstream stream("calc.exe");
Image<arch32> image(stream);
Export::Details exportDetails;
fillDetails(image, &exportDetails);
Import::Details importDetails;
fillDetails(image, &importDetails);
Другими словами:
- Перед использованием класса Image создаю стрим и передаю в объект Image.
- Каждая функция, которой что-то надо сделать с Image, к примеру вытащить информацию об TLS-калбаках, она берет объект Image, а в своем коде, когда надо использовать стрим, она вызывает getStream().
Получается, что у меня происходит "растекание стрима" по всему библиотечному коду!
Мне это "растекание стрима" очень и очень мешает реализовать фичу.