BsMemorySerializer.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "BsMemorySerializer.h"
  2. #include "BsException.h"
  3. #include "BsIReflectable.h"
  4. #include "BsBinarySerializer.h"
  5. using namespace std::placeholders;
  6. namespace BansheeEngine
  7. {
  8. MemorySerializer::MemorySerializer()
  9. { }
  10. MemorySerializer::~MemorySerializer()
  11. { }
  12. UINT8* MemorySerializer::encode(IReflectable* object, UINT32& bytesWritten, std::function<void*(UINT32)> allocator)
  13. {
  14. using namespace std::placeholders;
  15. BinarySerializer bs;
  16. BufferPiece piece;
  17. piece.buffer = (UINT8*)bs_alloc(WRITE_BUFFER_SIZE);
  18. piece.size = 0;
  19. mBufferPieces.push_back(piece);
  20. bs.encode(object, piece.buffer, WRITE_BUFFER_SIZE, (INT32*)&bytesWritten, std::bind(&MemorySerializer::flushBuffer, this, _1, _2, _3));
  21. UINT8* resultBuffer;
  22. if(allocator != nullptr)
  23. resultBuffer = (UINT8*)allocator(bytesWritten);
  24. else
  25. resultBuffer = (UINT8*)bs_alloc(bytesWritten);
  26. UINT32 offset = 0;
  27. for(auto iter = mBufferPieces.begin(); iter != mBufferPieces.end(); ++iter)
  28. {
  29. if(iter->size > 0)
  30. {
  31. memcpy(resultBuffer + offset, iter->buffer, iter->size);
  32. offset += iter->size;
  33. }
  34. }
  35. for(auto iter = mBufferPieces.rbegin(); iter != mBufferPieces.rend(); ++iter)
  36. {
  37. bs_free(iter->buffer);
  38. }
  39. mBufferPieces.clear();
  40. return resultBuffer;
  41. }
  42. std::shared_ptr<IReflectable> MemorySerializer::decode(UINT8* buffer, UINT32 bufferSize)
  43. {
  44. BinarySerializer bs;
  45. std::shared_ptr<IReflectable> object = bs.decode(buffer, (UINT32)bufferSize);
  46. return object;
  47. }
  48. UINT8* MemorySerializer::flushBuffer(UINT8* bufferStart, int bytesWritten, UINT32& newBufferSize)
  49. {
  50. mBufferPieces.back().size = bytesWritten;
  51. BufferPiece piece;
  52. piece.buffer = (UINT8*)bs_alloc(WRITE_BUFFER_SIZE);
  53. piece.size = 0;
  54. mBufferPieces.push_back(piece);
  55. return piece.buffer;
  56. }
  57. }