diff --git a/uppsrc/Core/Defs.h b/uppsrc/Core/Defs.h index 0aa153ec0..f34e9b13e 100644 --- a/uppsrc/Core/Defs.h +++ b/uppsrc/Core/Defs.h @@ -217,6 +217,9 @@ template inline const T& max(const T& a, const T& b) { return a > b ? template inline T minmax(T x, T _min, T _max) { return min(max(x, _min), _max); } +template +inline T clamp(T x, T _min, T _max) { return minmax(x, _min, _max); } + //$-int findarg(const T& x, const T1& p0, ...); inline void findarg_NOP() {} // Only to make List work for findarg @@ -241,6 +244,48 @@ __Expand40(E__NFBody) //$+ +//$-D decode(const T& x, const T1& p0, const V1& v0, ...); +#define E__TL(I) typename COMBINE(T, I), typename COMBINE(V, I) +#define E__NFIf(I) findarg_NOP(); if(x == COMBINE(p, I)) return COMBINE(v, I); findarg_NOP() +#define E__NFValue(I) const COMBINE(T, I)& COMBINE(p, I), const COMBINE(V, I)& COMBINE(v, I) + +#define E__NFBody(I) \ +template \ +D decode(const T& x, __List##I(E__NFValue), const D& def) \ +{ \ + __List##I(E__NFIf); \ + return def; \ +} + +__Expand40(E__NFBody) + +#undef E__TL +#undef E__NFIf +#undef E__NFValue +#undef E__NFBody +//$+ + +//$-const char *decode(const T& x, const T1& p0, const char *v0, ...); +#define E__TL(I) typename COMBINE(T, I) +#define E__NFIf(I) findarg_NOP(); if(x == COMBINE(p, I)) return COMBINE(v, I); findarg_NOP() +#define E__NFValue(I) const COMBINE(T, I)& COMBINE(p, I), const char *COMBINE(v, I) + +#define E__NFBody(I) \ +template \ +const char *decode(const T& x, __List##I(E__NFValue), const char *def) \ +{ \ + __List##I(E__NFIf); \ + return def; \ +} + +__Expand40(E__NFBody) + +#undef E__TL +#undef E__NFIf +#undef E__NFValue +#undef E__NFBody +//$+ + typedef unsigned char byte; typedef signed char int8; typedef unsigned char uint8; diff --git a/uppsrc/Core/src.tpp/AppEnv$en-us.tpp b/uppsrc/Core/src.tpp/AppEnv$en-us.tpp index 02a2d8fe9..21d88465a 100644 --- a/uppsrc/Core/src.tpp/AppEnv$en-us.tpp +++ b/uppsrc/Core/src.tpp/AppEnv$en-us.tpp @@ -144,19 +144,39 @@ URL that will be opened in the browser&] [s4; &] [s5;:minmax`(T`,T`,T`): [@(0.0.255) template]_<[@(0.0.255) class]_[*@4 T]>_[*@4 T]_[* minmax]([*@4 T ]_[*@3 x], [*@4 T]_[*@3 `_min], [*@4 T]_[*@3 `_max])&] +[s5;:clamp`(T`,T`,T`): [@(0.0.255) template]_<[@(0.0.255) class]_[*@4 T]>_[*@4 T]_[* clamp]([*@4 T +]_[*@3 x], [*@4 T]_[*@3 `_min], [*@4 T]_[*@3 `_max])&] [s2;%% Returns [%-*@3 x] if it is between [%-*@3 `_min] and [%-*@3 `_max].&] [s2; [%% If ][*@3 x][%% is lower than ][*@3 `_min][%% it returns ][*@3 `_min.]&] [s0;l288; [%% If ][*@3 x][%% is higher than ][*@3 `_max][%% it returns ][*@3 `_max.]&] [s3;%% &] [s4; &] [s5;:findarg`(const T`&`,const T1`&`,`.`.`.`): [@(0.0.255) template]_<[@(0.0.255) class]_ -[*@4 T]>_[@(0.0.255) int]_[* findarg]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 x], -[@(0.0.255) const]_[*@4 T1][@(0.0.255) `&]_[*@3 p0], ...)&] +[*@4 T], [@(0.0.255) class]_[*@4 T1], ...>_[@(0.0.255) int]_[* findarg]([@(0.0.255) const]_[*@4 T +][@(0.0.255) `&]_[*@3 x], [@(0.0.255) const]_[*@4 T1][@(0.0.255) `&]_[*@3 p0], +...)&] [s2;%% Searches the list of arguments for the value of [%-*@3 x]. If it is found, function returns the index of argument (starting with 0). If not found, `-1 is returned.&] [s3;%% &] [s4; &] +[s5;:decode`(const T`&`,const T1`&`,const V1`&`,`.`.`.`): [@(0.0.255) template]_<[@(0.0.255) c +lass]_[*@4 T], [@(0.0.255) class]_[*@4 T1], [@(0.0.255) class]_[*@4 V1], +..., [@(0.0.255) class]_[*@4 D]>&] +[s5; [*@4 D]_[* decode]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 x], [@(0.0.255) const]_[*@4 T1 +][@(0.0.255) `&]_[*@3 p0], [@(0.0.255) const]_[*@4 V1][@(0.0.255) `&]_[*@3 v0], +..., [@(0.0.255) const]_[*@4 D][@(0.0.255) `&]_[*@3 def])&] +[s5;:decode`(const T`&`,const T1`&`,const char`*`,`.`.`.`): [@(0.0.255) template]_<[@(0.0.255) c +lass]_[*@4 T], [@(0.0.255) class]_[*@4 T1], ...>&] +[s5; [@(0.0.255) const]_[@(0.0.255) char]_`*[* decode]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_ +[*@3 x], [@(0.0.255) const]_[*@4 T1][@(0.0.255) `&]_[*@3 p0], [@(0.0.255) const]_[@(0.0.255) ch +ar]_`*[*@3 v0], ..., [@(0.0.255) const]_[*@4 D][@(0.0.255) `&]_[*@3 def])&] +[s2;%% Searches the list of argument pairs for the value of [%-*@3 x] +to be equal to the first argument in the pair. If found, returns +the second argument of pair. If no match is found, returns the +last argument [%-*@3 def].&] +[s3;%% &] +[s4; &] [s5;:CpuSSE`(`): [@(0.0.255) bool]_[* CpuSSE]()&] [s2;%% Returns true if CPU has SSE support.&] [s3; &]