2010-02-14 2 views
3

Мне нужен легкий (предпочтительно MIT-лицензированный) легкий растущий буфер, реализованный в простой C (предпочтительно также скомпилируемый как C++).Растительный буфер для простой C

мне нужно API, эквивалентную следующие (псевдо-код):

  • void set_allocator(buffer * buf, allocator_Fn fn);
  • void push_bytes(buffer * buf, const char * bytes, size_t len);
  • size_t get_length(buffer * buf);
  • void overwrite_autogrow(buffer * buf, size_t offset, const char * bytes, size_t len);
  • const char * to_string(buffer * buf);

Реализация должна быть чистой и автономной.

overwrite_autogrow пишет len из bytes к заданному смещению при выращивании буфера по мере необходимости (как push_bytes делает).

Возможность установки распределителя не является обязательной, но предпочтительнее иметь.

Кто-нибудь знает что-нибудь близкое к тому, что я хочу?

Или, по крайней мере, любые реализации, на которые стоит обратить внимание при реализации моих собственных?

+3

мы говорим о С, вечным оазисом колеса- (ре) -inventors; если используемая вами структура не обеспечивает функциональность, сверните свою собственную реализацию. – Christoph

+0

Я обновил свой ответ. Какую реализацию с открытым исходным кодом следует рассмотреть при написании собственного растущего буфера? :-) –

+0

Можете ли вы пояснить, что вы подразумеваете под «загрязнением вашего кода макросами»? Все портативные устройства будут работать вокруг тонких различий между malloc(), realloc() и memcpy() в зависимости от платформы, особенно если она обеспечивает обратный вызов для ведения журнала. Вы сами заметили, что хотите указать распределитель. –

ответ

3

VPOOL (Лицензия BSD)

http://www.bsdua.org/libbsdua.html#vpool

Vpool является автоматическое изменения размера буфера (динамический массив). Используя его, вы не нужно заботиться о распределении памяти, проверки пограничной, указателе манипуляций и т.д.

+0

Спасибо!Это почти то, что я хочу (он имеет некоторые дополнительные функции и не поддерживает пользовательские распределители, но это исправление). –

0

http://library.gnome.org/devel/glib/stable/glib-Arrays.html

не уверен, если он реализует overwrite_autogrow, хотя, как я не знаю, что вы имеете в виду под этим. Вы хотите вручную установить емкость? Если да, то g_array_set_size.

Однако лицензия может быть проблемой, но вы должны иметь возможность использовать ее как LGPL. Я не знаю, совместимо ли это с MIT или нет.

+0

Я обновил свой вопрос, чтобы объяснить overwrite_autogrow. Я стараюсь избегать [L] GPL, насколько могу, но я возьму его, если не найду ничего лучше. Благодаря! –

Смежные вопросы