Core: min/max now up to 40 arguments

git-svn-id: svn://ultimatepp.org/upp/trunk@10412 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2016-11-12 15:59:18 +00:00
parent e6112857e4
commit b359c6c6de
3 changed files with 38 additions and 33 deletions

View file

@ -216,18 +216,35 @@ static void COMBINE(MK__s, _fn)() { x } static UPP::Callexit MK__s(COMBINE(MK__s
#undef max #undef max
#endif #endif
//$-template <class T> inline const T& min(const T& a, const T& b, ...);
//$-template <class T> inline const T& max(const T& a, const T& b, ...);
template <class T> inline const T& min(const T& a, const T& b) { return a < b ? a : b; } template <class T> inline const T& min(const T& a, const T& b) { return a < b ? a : b; }
template <class T> inline const T& min(const T& a, const T& b, const T& c)
{ return min(a, min(b, c)); }
template <class T> inline const T& min(const T& a, const T& b, const T& c, const T& d)
{ return min(min(a, b), min(c, d)); }
template <class T> inline const T& max(const T& a, const T& b) { return a > b ? a : b; } template <class T> inline const T& max(const T& a, const T& b) { return a > b ? a : b; }
template <class T> inline const T& max(const T& a, const T& b, const T& c)
{ return max(a, max(b, c)); } #define E__MinMaxParam(I) const T& COMBINE(p, I)
template <class T> inline const T& max(const T& a, const T& b, const T& c, const T& d) #define E__MinMaxValue(I) COMBINE(p, I)
{ return max(max(a, b), max(c, d)); }
#define E__MinBody(I) \
template <class T> \
const T& min(const T& a, const T& b, __List##I(E__MinMaxParam)) \
{\
return min(a, min(b, __List##I(E__MinMaxValue))); \
} \
__Expand40(E__MinBody)
#define E__MaxBody(I) \
template <class T> \
const T& max(const T& a, const T& b, __List##I(E__MinMaxParam)) \
{\
return max(a, max(b, __List##I(E__MinMaxValue))); \
} \
__Expand40(E__MaxBody)
//$+
template <class T> // deprecated name, use clamp template <class T> // deprecated name, use clamp
inline T minmax(T x, T _min, T _max) { return min(max(x, _min), _max); } inline T minmax(T x, T _min, T _max) { return min(max(x, _min), _max); }

4
uppsrc/Core/init Normal file
View file

@ -0,0 +1,4 @@
#ifndef _Core_icpp_init_stub
#define _Core_icpp_init_stub
#include "plugin\z/init"
#endif

View file

@ -167,33 +167,17 @@ URL that will be opened in the browser&]
[s4; &] [s4; &]
[s5;:CpuMMX`(`): [@(0.0.255) bool]_[* CpuMMX]()&] [s5;:CpuMMX`(`): [@(0.0.255) bool]_[* CpuMMX]()&]
[s2;%% Returns true if CPU has MMX support.&] [s2;%% Returns true if CPU has MMX support.&]
[s3; &] [s3;%% &]
[s4; &] [s4; &]
[s5;:min`(const T`&`,const T`&`): [@(0.0.255) template]_<[@(0.0.255) class]_[*@4 T]>_[@(0.0.255) c [s5;:Upp`:`:min`(const T`&`,const T`&`,`.`.`.`): [@(0.0.255) template]_<[@(0.0.255) class
onst]_[*@4 T][@(0.0.255) `&]_[* min]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 a], ]_[*@4 T]>_[@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* min]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&
[@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 b])&] ]_[*@3 a], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 b], ...)&]
[s5;:min`(const T`&`,const T`&`,const T`&`): [@(0.0.255) template]_<[@(0.0.255) class]_[*@4 T
]>_[@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* min]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_
[*@3 a], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 b], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&
]_[*@3 c])&]
[s5;:min`(const T`&`,const T`&`,const T`&`,const T`&`): [@(0.0.255) template]_<[@(0.0.255) c
lass]_[*@4 T]>_[@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* min]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&
]_[*@3 a], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 b], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&
]_[*@3 c], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 d])&]
[s2;%% Returns the least of all arguments.&] [s2;%% Returns the least of all arguments.&]
[s3;%% &] [s3;%% &]
[s4; &] [s4; &]
[s5;:max`(const T`&`,const T`&`): [@(0.0.255) template]_<[@(0.0.255) class]_[*@4 T]>_[@(0.0.255) c [s5;:Upp`:`:max`(const T`&`,const T`&`,`.`.`.`): [@(0.0.255) template]_<[@(0.0.255) class
onst]_[*@4 T][@(0.0.255) `&]_[* max]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 a], ]_[*@4 T]>_[@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* max]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&
[@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 b])&] ]_[*@3 a], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 b], ...)&]
[s5;:max`(const T`&`,const T`&`,const T`&`): [@(0.0.255) template]_<[@(0.0.255) class]_[*@4 T
]>_[@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* max]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_
[*@3 a], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 b], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&
]_[*@3 c])&]
[s5;:max`(const T`&`,const T`&`,const T`&`,const T`&`): [@(0.0.255) template]_<[@(0.0.255) c
lass]_[*@4 T]>_[@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* max]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&
]_[*@3 a], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 b], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&
]_[*@3 c], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 d])&]
[s2;%% Returns the greatest of all arguments.&] [s2;%% Returns the greatest of all arguments.&]
[s3;%% &] [s3;%% &]
[s4; &] [s4; &]