ZFFramework
 
Loading...
Searching...
No Matches
ZFCoreUtilMath.h
Go to the documentation of this file.
1
5
6#ifndef _ZFI_ZFCoreUtilMath_h_
7#define _ZFI_ZFCoreUtilMath_h_
8
9#include "ZFComparer.h"
10
12// ============================================================
16template<typename T_Number>
17inline T_Number const &zfmMax(
18 ZF_IN T_Number const &n0
19 , ZF_IN T_Number const &n1
20 ) {
21 return ((n0 > n1) ? n0 : n1);
22}
23
26template<typename T_Number>
27inline T_Number const &zfmMin(
28 ZF_IN T_Number const &n0
29 , ZF_IN T_Number const &n1
30 ) {
31 return ((n0 < n1) ? n0 : n1);
32}
33
36template<typename T_Number>
37inline T_Number zfmAbs(ZF_IN T_Number const &n0) {
38 return ((n0 < 0) ? (T_Number)(0 - n0) : n0);
39}
40
45template<typename T_Number>
46inline T_Number zfmApplyRange(
47 ZF_IN T_Number const &n
48 , ZF_IN T_Number const &nMin
49 , ZF_IN T_Number const &nMax
50 ) {
51 return ((n <= nMin)
52 ? nMin
53 : ((n <= nMax)
54 ? n
55 : ((nMax >= nMin)
56 ? nMax
57 : n
58 )
59 )
60 );
61}
62
65template<typename T_Number>
66inline T_Number zfmApplyProgress(
67 ZF_IN T_Number const &start
68 , ZF_IN T_Number const &end
69 , ZF_IN zffloat progress
70 ) {
71 return (T_Number)(start + (end - start) * progress);
72}
73
74// ============================================================
75// round float
77template<typename T_zffloat>
78inline T_zffloat zfmRoundUp(ZF_IN const T_zffloat &v) {
79 return (T_zffloat)((v >= 0)
81 : (zfint)v
82 );
83}
84
85template<typename T_zffloat>
86inline T_zffloat zfmRoundDown(ZF_IN const T_zffloat &v) {
87 return (T_zffloat)((v >= 0)
88 ? (zfint)v
90 );
91}
92
93template<typename T_zffloat>
94inline T_zffloat zfmRound(ZF_IN const T_zffloat &v) {
95 return (T_zffloat)(zfint)((v >= 0) ? (v + 0.5f) : (v - 0.5f));
96}
97
98// ============================================================
114template<typename T_int>
115T_int zfmRand(ZF_IN T_int const &range) {
116 return (T_int)(range * zfmRandFloat());
117}
118
121template<typename T_int>
123 ZF_IN T_int const &start
124 , ZF_IN T_int const &end
125 ) {
126 return start + (T_int)((end - start) * zfmRand());
127}
128
129// ============================================================
130template<typename T_Element, typename T_Holder>
131zfindex _ZFP_zfmSort(
132 ZF_IN T_Holder &holder
133 , ZF_IN zfindex left
134 , ZF_IN zfindex right
135 , ZF_IN typename ZFComparer<T_Element>::Comparer comparer
136 , ZF_IN zfbool ascending
137 ) {
138 ZFCompareResult cmpToken = (ascending ? ZFCompareGreater : ZFCompareSmaller);
139 T_Element pivot = holder[left];
141 while(left < right) {
142 while(left < right) {
143 cmpTmp = comparer(pivot, holder[right]);
144 if(cmpTmp == ZFCompareUncomparable) {
145 holder[left] = pivot;
146 return zfindexMax();
147 }
148 else if(cmpTmp == cmpToken) {
149 break;
150 }
151 --right;
152 }
153 holder[left] = holder[right];
154 while(left < right) {
155 cmpTmp = comparer(holder[left], pivot);
156 if(cmpTmp == ZFCompareUncomparable) {
157 holder[right] = pivot;
158 return zfindexMax();
159 }
160 else if(cmpTmp == cmpToken) {
161 break;
162 }
163 ++left;
164 }
165 holder[right] = holder[left];
166 }
167 holder[left] = pivot;
168 return left;
169}
173template<typename T_Element, typename T_Holder>
175 ZF_IN T_Holder &holder
176 , ZF_IN zfindex left
177 , ZF_IN zfindex right
179 ) {
180 if(left < right) {
181 zfindex mid = _ZFP_zfmSort<T_Element>(holder, left, right, comparer, zftrue);
182 if(mid == zfindexMax()) {
183 return zffalse;
184 }
185 if(mid > 0) {
186 if(!zfmSort<T_Element>(holder, left, mid - 1, comparer)) {
187 return zffalse;
188 }
189 }
190 if(!zfmSort<T_Element>(holder, mid + 1, right, comparer)) {
191 return zffalse;
192 }
193 }
194 return zftrue;
195}
196
199template<typename T_Element, typename T_Holder>
201 ZF_IN T_Holder &holder
202 , ZF_IN zfindex left
203 , ZF_IN zfindex right
205 ) {
206 if(left < right) {
207 zfindex mid = _ZFP_zfmSort<T_Element>(holder, left, right, comparer, zffalse);
208 if(mid == zfindexMax()) {
209 return zffalse;
210 }
211 if(mid > 0) {
212 if(!zfmSortReversely<T_Element>(holder, left, mid - 1, comparer)) {
213 return zffalse;
214 }
215 }
216 if(!zfmSortReversely<T_Element>(holder, mid + 1, right, comparer)) {
217 return zffalse;
218 }
219 }
220 return zftrue;
221}
222
224
225#endif // #ifndef _ZFI_ZFCoreUtilMath_h_
226
common comparer for ZFFramework
#define ZFComparerDefault
default comparer for common types, see ZFComparer
Definition ZFComparer.h:250
#define ZFLIB_ZFCore
used to export symbols
Definition ZFCoreEnvDef.h:30
#define ZF_IN
dummy macro that shows the param used as required input
Definition ZFCoreTypeDef_ClassType.h:180
#define ZF_IN_OPT
dummy macro that shows the param used as optional input
Definition ZFCoreTypeDef_ClassType.h:184
_ZFT_t_zfbool zfbool
bool type
Definition ZFCoreTypeDef_CoreType.h:103
_ZFT_t_zfindex zfindex
similar to size_t, used for index and size only
Definition ZFCoreTypeDef_CoreType.h:154
#define zftrue
bool true type
Definition ZFCoreTypeDef_CoreType.h:107
_ZFT_t_zfint zfint
same as int, see zfindex
Definition ZFCoreTypeDef_CoreType.h:165
#define zfindexMax()
(zfindex)-1, indicate a max index value, see zfindex
Definition ZFCoreTypeDef_CoreType.h:159
_zft_zffloat zffloat
same as float, see zfindex
Definition ZFCoreTypeDef_CoreType.h:183
#define zffalse
bool false type
Definition ZFCoreTypeDef_CoreType.h:111
ZFCompareResult
compare result of two ZFObjects
Definition ZFCoreTypeDef_OtherType.h:28
@ ZFCompareSmaller
Definition ZFCoreTypeDef_OtherType.h:30
@ ZFCompareUncomparable
Definition ZFCoreTypeDef_OtherType.h:29
@ ZFCompareGreater
Definition ZFCoreTypeDef_OtherType.h:32
T_Number const & zfmMin(T_Number const &n0, T_Number const &n1)
well known MIN
Definition ZFCoreUtilMath.h:27
zfint zfmRand(void)
return a random integer in range [0, zfmRandMax]
zfint zfmRandMax(void)
max value for zfmRand
T_zffloat zfmRoundDown(const T_zffloat &v)
util method to round up/down or round a float value
Definition ZFCoreUtilMath.h:86
zfbool zfmSortReversely(T_Holder &holder, zfindex left, zfindex right, typename ZFComparer< T_Element >::Comparer comparer=_ZFP_ZFComparerDefault)
sort with custom comparer in range [left, right], holder must support operator []
Definition ZFCoreUtilMath.h:200
T_Number zfmAbs(T_Number const &n0)
well known ABS
Definition ZFCoreUtilMath.h:37
zffloat zfmRandFloat(void)
return a random float in range [0, 1]
T_Number zfmApplyProgress(T_Number const &start, T_Number const &end, zffloat progress)
return value at progress in range [start, end], progress must in range [0, 1]
Definition ZFCoreUtilMath.h:66
T_Number zfmApplyRange(T_Number const &n, T_Number const &nMin, T_Number const &nMax)
return n if in range [nMin, nMax], return edge value otherwise
Definition ZFCoreUtilMath.h:46
T_zffloat zfmRoundUp(const T_zffloat &v)
util method to round up/down or round a float value
Definition ZFCoreUtilMath.h:78
zfbool zfmSort(T_Holder &holder, zfindex left, zfindex right, typename ZFComparer< T_Element >::Comparer comparer=_ZFP_ZFComparerDefault)
sort with custom comparer in range [left, right], holder must support operator []
Definition ZFCoreUtilMath.h:174
T_Number const & zfmMax(T_Number const &n0, T_Number const &n1)
well known MAX
Definition ZFCoreUtilMath.h:17
T_zffloat zfmRound(const T_zffloat &v)
util method to round up/down or round a float value
Definition ZFCoreUtilMath.h:94
#define ZF_NAMESPACE_GLOBAL_BEGIN
begin namespace ZFFramework
Definition ZFNamespace.h:97
#define ZF_NAMESPACE_GLOBAL_END
end namespace ZFFramework
Definition ZFNamespace.h:98
ZFCompareResult(* Comparer)(T_Comparable const &e0, T_Comparable2 const &e1)
see ZFComparer
Definition ZFCoreTypeDef_OtherType.h:130
static T_zffloat v(void)
template version of zffloatEpsilon
Definition ZFCoreTypeDef_CoreIntType.h:159