StridedPtr.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2024 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. JPH_NAMESPACE_BEGIN
  6. /// A strided pointer behaves exactly like a normal pointer except that the
  7. /// elements that the pointer points to can be part of a larger structure.
  8. /// The stride gives the number of bytes from one element to the next.
  9. template <class T>
  10. class JPH_EXPORT StridedPtr
  11. {
  12. public:
  13. using value_type = T;
  14. /// Constructors
  15. StridedPtr() = default;
  16. StridedPtr(const StridedPtr &inRHS) = default;
  17. StridedPtr(T *inPtr, int inStride = sizeof(T)) : mPtr(const_cast<uint8 *>(reinterpret_cast<const uint8 *>(inPtr))), mStride(inStride) { }
  18. /// Assignment
  19. inline StridedPtr & operator = (const StridedPtr &inRHS) = default;
  20. /// Incrementing / decrementing
  21. inline StridedPtr & operator ++ () { mPtr += mStride; return *this; }
  22. inline StridedPtr & operator -- () { mPtr -= mStride; return *this; }
  23. inline StridedPtr operator ++ (int) { StridedPtr old_ptr(*this); mPtr += mStride; return old_ptr; }
  24. inline StridedPtr operator -- (int) { StridedPtr old_ptr(*this); mPtr -= mStride; return old_ptr; }
  25. inline StridedPtr operator + (int inOffset) const { StridedPtr new_ptr(*this); new_ptr.mPtr += inOffset * mStride; return new_ptr; }
  26. inline StridedPtr operator - (int inOffset) const { StridedPtr new_ptr(*this); new_ptr.mPtr -= inOffset * mStride; return new_ptr; }
  27. inline void operator += (int inOffset) { mPtr += inOffset * mStride; }
  28. inline void operator -= (int inOffset) { mPtr -= inOffset * mStride; }
  29. /// Distance between two pointers in elements
  30. inline int operator - (const StridedPtr &inRHS) const { JPH_ASSERT(inRHS.mStride == mStride); return (mPtr - inRHS.mPtr) / mStride; }
  31. /// Comparison operators
  32. inline bool operator == (const StridedPtr &inRHS) const { return mPtr == inRHS.mPtr; }
  33. inline bool operator != (const StridedPtr &inRHS) const { return mPtr != inRHS.mPtr; }
  34. inline bool operator <= (const StridedPtr &inRHS) const { return mPtr <= inRHS.mPtr; }
  35. inline bool operator >= (const StridedPtr &inRHS) const { return mPtr >= inRHS.mPtr; }
  36. inline bool operator < (const StridedPtr &inRHS) const { return mPtr < inRHS.mPtr; }
  37. inline bool operator > (const StridedPtr &inRHS) const { return mPtr > inRHS.mPtr; }
  38. /// Access value
  39. inline T & operator * () const { return *reinterpret_cast<T *>(mPtr); }
  40. inline T * operator -> () const { return reinterpret_cast<T *>(mPtr); }
  41. inline T & operator [] (int inOffset) const { uint8 *ptr = mPtr + inOffset * mStride; return *reinterpret_cast<T *>(ptr); }
  42. /// Explicit conversion
  43. inline T * GetPtr() const { return reinterpret_cast<T *>(mPtr); }
  44. /// Get stride in bytes
  45. inline int GetStride() const { return mStride; }
  46. private:
  47. uint8 * mPtr = nullptr; /// Pointer to element
  48. int mStride = 0; /// Stride (number of bytes) between elements
  49. };
  50. JPH_NAMESPACE_END