BsMemorySerializer.cpp 2.1 KB

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