Изменение массива таблиц при использовании (не объекта) C++ API без воссоздания целых плоских буферов

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

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

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

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

...

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

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

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

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


person Sash Zats    schedule 28.05.2018    source источник
comment
Можете ли вы поделиться кодом, который вы использовали для обновления элемента вектора   -  person Shivendra Agarwal    schedule 28.05.2018
comment
Из быстрого чтения, flatbuffers - это... плоский буфер. Изменить элемент легко; изменение длины массива элементов невозможно.   -  person Yakk - Adam Nevraumont    schedule 28.05.2018


Ответы (1)


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

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

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

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

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

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

person Aardappel    schedule 28.05.2018