2013-11-08 2 views
4

Можно ли использовать boost::circular_buffer с boost::asio?Чтение данных в круговой буфер

В частности, я хочу прочитать фиксированное количество байтов с boost::asio::async_write и хранить их непосредственно в кольцевом буфере без копирования.

Некоторый пример кода был бы очень приятным!

+2

да, вы можете. Некоторый пример кода был бы приятным. – Theolodis

+1

Посмотрите на следующих членов 'circle_buffer': [' array_one'] (http://www.boost.org/doc/libs/1_54_0/libs/circular_buffer/doc/circular_buffer.html#classboost_1_1circular__buffer_1957cccdcb0c4ef7d80a34a990065818d), ['array_two'] (http://www.boost.org/doc/libs/1_54_0/libs/circular_buffer/doc/circular_buffer.html#classboost_1_1circular__buffer_1f5081a54afbc2dfc1a7fb20329df7d5b), ['rotate'] (http://tinyurl.com/lmg2axt) и [' линеаризовать '] (http://tinyurl.com/kv5tddl). Вы можете использовать 'array_one()' и 'array_two()' для получения внутренних буферов (срезы одного большого буфера) и для них «boost :: asio :: buffer». –

+0

Спасибо @EvgenyPanasyuk за эти намеки. Я попробую в понедельник, если я смогу заставить его работать с изменяемой последовательностью буфера, состоящей из 'array_one' и' array_two'. –

ответ

0

По состоянию на сейчас (увеличить 1,66), это не возможно, чтобы прочитать данных в boost::circular_buffer, потому что он не раскрывает никакого способа резервировать места в базовом буфере, который является необходимым условием для создания mutable_buffer, необходимых для позвоните по телефону asio::read.

Но можно написать из boost::circular_buffer:

boost::circular_buffer<char> cir_buf; 

    FillBuffer(cir_buf); 

    // Construct a buffer sequence with either 1 or 2 data chunks 
    std::vector<boost::asio::const_buffer> buffer_sequence; 

    auto arr1 = cir_buf.array_one(); 
    buffer_sequence.push_back(boost::asio::buffer(arr1.first, arr1.second)); 

    auto arr2 = cir_buf.array_two(); 
    if (arr2.second != 0) { 
    buffer_sequence.push_back(boost::asio::buffer(arr2.first, arr2.second)); 
    } 

    boost::asio::write(socket_, buffer_sequence); 
Смежные вопросы