diff --git a/include/bx/bx.h b/include/bx/bx.h index d5baeff..2cfc676 100644 --- a/include/bx/bx.h +++ b/include/bx/bx.h @@ -73,27 +73,76 @@ namespace bx template constexpr bool isPowerOf2(Ty _a); + /// Copy memory block. + /// + /// @param _dst Destination pointer. + /// @param _src Source pointer. + /// @param _numBytes Number of bytes to copy. + /// + /// @remark Source and destination memory blocks must not overlap. /// void memCopy(void* _dst, const void* _src, size_t _numBytes); + /// Copy strided memory block. /// - void memCopy(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _srcPitch, uint32_t _dstPitch); - + /// @param _dst Destination pointer. + /// @param _dstStride Destination stride. + /// @param _src Source pointer. + /// @param _srcStride Source stride. + /// @param _stride Number of bytes per stride to copy. + /// @param _num Number of strides. /// - void gather(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _srcPitch); - + /// @remark Source and destination memory blocks must not overlap. /// - void scatter(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _dstPitch); + void memCopy( + void* _dst + , uint32_t _dstStride + , const void* _src + , uint32_t _srcStride + , uint32_t _stride + , uint32_t _num + ); /// void memMove(void* _dst, const void* _src, size_t _numBytes); + /// + void memMove( + void* _dst + , uint32_t _dstStride + , const void* _src + , uint32_t _srcStride + , uint32_t _stride + , uint32_t _num + ); + /// void memSet(void* _dst, uint8_t _ch, size_t _numBytes); + /// + void memSet(void* _dst, uint32_t _dstStride, uint8_t _ch, uint32_t _stride, uint32_t _num); + /// int32_t memCmp(const void* _lhs, const void* _rhs, size_t _numBytes); + /// + void gather( + void* _dst + , const void* _src + , uint32_t _srcStride + , uint32_t _stride + , uint32_t _num + ); + + /// + void scatter( + void* _dst + , uint32_t _dstStride + , const void* _src + , uint32_t _stride + , uint32_t _num + ); + } // namespace bx #include "inline/bx.inl" diff --git a/src/bx.cpp b/src/bx.cpp index 19d4137..ab28bc2 100644 --- a/src/bx.cpp +++ b/src/bx.cpp @@ -44,29 +44,29 @@ namespace bx #endif // BX_CRT_NONE } - void memCopy(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _srcPitch, uint32_t _dstPitch) + void memCopy( + void* _dst + , uint32_t _dstStride + , const void* _src + , uint32_t _srcStride + , uint32_t _stride + , uint32_t _num + ) { - const uint8_t* src = (const uint8_t*)_src; - uint8_t* dst = (uint8_t*)_dst; - - for (uint32_t ii = 0; ii < _num; ++ii) + if (_stride == _srcStride + && _stride == _dstStride) { - memCopy(dst, src, _size); - src += _srcPitch; - dst += _dstPitch; + memCopy(_dst, _src, _stride*_num); + return; } - } - /// - void gather(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _srcPitch) - { - memCopy(_dst, _src, _size, _num, _srcPitch, _size); - } + const uint8_t* src = (const uint8_t*)_src; + uint8_t* dst = (uint8_t*)_dst; - /// - void scatter(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _dstPitch) - { - memCopy(_dst, _src, _size, _num, _size, _dstPitch); + for (uint32_t ii = 0; ii < _num; ++ii, src += _srcStride, dst += _dstStride) + { + memCopy(dst, src, _stride); + } } void memMoveRef(void* _dst, const void* _src, size_t _numBytes) @@ -102,6 +102,31 @@ namespace bx #endif // BX_CRT_NONE } + void memMove( + void* _dst + , uint32_t _dstStride + , const void* _src + , uint32_t _srcStride + , uint32_t _stride + , uint32_t _num + ) + { + if (_stride == _srcStride + && _stride == _dstStride) + { + memMove(_dst, _src, _stride*_num); + return; + } + + const uint8_t* src = (const uint8_t*)_src; + uint8_t* dst = (uint8_t*)_dst; + + for (uint32_t ii = 0; ii < _num; ++ii, src += _srcStride, dst += _dstStride) + { + memMove(dst, src, _stride); + } + } + void memSetRef(void* _dst, uint8_t _ch, size_t _numBytes) { uint8_t* dst = (uint8_t*)_dst; @@ -121,6 +146,22 @@ namespace bx #endif // BX_CRT_NONE } + void memSet(void* _dst, uint32_t _dstStride, uint8_t _ch, uint32_t _stride, uint32_t _num) + { + if (_stride == _dstStride) + { + memSet(_dst, _ch, _stride*_num); + return; + } + + uint8_t* dst = (uint8_t*)_dst; + + for (uint32_t ii = 0; ii < _num; ++ii, dst += _dstStride) + { + memSet(dst, _ch, _stride); + } + } + int32_t memCmpRef(const void* _lhs, const void* _rhs, size_t _numBytes) { const char* lhs = (const char*)_lhs; @@ -144,4 +185,16 @@ namespace bx #endif // BX_CRT_NONE } + /// + void gather(void* _dst, const void* _src, uint32_t _srcStride, uint32_t _stride, uint32_t _num) + { + memMove(_dst, _stride, _src, _srcStride, _stride, _num); + } + + /// + void scatter(void* _dst, uint32_t _dstStride, const void* _src, uint32_t _stride, uint32_t _num) + { + memMove(_dst, _dstStride, _src, _stride, _num, _stride); + } + } // namespace bx