bx.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. /*
  2. * Copyright 2010-2021 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
  4. */
  5. #include <bx/debug.h>
  6. #include <bx/readerwriter.h>
  7. #if !BX_CRT_NONE
  8. # include <string.h> // memcpy, memmove, memset
  9. #endif // !BX_CRT_NONE
  10. namespace bx
  11. {
  12. void swap(void* _a, void* _b, size_t _numBytes)
  13. {
  14. uint8_t* lhs = (uint8_t*)_a;
  15. uint8_t* rhs = (uint8_t*)_b;
  16. const uint8_t* end = rhs + _numBytes;
  17. while (rhs != end)
  18. {
  19. swap(*lhs++, *rhs++);
  20. }
  21. }
  22. void memCopyRef(void* _dst, const void* _src, size_t _numBytes)
  23. {
  24. uint8_t* dst = (uint8_t*)_dst;
  25. const uint8_t* end = dst + _numBytes;
  26. const uint8_t* src = (const uint8_t*)_src;
  27. while (dst != end)
  28. {
  29. *dst++ = *src++;
  30. }
  31. }
  32. void memCopy(void* _dst, const void* _src, size_t _numBytes)
  33. {
  34. #if BX_CRT_NONE
  35. memCopyRef(_dst, _src, _numBytes);
  36. #else
  37. ::memcpy(_dst, _src, _numBytes);
  38. #endif // BX_CRT_NONE
  39. }
  40. void memCopy(
  41. void* _dst
  42. , uint32_t _dstStride
  43. , const void* _src
  44. , uint32_t _srcStride
  45. , uint32_t _stride
  46. , uint32_t _numStrides
  47. )
  48. {
  49. if (_stride == _srcStride
  50. && _stride == _dstStride)
  51. {
  52. memCopy(_dst, _src, _stride*_numStrides);
  53. return;
  54. }
  55. const uint8_t* src = (const uint8_t*)_src;
  56. uint8_t* dst = (uint8_t*)_dst;
  57. for (uint32_t ii = 0; ii < _numStrides; ++ii, src += _srcStride, dst += _dstStride)
  58. {
  59. memCopy(dst, src, _stride);
  60. }
  61. }
  62. void memMoveRef(void* _dst, const void* _src, size_t _numBytes)
  63. {
  64. uint8_t* dst = (uint8_t*)_dst;
  65. const uint8_t* src = (const uint8_t*)_src;
  66. if (_numBytes == 0
  67. || dst == src)
  68. {
  69. return;
  70. }
  71. // if (src+_numBytes <= dst || end <= src)
  72. if (dst < src)
  73. {
  74. memCopy(_dst, _src, _numBytes);
  75. return;
  76. }
  77. for (intptr_t ii = _numBytes-1; ii >= 0; --ii)
  78. {
  79. dst[ii] = src[ii];
  80. }
  81. }
  82. void memMove(void* _dst, const void* _src, size_t _numBytes)
  83. {
  84. #if BX_CRT_NONE
  85. memMoveRef(_dst, _src, _numBytes);
  86. #else
  87. ::memmove(_dst, _src, _numBytes);
  88. #endif // BX_CRT_NONE
  89. }
  90. void memMove(
  91. void* _dst
  92. , uint32_t _dstStride
  93. , const void* _src
  94. , uint32_t _srcStride
  95. , uint32_t _stride
  96. , uint32_t _numStrides
  97. )
  98. {
  99. if (_stride == _srcStride
  100. && _stride == _dstStride)
  101. {
  102. memMove(_dst, _src, _stride*_numStrides);
  103. return;
  104. }
  105. const uint8_t* src = (const uint8_t*)_src;
  106. uint8_t* dst = (uint8_t*)_dst;
  107. for (uint32_t ii = 0; ii < _numStrides; ++ii, src += _srcStride, dst += _dstStride)
  108. {
  109. memMove(dst, src, _stride);
  110. }
  111. }
  112. void memSetRef(void* _dst, uint8_t _ch, size_t _numBytes)
  113. {
  114. uint8_t* dst = (uint8_t*)_dst;
  115. const uint8_t* end = dst + _numBytes;
  116. while (dst != end)
  117. {
  118. *dst++ = char(_ch);
  119. }
  120. }
  121. void memSet(void* _dst, uint8_t _ch, size_t _numBytes)
  122. {
  123. #if BX_CRT_NONE
  124. memSetRef(_dst, _ch, _numBytes);
  125. #else
  126. ::memset(_dst, _ch, _numBytes);
  127. #endif // BX_CRT_NONE
  128. }
  129. void memSet(void* _dst, uint32_t _dstStride, uint8_t _ch, uint32_t _stride, uint32_t _num)
  130. {
  131. if (_stride == _dstStride)
  132. {
  133. memSet(_dst, _ch, _stride*_num);
  134. return;
  135. }
  136. uint8_t* dst = (uint8_t*)_dst;
  137. for (uint32_t ii = 0; ii < _num; ++ii, dst += _dstStride)
  138. {
  139. memSet(dst, _ch, _stride);
  140. }
  141. }
  142. int32_t memCmpRef(const void* _lhs, const void* _rhs, size_t _numBytes)
  143. {
  144. const char* lhs = (const char*)_lhs;
  145. const char* rhs = (const char*)_rhs;
  146. for (
  147. ; 0 < _numBytes && *lhs == *rhs
  148. ; ++lhs, ++rhs, --_numBytes
  149. )
  150. {
  151. }
  152. return 0 == _numBytes ? 0 : *lhs - *rhs;
  153. }
  154. int32_t memCmp(const void* _lhs, const void* _rhs, size_t _numBytes)
  155. {
  156. #if BX_CRT_NONE
  157. return memCmpRef(_lhs, _rhs, _numBytes);
  158. #else
  159. return ::memcmp(_lhs, _rhs, _numBytes);
  160. #endif // BX_CRT_NONE
  161. }
  162. ///
  163. void gather(void* _dst, const void* _src, uint32_t _srcStride, uint32_t _stride, uint32_t _numStrides)
  164. {
  165. memMove(_dst, _stride, _src, _srcStride, _stride, _numStrides);
  166. }
  167. ///
  168. void scatter(void* _dst, uint32_t _dstStride, const void* _src, uint32_t _stride, uint32_t _numStrides)
  169. {
  170. memMove(_dst, _dstStride, _src, _stride, _stride, _numStrides);
  171. }
  172. } // namespace bx