hkArrayStreamWriter.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:4k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HKBASE_ARRAY_STREAMWRITER_H
  9. #define HKBASE_ARRAY_STREAMWRITER_H
  10. #include <Common/Base/System/Io/Writer/hkStreamWriter.h>
  11. /// Writer which uses an hkArray as its storage.
  12. /// The written buffer area is from [0, hkArray.getSize()]
  13. /// This class maintains a single null byte directly after
  14. /// the buffer area so the the buffer may be interpreted
  15. /// as a c style string.
  16. class hkArrayStreamWriter : public hkStreamWriter
  17. {
  18. public:
  19. enum ArrayOwnership
  20. {
  21. ARRAY_TAKE,
  22. ARRAY_BORROW
  23. };
  24. void nullTerminate()
  25. {
  26. m_arr->reserve(m_arr->getSize()+1);
  27. m_arr->begin()[ m_arr->getSize() ] = 0;
  28. }
  29. void* getData() { return m_arr->begin(); }
  30. int getDataSize() { return m_arr->getSize(); }
  31. /// Create an hkStreamWriter which writes in to the array *arr.
  32. /// The write position is initially set to the end of the array.
  33. /// If o is ARRAY_TAKE, this object owns the array and will destroy
  34. /// it in this objects destructor. If o is ARRAY_BORROW, the array
  35. /// will not be deleted.
  36. hkArrayStreamWriter(hkArray<char>* arr, ArrayOwnership o)
  37. : m_arr(arr), m_offset(arr->getSize()), m_ownerShip(o)
  38. {
  39. nullTerminate();
  40. }
  41. ~hkArrayStreamWriter()
  42. {
  43. if( m_ownerShip == ARRAY_TAKE )
  44. {
  45. delete m_arr;
  46. }
  47. }
  48. virtual void clear()
  49. {
  50. m_arr->clear();
  51. m_offset = 0;
  52. nullTerminate();
  53. }
  54. virtual int write(const void* mem, int size)
  55. {
  56. HK_ASSERT2( 0x170ce358, m_offset <= m_arr->getSize(),
  57. "Array size has changed without a call to seek" );
  58. int spaceLeft = m_arr->getSize() - m_offset;
  59. if( size > spaceLeft )
  60. {
  61. int newSize = size + m_arr->getSize() - spaceLeft;
  62. m_arr->reserve( 1 + newSize );
  63. m_arr->setSizeUnchecked( newSize );
  64. m_arr->begin()[ newSize ] = 0;
  65. }
  66. else if( m_arr->getCapacity() > m_arr->getSize() )
  67. {
  68. m_arr->begin()[ m_arr->getSize() ] = 0;
  69. }
  70. char* p = m_arr->begin() + m_offset;
  71. hkString::memCpy(p, mem, size);
  72. m_offset += size;
  73. return size;
  74. }
  75. virtual hkBool isOk() const
  76. {
  77. return true;
  78. }
  79. virtual hkBool seekTellSupported() const
  80. {
  81. return true;
  82. }
  83. virtual hkResult seek(int offset, SeekWhence whence)
  84. {
  85. int absOffset = m_offset;
  86. switch( whence )
  87. {
  88. case STREAM_SET:
  89. absOffset = offset;
  90. break;
  91. case STREAM_CUR:
  92. absOffset = m_offset + offset;
  93. break;
  94. case STREAM_END:
  95. absOffset = m_arr->getSize() - offset;
  96. break;
  97. default:
  98. HK_ASSERT2(0x55f1b803, 0, "Bad 'whence' passed to seek()");
  99. break;
  100. }
  101. if( absOffset >= 0 )
  102. {
  103. if( absOffset > m_arr->getSize() )
  104. {
  105. m_arr->setSize( absOffset+1, 0 ); // zero filled space, null terminated
  106. m_arr->setSizeUnchecked( absOffset );
  107. }
  108. m_offset = absOffset;
  109. return HK_SUCCESS;
  110. }
  111. return HK_FAILURE;
  112. }
  113. virtual int tell() const
  114. {
  115. return m_offset;
  116. }
  117. protected:
  118. hkArray<char>* m_arr; // written chars always in area 0,getSize()
  119. int m_offset; // invariant: m_offset <= m_arr.getSize()
  120. ArrayOwnership m_ownerShip;
  121. };
  122. #endif // HKBASE_ARRAY_STREAMWRITER_H
  123. /*
  124. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  125. * Confidential Information of Havok.  (C) Copyright 1999-2009
  126. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  127. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  128. * rights, and intellectual property rights in the Havok software remain in
  129. * Havok and/or its suppliers.
  130. * Use of this software for evaluation purposes is subject to and indicates
  131. * acceptance of the End User licence Agreement for this product. A copy of
  132. * the license is included with this software and is also available at www.havok.com/tryhavok.
  133. */