18 Temmuz 2016 Pazartesi

boost iostreams kütüphanesi

Boost iostreams sınıfları ile ilgili notlarım aşağıda. Bu kütüphane sadece header dosyalarından oluşmuyor. Linklemek için şöyle yaparız.
g++ -std=c++11 -Wall -Wextra -g ... -lboost_iostreams
Device Kavramı
Device nesnesi stream tarafından içine veri yazmak veya içinden veri okumak için kullanılıyor. Boost device kavramını daha da özelleştirerek Sink, Source gibi alt kavramlara da bölmüş. Ben bu detaylara girmeyeceğim.

back_insert_device
Bir çeşit inserter. Vector nesnesine yazmak için kullanılır.
typedef std::vector< char > Buffer;
Buffer buffer;

typedef boost::iostreams::back_insert_device< Buffer > Device;
Device device(buffer);
Array Device Sınıfları
boost iostreams array_device yazısına taşıdım.

Memory Mapped File Device Sınıfları
boost iostreams memory mapped device yazısına taşıdım

Sıkıştırma Sınıfları
bzip2, zlib ve gzip için sıkıştırma ve açma sınıfları var. Bunlar

* bzip2_compressor, bzip2_decompressor
* zlip_compressor,    zlib_decompressor
* gzip_compressor,   gzip_decompressor

sınıfları. Ayrıca Sıkıştırma başlıklı yazıya bakabilirsiniz.

zlib sıkıştırması şöyle yapılır.
using namespace boost::iostreams;

std::vector<char> out;
char* data = ...
size_t size = ...
filtering_ostream os;
os.push(zlib_compressor());
os.push(io::back_inserter(out));

io::write (os,data,size);
zlib'i açmak için şöyle yapılır.
using namespace boost::iostreams;

std::vector<char> out;
char* data = ...
size_t size = ...
filtering_istream is;
is.push(zlib_decompressor());
is.push(io::array_source(data,size));

io::copy (is,io::back_inserter(out));
bzip'i açmak için şöyle yapılır.
#include <boost/iostreams/filter/bzip2.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
ifstream file (file_name);
boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
in.push(boost::iostreams::bzip2_decompressor());
in.push(file);

Diğer Yardımcı Sınıflar


file_descriptor
Bu sınıf POSIX ile açılan bir  file descriptor tipini sınıf olarak kullanmamızı sağlar. fdopen() metoduna benziyor.
namespace io = boost::iostreams;

int fd = mkstemp("foo");
if (fd == -1) throw something;

io::file_descriptor device(fd);
io::stream<io::file_descriptor> stream(device);

stream << 42;
seek
seek metodu neden stream sınıfının bir metodu değil bilmiyorum. Ancak metod şöyle kullanılıyor.
namespace io = boost::iostreams;

char buffer[4096]; 
io::stream<io::basic_array<char> > source(buffer, buffer_size); 

boost::archive::binary_oarchive oa(source); 
oa << serializable_object;  

// move current stream position to the end, io::seek() returns new position 
std::cout << "Bytes written: " 
          << io::seek(source, 0, std::ios_base::end) 
          << std::endl;

Generic stream sınıfı
Stream sınıfı Device'a yazar veya okurlar. Bu sınıf STL stream sınıfından kalıtır. STL'deki gibi istream, ostream şeklinde ayrı ayrı sınıflar yok. Sadece bir tane generic stream sınıfı var.
io::stream is either derived from std::basic_istream or std::basic_ostream or both std::basic_iostream) dependent on the underlying device category
Bu yüzden STL algoritmaları ile kullanılabilir. String'i device olarak kullan bir stream şöyle
#include <string>
#include <boost/iostreams/stream.hpp>
#include <libs/iostreams/example/container_device.hpp> // container_sink

namespace io = boost::iostreams;
namespace ex = boost::iostreams::example;
typedef ex::container_sink<std::wstring> wstring_sink;
struct my_boost_ostr : public io::stream<wstring_sink> {
    typedef io::stream<wstring_sink> BaseT;
    std::wstring result;
    my_boost_ostr() : BaseT(result)
    { }

    // Note: This is non-const for flush.
    // Suboptimal, but OK for this test.
    const wchar_t* c_str() {
        flush();
        return result.c_str();
    }
};

filtering_ostream
stream'e yazılan veriyi filtreden geçirir. filtreler push metodu ile eklenir. Birinci  eklenen filtre ilk çalıştırılır.
namespace io = boost::iostreams; //<-- good practice
typedef std::vector<char> buffer_t;

void CompressionUtils::Inflate(const buffer_t &compressed,
                               buffer_t &decompressed)
{
    io::filtering_ostream os;

    os.push(io::gzip_decompressor());
    os.push(io::back_inserter(decompressed));

    io::write(os, &compressed[0], compressed.size());
}

stream_buffer
Boost sınıfı ile gelen stream_buffer nesnesi std::basic_streambuf nesnesinden türemekte ve bir stream'i istenilen herhangi bir başka sink'e yönlendirmekte kullanılmakta.


stream_buffer device nesnesine de yazabilir.
typedef std::vector< uint8_t > Buffer;
Buffer buffer;

typedef boost::iostreams::back_insert_device< Buffer > Device;
Device device(buffer);

typedef boost::iostreams::stream_buffer< Device > Stream;
Stream stream(device);
filtering_streambuf
Buf nesnesi hazırlandıktan sonra bir stream'e verilir.

seekable_filter
Şöyle yaparız.

Hiç yorum yok:

Yorum Gönder