BsMemorySerializer.cpp 2.1 KB

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