BsMemorySerializer.cpp 2.3 KB

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