Мутация массива таблиц при использовании (не объектного) C ++ API без воссоздания целых плоских буферов - PullRequest
0 голосов
/ 28 мая 2018

Возможно ли изменять массив таблиц при использовании C ++ (не объектного) API без воссоздания всего плоского буфера?

Вот пример моей схемы

table Document {
  root_layer:Layer;
  bitmaps:[Bitmap];
  subdocuments:[Document];
}

table Layer {
  id:int;
  sublayers:[Layer];
}

...

Интересная часть здесьdocument → root_layer → sublayers

Допустим, я хочу изменить весь массив подслоев: переписать его полностью, а не просто заменить элемент в индексе.API мултибильности, насколько я видел, позволяет только заменять элемент в индексе, а не заменять весь массив новым массивом, верно?

Сегодня я в итоге воссоздаю весь документ, копируя все поля из исходного одного разаЯ попадаю на вложенный sublayers Я заменяю его новым массивом

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 28 мая 2018

Нет, не совсем.

Используя API отражения, можно добавить новые таблицы в существующий буфер, а затем изменить размер вектора, такого как sublayers, и заставить элементы указывать на новое (или старые) таблицы.Но в настоящее время нет способа удалить старые таблицы, и API довольно болезненно использовать, а изменение размера происходит медленно (мутация сложных плоских структур на месте затруднена).

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

Если вы обнаружите, что часто хотите изменить одну часть буфера, но не остальную, может быть ... они должны быть в 2 разных буферах?

Если статические данные должны находиться в том же буфере, что и динамическиеДля данных по какой-то причине один из подходов состоит в том, чтобы поместить статические данные в nested_flatbuffer, чтобы вы могли перенести их в новый буфер с одним memcpy.

Боюсь, использование объектного API - это ваша лучшая ставка в среднем.

...