boost::circular_buffer
От: gpepsi  
Дата: 30.07.11 09:31
Оценка:
нужно создать циклический буфер, в который можно было бы класть блоки данных (например по 5 байт) и
чтобы можно было бы обращаться к контейнеру как к блоку памяти.
То есть чтоб данные лежали как в векторе.

Можно ли это сделать это с помощью boost::circular_buffer ?

З.Ы. Если нет, то есть ли какой другой подходящий контейнер ?
Re: Вопрос по дизайну
От: jerry_ru  
Дата: 31.07.11 10:55
Оценка:
Здравствуйте, gpepsi, Вы писали:

G>нужно создать циклический буфер, в который можно было бы класть блоки данных (например по 5 байт) и

G>чтобы можно было бы обращаться к контейнеру как к блоку памяти.

Если буффер круговой то "как к блоку" нельзя никак(особенно на концах).

Как к блоку можно к элементам буффера(например если они сами вектора). И boost — да поможет.
Re[2]: Вопрос по дизайну
От: TheBeard Россия  
Дата: 01.08.11 07:12
Оценка:
G>>нужно создать циклический буфер, в который можно было бы класть блоки данных (например по 5 байт) и
G>>чтобы можно было бы обращаться к контейнеру как к блоку памяти.

_>Если буффер круговой то "как к блоку" нельзя никак(особенно на концах).


Если элементом буфера будет "блок", а не байт, то почему нет? Ограничение — размер блока должен быть постоянным.

_>Как к блоку можно к элементам буффера(например если они сами вектора). И boost — да поможет.


Буст удобнее, согласен. Надо только проверить, не будет ли проблем с выравниванием.
Re[3]: Вопрос по дизайну
От: gpepsi  
Дата: 01.08.11 07:15
Оценка:
Здравствуйте, TheBeard, Вы писали:

G>>>нужно создать циклический буфер, в который можно было бы класть блоки данных (например по 5 байт) и

G>>>чтобы можно было бы обращаться к контейнеру как к блоку памяти.

_>>Если буффер круговой то "как к блоку" нельзя никак(особенно на концах).


TB>Если элементом буфера будет "блок", а не байт, то почему нет? Ограничение — размер блока должен быть постоянным.


так что — это реально ?
Только не понятно как

_>>Как к блоку можно к элементам буффера(например если они сами вектора). И boost — да поможет.


TB>Буст удобнее, согласен. Надо только проверить, не будет ли проблем с выравниванием.
Re[4]: Вопрос по дизайну
От: Ytz https://github.com/mtrempoltsev
Дата: 01.08.11 07:20
Оценка:
Здравствуйте, gpepsi, Вы писали:

TB>>Если элементом буфера будет "блок", а не байт, то почему нет? Ограничение — размер блока должен быть постоянным.


G>так что — это реально ?

G>Только не понятно как


boost::ptr_circular_buffer<std::vector>
Re[5]: Вопрос по дизайну
От: gpepsi  
Дата: 01.08.11 07:23
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>Здравствуйте, gpepsi, Вы писали:


TB>>>Если элементом буфера будет "блок", а не байт, то почему нет? Ограничение — размер блока должен быть постоянным.


G>>так что — это реально ?

G>>Только не понятно как


Ytz>
Ytz>boost::ptr_circular_buffer<std::vector>
Ytz>



это для объектов. Но блоки будут созданы вектором на куче, а не в литом блоке памяти.
Re[6]: Вопрос по дизайну
От: Ytz https://github.com/mtrempoltsev
Дата: 01.08.11 07:39
Оценка:
Здравствуйте, gpepsi, Вы писали:

G>Здравствуйте, Ytz, Вы писали:


Ytz>>Здравствуйте, gpepsi, Вы писали:


TB>>>>Если элементом буфера будет "блок", а не байт, то почему нет? Ограничение — размер блока должен быть постоянным.


G>>>так что — это реально ?

G>>>Только не понятно как


Ytz>>
Ytz>>boost::ptr_circular_buffer<std::vector>
Ytz>>



G>это для объектов. Но блоки будут созданы вектором на куче, а не в литом блоке памяти.


Не могу представить для чего тебе это надо, но на тебе "литой" блок:


const size_t BLOCK_SIZE = 1024;
const size_t BLOCK_NUM = 20;
std::vector<char> data(BLOCK_SIZE * BLOCK_NUM);
boost::circular_buffer<char*> circle(BLOCK_NUM);
char* ptr = &data.front();
for (size_t i = 0; i != BLOCK_NUM; ++i)
{
    circle.push_back(ptr);
    ptr += BLOCK_SIZE;
}
Re[7]: Вопрос по дизайну
От: gpepsi  
Дата: 01.08.11 07:42
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>Не могу представить для чего тебе это надо, но на тебе "литой" блок:


пакеты приходят фрагментированные. в конце crc. копятся пакеты и разом проверяется crc
Re[8]: Вопрос по дизайну
От: Ytz https://github.com/mtrempoltsev
Дата: 01.08.11 07:46
Оценка:
Здравствуйте, gpepsi, Вы писали:

G>Здравствуйте, Ytz, Вы писали:


Ytz>>Не могу представить для чего тебе это надо, но на тебе "литой" блок:


G>пакеты приходят фрагментированные. в конце crc. копятся пакеты и разом проверяется crc


И для чего здесь как ты выражаешься "литой" блок нужен?
Re[9]: Вопрос по дизайну
От: gpepsi  
Дата: 01.08.11 07:48
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>И для чего здесь как ты выражаешься "литой" блок нужен?

чтоб зная длину пакета отдать его сразу на подсчет crc
Re[10]: Вопрос по дизайну
От: Ytz https://github.com/mtrempoltsev
Дата: 01.08.11 07:59
Оценка:
Здравствуйте, gpepsi, Вы писали:

G>Здравствуйте, Ytz, Вы писали:


Ytz>>И для чего здесь как ты выражаешься "литой" блок нужен?

G>чтоб зная длину пакета отдать его сразу на подсчет crc

Для чего здесь circular buffer?
Re[11]: Вопрос по дизайну
От: gpepsi  
Дата: 01.08.11 08:03
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>Здравствуйте, gpepsi, Вы писали:


G>>Здравствуйте, Ytz, Вы писали:


Ytz>>>И для чего здесь как ты выражаешься "литой" блок нужен?

G>>чтоб зная длину пакета отдать его сразу на подсчет crc

Ytz>Для чего здесь circular buffer?


для синхронизации начала пакета. я могу начать принимать фрагментированный пакет не сначала.
приходит пакет. добавляется к конец. считается crc, если не сходится — удаляется сначала.
если сошлось — удаляются все накопленные пакеты.

где-то так ....
Re[12]: Вопрос по дизайну
От: Ytz https://github.com/mtrempoltsev
Дата: 01.08.11 08:04
Оценка:
Здравствуйте, gpepsi, Вы писали:

G>Здравствуйте, Ytz, Вы писали:


Ytz>>Здравствуйте, gpepsi, Вы писали:


G>>>Здравствуйте, Ytz, Вы писали:


Ytz>>>>И для чего здесь как ты выражаешься "литой" блок нужен?

G>>>чтоб зная длину пакета отдать его сразу на подсчет crc

Ytz>>Для чего здесь circular buffer?


G>для синхронизации начала пакета. я могу начать принимать фрагментированный пакет не сначала.

G>приходит пакет. добавляется к конец. считается crc, если не сходится — удаляется сначала.
G>если сошлось — удаляются все накопленные пакеты.

G>где-то так ....


Вот твой вариант:

boost::ptr_circular_buffer<std::vector>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.