Бранимир Караџић 6 lat temu
rodzic
commit
49bd00e446
2 zmienionych plików z 125 dodań i 23 usunięć
  1. 54 5
      include/bx/bx.h
  2. 71 18
      src/bx.cpp

+ 54 - 5
include/bx/bx.h

@@ -73,27 +73,76 @@ namespace bx
 	template<typename Ty>
 	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"

+ 71 - 18
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