bit.inl 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /// @ref gtx_bit
  2. namespace glm
  3. {
  4. ///////////////////
  5. // highestBitValue
  6. template<typename genIUType>
  7. GLM_FUNC_QUALIFIER genIUType highestBitValue(genIUType Value)
  8. {
  9. genIUType tmp = Value;
  10. genIUType result = genIUType(0);
  11. while(tmp)
  12. {
  13. result = (tmp & (~tmp + 1)); // grab lowest bit
  14. tmp &= ~result; // clear lowest bit
  15. }
  16. return result;
  17. }
  18. template<length_t L, typename T, qualifier Q>
  19. GLM_FUNC_QUALIFIER vec<L, T, Q> highestBitValue(vec<L, T, Q> const& v)
  20. {
  21. return detail::functor1<vec, L, T, T, Q>::call(highestBitValue, v);
  22. }
  23. ///////////////////
  24. // lowestBitValue
  25. template<typename genIUType>
  26. GLM_FUNC_QUALIFIER genIUType lowestBitValue(genIUType Value)
  27. {
  28. return (Value & (~Value + 1));
  29. }
  30. template<length_t L, typename T, qualifier Q>
  31. GLM_FUNC_QUALIFIER vec<L, T, Q> lowestBitValue(vec<L, T, Q> const& v)
  32. {
  33. return detail::functor1<vec, L, T, T, Q>::call(lowestBitValue, v);
  34. }
  35. ///////////////////
  36. // powerOfTwoAbove
  37. template<typename genType>
  38. GLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType value)
  39. {
  40. return isPowerOfTwo(value) ? value : highestBitValue(value) << 1;
  41. }
  42. template<length_t L, typename T, qualifier Q>
  43. GLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoAbove(vec<L, T, Q> const& v)
  44. {
  45. return detail::functor1<vec, L, T, T, Q>::call(powerOfTwoAbove, v);
  46. }
  47. ///////////////////
  48. // powerOfTwoBelow
  49. template<typename genType>
  50. GLM_FUNC_QUALIFIER genType powerOfTwoBelow(genType value)
  51. {
  52. return isPowerOfTwo(value) ? value : highestBitValue(value);
  53. }
  54. template<length_t L, typename T, qualifier Q>
  55. GLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoBelow(vec<L, T, Q> const& v)
  56. {
  57. return detail::functor1<vec, L, T, T, Q>::call(powerOfTwoBelow, v);
  58. }
  59. /////////////////////
  60. // powerOfTwoNearest
  61. template<typename genType>
  62. GLM_FUNC_QUALIFIER genType powerOfTwoNearest(genType value)
  63. {
  64. if(isPowerOfTwo(value))
  65. return value;
  66. genType const prev = highestBitValue(value);
  67. genType const next = prev << 1;
  68. return (next - value) < (value - prev) ? next : prev;
  69. }
  70. template<length_t L, typename T, qualifier Q>
  71. GLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoNearest(vec<L, T, Q> const& v)
  72. {
  73. return detail::functor1<vec, L, T, T, Q>::call(powerOfTwoNearest, v);
  74. }
  75. }//namespace glm