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; }
store_context store_context::take_ownership(pointer _ptr) { error::throw_error_if_not(_ptr); return store_context(_ptr, deleter); }