IPolyObject::Marshal

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
Компоненты на верхнем уровне \ Подсистема управления \ IPolyObject \ Marshal
package<default_package_allocator, IPolyObject> Marshal() const;
package_reference<IPolyObject> Marshal(void* pBuffer, size_type cbBuffer) const;

Выполняет запаковку полигонального объекта-элемента геометрической модели в единый блок последовательных байт.

  1. Выделяет память под хранение запакованных данных, которые управляются запаковщиком package.
  2. Записывает запакованные данные в предоставленный извне буфер.
Параметры
[in]pBufferУказатель на буфер памяти, байтовым размером, как минимум, равным значению, возвращаемому методом IPolyObject::MarshalSize. Функция заполняет буфер запакованным полигональным объектом.
cbBufferБайтовый размер предоставленного для второй перегрузки буфера данных.
Возвращаемое значение:
Объект, управляющий запакованным пакетом данных. Первая перегрузка, в отличие от второй, возвращает объект, который также управляет буфером, хранящим запакованные данные, и автоматически освобождает память при деструкции возвращенного объекта. Вторая перегрузка управляет только данными, но ответственность за освобождение памяти буфера ложится на вызывающего.
Перегрузка 1 создает смарт объект C++ (см. package), который управляет как запаковкой, так и выделенной им же памятью. Перегрузка 2 позволяет использовать уже существующую память, которая заполняется запакованным полигональным объектом. Вторая перегрузка предполагает, что размер предоставленного буфера задан в байтах параметром cbBuffer. Этот размер должен быть не меньше значения, возвращаемого методом IPolyObject::MarshalSize. Методы фактически делегируют вызов запаковщику package, на вход которого можно предоставлять экземпляр плоскости напрямую, без вызова методов.
using namespace CAMaaS;

const IPolyObject& poly = get(); //какой-то метод возвращающий read-only ссылку на модель

auto pckg = package<std::allocator, IPolyObject> (poly); //аналогично вызову poly.Marshal();

auto buffer_size = package_reference<IPolyObject>::calculate_size(poly); //аналогично poly.MarshalSize();
auto buffer = new std::uint8_t [buffer_size];
auto pckg_ref = package_reference<IPolyObject> (buffer, buffer_size, poly); //аналогично вызову poly.Marshal(buffer, buffer_size);
Возможные исключения
Chusov::Exceptions::OutOfMemoryExceptionИсключение, которое может быть сгенерировано перегрузкой 1 в случае нехватки памяти.
Chusov::Exceptions::InsufficientBufferExceptionИсключение, которое может быть сгенерировано перегрузкой 2 в случае, если предоставлен слишком малый буфер pBuffer.
См. также
package_reference
package
make_packageФункция, позволяющая создание запакованных объектов на основе их типов, полученных дедукцией и с использованием стандартного менеджера памяти std::allocator.