6 template<length_t L,
typename T, qualifier Q,
bool compute = false>
15 template<length_t L,
typename T, qualifier Q>
20 return v | (v >> Shift);
24 template<length_t L,
typename T, qualifier Q,
bool isSigned = true>
29 GLM_STATIC_ASSERT(!std::numeric_limits<T>::is_iec559,
"'ceilPowerOfTwo' only accept integer scalar or vector inputs");
35 v = v -
static_cast<T
>(1);
36 v = v | (v >>
static_cast<T
>(1));
37 v = v | (v >>
static_cast<T
>(2));
38 v = v | (v >>
static_cast<T
>(4));
42 return (v +
static_cast<T
>(1)) * Sign;
46 template<length_t L,
typename T, qualifier Q>
51 GLM_STATIC_ASSERT(!std::numeric_limits<T>::is_iec559,
"'ceilPowerOfTwo' only accept integer scalar or vector inputs");
55 v = v -
static_cast<T
>(1);
56 v = v | (v >>
static_cast<T
>(1));
57 v = v | (v >>
static_cast<T
>(2));
58 v = v | (v >>
static_cast<T
>(4));
62 return v +
static_cast<T
>(1);
66 template<
bool is_
float,
bool is_
signed>
72 template<
typename genType>
73 GLM_FUNC_QUALIFIER
static genType call(genType Source, genType Multiple)
75 if(Source > genType(0))
76 return Source + (Multiple - std::fmod(Source, Multiple));
78 return Source + std::fmod(-Source, Multiple);
85 template<
typename genType>
86 GLM_FUNC_QUALIFIER
static genType call(genType Source, genType Multiple)
88 genType Tmp = Source - genType(1);
89 return Tmp + (Multiple - (Tmp % Multiple));
96 template<
typename genType>
97 GLM_FUNC_QUALIFIER
static genType call(genType Source, genType Multiple)
99 assert(Multiple > genType(0));
100 if(Source > genType(0))
102 genType Tmp = Source - genType(1);
103 return Tmp + (Multiple - (Tmp % Multiple));
106 return Source + (-Source % Multiple);
110 template<
bool is_
float,
bool is_
signed>
116 template<
typename genType>
117 GLM_FUNC_QUALIFIER
static genType call(genType Source, genType Multiple)
119 if(Source >= genType(0))
120 return Source - std::fmod(Source, Multiple);
122 return Source - std::fmod(Source, Multiple) - Multiple;
129 template<
typename genType>
130 GLM_FUNC_QUALIFIER
static genType call(genType Source, genType Multiple)
132 if(Source >= genType(0))
133 return Source - Source % Multiple;
136 genType Tmp = Source + genType(1);
137 return Tmp - Tmp % Multiple - Multiple;
145 template<
typename genType>
146 GLM_FUNC_QUALIFIER
static genType call(genType Source, genType Multiple)
148 if(Source >= genType(0))
149 return Source - Source % Multiple;
152 genType Tmp = Source + genType(1);
153 return Tmp - Tmp % Multiple - Multiple;
159 template<
typename genIUType>
162 GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,
"'isPowerOfTwo' only accept integer inputs");
164 genIUType
const Result =
glm::abs(Value);
165 return !(Result & (Result - 1));
168 template<
typename genIUType>
171 GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,
"'nextPowerOfTwo' only accept integer inputs");
176 template<
typename genIUType>
179 GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,
"'prevPowerOfTwo' only accept integer inputs");
181 return isPowerOfTwo(value) ? value :
static_cast<genIUType
>(
static_cast<genIUType
>(1) <<
static_cast<genIUType
>(
findMSB(value)));
184 template<
typename genIUType>
185 GLM_FUNC_QUALIFIER
bool isMultiple(genIUType Value, genIUType Multiple)
187 GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,
"'isMultiple' only accept integer inputs");
192 template<
typename genIUType>
193 GLM_FUNC_QUALIFIER genIUType
nextMultiple(genIUType Source, genIUType Multiple)
195 GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,
"'nextMultiple' only accept integer inputs");
200 template<
typename genIUType>
201 GLM_FUNC_QUALIFIER genIUType
prevMultiple(genIUType Source, genIUType Multiple)
203 GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,
"'prevMultiple' only accept integer inputs");
208 template<
typename genIUType>
209 GLM_FUNC_QUALIFIER
int findNSB(genIUType x,
int significantBitCount)
211 GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer,
"'findNSB' only accept integer inputs");
213 if(bitCount(x) < significantBitCount)
216 genIUType
const One =
static_cast<genIUType
>(1);
220 int nBitCount = significantBitCount;
221 int Step =
sizeof(x) * 8 / 2;
224 genIUType Mask =
static_cast<genIUType
>((One << Step) - One);
225 genIUType currentKey = key & Mask;
226 int currentBitCount = bitCount(currentKey);
227 if (nBitCount > currentBitCount)
229 nBitCount -= currentBitCount;
231 key >>=
static_cast<genIUType
>(Step);
241 return static_cast<int>(bitPos);
GLM_FUNC_DECL GLM_CONSTEXPR genType abs(genType x)
GLM_FUNC_DECL vec< L, T, Q > sign(vec< L, T, Q > const &x)
Definition func_common.inl:295
GLM_FUNC_QUALIFIER int findMSB(genIUType v)
Definition func_integer.inl:353
GLM_FUNC_DECL int findNSB(genIUType x, int significantBitCount)
Definition scalar_integer.inl:209
GLM_FUNC_DECL genIUType nextPowerOfTwo(genIUType v)
Definition scalar_integer.inl:169
GLM_FUNC_DECL genIUType prevPowerOfTwo(genIUType v)
Definition scalar_integer.inl:177
GLM_FUNC_DECL genIUType nextMultiple(genIUType v, genIUType Multiple)
Definition scalar_integer.inl:193
GLM_FUNC_DECL genIUType prevMultiple(genIUType v, genIUType Multiple)
Definition scalar_integer.inl:201
GLM_FUNC_DECL bool isPowerOfTwo(genIUType v)
Definition scalar_integer.inl:160
GLM_FUNC_DECL bool isMultiple(genIUType v, genIUType Multiple)
Definition scalar_integer.inl:185
detail namespace with internal helper functions
Definition json.h:249
Core features
Definition common.hpp:21
Definition scalar_integer.inl:67
Definition scalar_integer.inl:26
Definition scalar_integer.inl:8
Definition scalar_integer.inl:111
Definition qualifier.hpp:35