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// ============================================================
106template<typename T_int>
107T_int zfmRand(ZF_IN T_int const &range) {
108 return (T_int)(range * zfmRand());
109}
110
113template<typename T_int>
115 ZF_IN T_int const &start
116 , ZF_IN T_int const &end
117 ) {
118 return start + (T_int)((end - start) * zfmRand());
119}
120
121// ============================================================
122template<typename T_Element, typename T_Holder>
123zfindex _ZFP_zfmSort(
124 ZF_IN T_Holder &holder
125 , ZF_IN zfindex left
126 , ZF_IN zfindex right
127 , ZF_IN typename ZFComparer<T_Element>::Comparer comparer
128 , ZF_IN zfbool ascending
129 ) {
130 ZFCompareResult cmpToken = (ascending ? ZFCompareGreater : ZFCompareSmaller);
131 T_Element pivot = holder[left];
133 while(left < right) {
134 while(left < right) {
135 cmpTmp = comparer(pivot, holder[right]);
136 if(cmpTmp == ZFCompareUncomparable) {
137 holder[left] = pivot;
138 return zfindexMax();
139 }
140 else if(cmpTmp == cmpToken) {
141 break;
142 }
143 --right;
144 }
145 holder[left] = holder[right];
146 while(left < right) {
147 cmpTmp = comparer(holder[left], pivot);
148 if(cmpTmp == ZFCompareUncomparable) {
149 holder[right] = pivot;
150 return zfindexMax();
151 }
152 else if(cmpTmp == cmpToken) {
153 break;
154 }
155 ++left;
156 }
157 holder[right] = holder[left];
158 }
159 holder[left] = pivot;
160 return left;
161}
165template<typename T_Element, typename T_Holder>
167 ZF_IN T_Holder &holder
168 , ZF_IN zfindex left
169 , ZF_IN zfindex right
171 ) {
172 if(left < right) {
173 zfindex mid = _ZFP_zfmSort<T_Element>(holder, left, right, comparer, zftrue);
174 if(mid == zfindexMax()) {
175 return zffalse;
176 }
177 if(mid > 0) {
178 if(!zfmSort<T_Element>(holder, left, mid - 1, comparer)) {
179 return zffalse;
180 }
181 }
182 if(!zfmSort<T_Element>(holder, mid + 1, right, comparer)) {
183 return zffalse;
184 }
185 }
186 return zftrue;
187}
188
191template<typename T_Element, typename T_Holder>
193 ZF_IN T_Holder &holder
194 , ZF_IN zfindex left
195 , ZF_IN zfindex right
197 ) {
198 if(left < right) {
199 zfindex mid = _ZFP_zfmSort<T_Element>(holder, left, right, comparer, zffalse);
200 if(mid == zfindexMax()) {
201 return zffalse;
202 }
203 if(mid > 0) {
204 if(!zfmSortReversely<T_Element>(holder, left, mid - 1, comparer)) {
205 return zffalse;
206 }
207 }
208 if(!zfmSortReversely<T_Element>(holder, mid + 1, right, comparer)) {
209 return zffalse;
210 }
211 }
212 return zftrue;
213}
214
216
217#endif // #ifndef _ZFI_ZFCoreUtilMath_h_
218
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
zffloat zfmRand(void)
return a random float in range [0, 1]
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:192
T_Number zfmAbs(T_Number const &n0)
well known ABS
Definition ZFCoreUtilMath.h:37
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:166
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