示例#1
0
dl_error_t dl_instance_store( dl_ctx_t       dl_ctx,     dl_typeid_t type_id,         void*   instance,
							  unsigned char* out_buffer, size_t      out_buffer_size, size_t* produced_bytes )
{
	if( out_buffer_size > 0 && out_buffer_size <= sizeof(SDLDataHeader) )
		return DL_ERROR_BUFFER_TO_SMALL;

	const SDLType* type = dl_internal_find_type( dl_ctx, type_id );
	if( type == 0x0 )
		return DL_ERROR_TYPE_NOT_FOUND;

	// write header
	SDLDataHeader header;
	header.id = DL_INSTANCE_ID;
	header.version = DL_INSTANCE_VERSION;
	header.root_instance_type = type_id;
	header.instance_size = 0;
	header.is_64_bit_ptr = sizeof(void*) == 8 ? 1 : 0;
	header.pad[0] = header.pad[1] = header.pad[2] = 0;

	unsigned char* store_ctx_buffer      = 0x0;
	size_t         store_ctx_buffer_size = 0;
	bool           store_ctx_is_dummy    = out_buffer_size == 0;

	if( out_buffer_size > 0 )
	{
		memcpy(out_buffer, &header, sizeof(SDLDataHeader));
		store_ctx_buffer      = out_buffer + sizeof(SDLDataHeader);
		store_ctx_buffer_size = out_buffer_size - sizeof(SDLDataHeader);
	}

	CDLBinStoreContext store_context( store_ctx_buffer, store_ctx_buffer_size, store_ctx_is_dummy );

	dl_binary_writer_reserve( &store_context.writer, type->size[DL_PTR_SIZE_HOST] );
	store_context.AddWrittenPtr(instance, 0); // if pointer refere to root-node, it can be found at offset 0

	dl_error_t err = dl_internal_instance_store( dl_ctx, type, (uint8*)instance, &store_context );

	// write instance size!
	SDLDataHeader* out_header = (SDLDataHeader*)out_buffer;
	dl_binary_writer_seek_end( &store_context.writer );
	if( out_buffer )
		out_header->instance_size = (uint32)dl_binary_writer_tell( &store_context.writer );

	if( produced_bytes )
		*produced_bytes = (uint32)dl_binary_writer_tell( &store_context.writer ) + sizeof(SDLDataHeader);

	if( out_buffer_size > 0 && out_header->instance_size > out_buffer_size )
		return DL_ERROR_BUFFER_TO_SMALL;

	return err;
}
示例#2
0
		store_context store_context::take_ownership(pointer _ptr)
		{
			error::throw_error_if_not(_ptr);

			return store_context(_ptr, deleter);
		}