diff --git a/uppsrc/Core/Convert.cpp b/uppsrc/Core/Convert.cpp index 68e329de7..f2e9d4854 100644 --- a/uppsrc/Core/Convert.cpp +++ b/uppsrc/Core/Convert.cpp @@ -412,15 +412,29 @@ ConvertDouble& ConvertDouble::Pattern(const char *p) ConvertDouble::~ConvertDouble() {} #endif +Date& ConvertDate::default_min() +{ + static Date v = Date::Low(); + return v; +} + +Date& ConvertDate::default_max() +{ + static Date v = Date::High(); + return v; +} + +void ConvertDate::SetDefaultMinMax(Date min, Date max) +{ + default_min() = min; + default_max() = max; +} + ConvertDate::ConvertDate(Date minval, Date maxval, bool notnull) : minval(minval), maxval(maxval), notnull(notnull) { defaultval = Null; } -ConvertDate::~ConvertDate() -{ -} - Value ConvertDate::Format(const Value& q) const { if(IsDateTime(q)) @@ -428,12 +442,13 @@ Value ConvertDate::Format(const Value& q) const return Convert::Format(q); } - Value ConvertDate::Scan(const Value& text) const { Value v = UPP::Scan(DATE_V, text, defaultval); if(IsError(v)) return v; if(IsNull(v)) return notnull ? NotNullError() : v; Date m = v; + Date minval = GetMin(); + Date maxval = GetMax(); if(m >= minval && m <= maxval) return v; return ErrorValue(t_("Date must be between ") + UPP::Format(minval) + t_("range\v and ") + UPP::Format(maxval) + "."); } @@ -466,6 +481,8 @@ Value ConvertTime::Scan(const Value& text) const m.second = 59; v = m; } + Time minval = GetMin(); + Time maxval = GetMax(); if(m >= minval && m <= maxval) return v; return ErrorValue(t_("Time must be between ") + UPP::Format(minval) + t_("range\v and ") + UPP::Format(maxval) + "."); } diff --git a/uppsrc/Core/Convert.h b/uppsrc/Core/Convert.h index 5954876f6..9b5cd8334 100644 --- a/uppsrc/Core/Convert.h +++ b/uppsrc/Core/Convert.h @@ -148,6 +148,9 @@ public: protected: Date minval, maxval, defaultval; bool notnull; + + static Date& default_min(); + static Date& default_max(); public: ConvertDate& MinMax(Date _min, Date _max) { minval = _min; maxval = _max; return *this; } @@ -156,15 +159,15 @@ public: ConvertDate& NotNull(bool b = true) { notnull = b; return *this; } ConvertDate& NoNotNull() { return NotNull(false); } ConvertDate& Default(Date d) { defaultval = d; return *this; } - Date GetMin() const { return minval; } - Date GetMax() const { return maxval; } bool IsNotNull() const { return notnull; } + Date GetMin() const { return max(GetDefaultMin(), minval); } + Date GetMax() const { return min(GetDefaultMax(), maxval); } - static Date GetDefaultMin() { return Date::Low(); } - static Date GetDefaultMax() { return Date::High(); } + static void SetDefaultMinMax(Date min, Date max); + static Date GetDefaultMin() { return default_min(); } + static Date GetDefaultMax() { return default_max(); } ConvertDate(Date minval = Date::Low(), Date maxval = Date::High(), bool notnull = false); - virtual ~ConvertDate(); }; const ConvertDate& StdConvertDate(); @@ -191,18 +194,19 @@ public: ConvertTime& NoNotNull() { return NotNull(false); } ConvertTime& Seconds(bool b = true) { seconds = b; return *this; } ConvertTime& NoSeconds() { return Seconds(false); } - ConvertTime& TimeAlways(bool b = true) { timealways = b; return *this; } - ConvertTime& DayEnd(bool b = true) { dayend = b; return *this; } - ConvertTime& Default(Time d) { defaultval = d; return *this; } - Time GetMin() const { return minval; } - Time GetMax() const { return maxval; } - bool IsNotNull() const { return notnull; } bool IsSeconds() const { return seconds; } + ConvertTime& TimeAlways(bool b = true) { timealways = b; return *this; } bool IsTimeAlways() const { return timealways; } + ConvertTime& DayEnd(bool b = true) { dayend = b; return *this; } bool IsDayEnd() const { return dayend; } + ConvertTime& Default(Time d) { defaultval = d; return *this; } + bool IsNotNull() const { return notnull; } - static Time GetDefaultMin() { return ToTime(Date::Low()); } - static Time GetDefaultMax() { return ToTime(Date::High()); } + Time GetMin() const { return max(minval, GetDefaultMin()); } + Time GetMax() const { return min(maxval, GetDefaultMax()); } + + static Time GetDefaultMin() { return ToTime(ConvertDate::GetDefaultMin()); } + static Time GetDefaultMax() { return ToTime(ConvertDate::GetDefaultMax()); } ConvertTime(Time minval = ToTime(Date::Low()), Time maxval = ToTime(Date::High()), bool notnull = false); virtual ~ConvertTime(); diff --git a/uppsrc/Core/src.tpp/Convert_en-us.tpp b/uppsrc/Core/src.tpp/Convert_en-us.tpp index 86d5ee2db..ec8dd3984 100644 --- a/uppsrc/Core/src.tpp/Convert_en-us.tpp +++ b/uppsrc/Core/src.tpp/Convert_en-us.tpp @@ -1,5 +1,4 @@ topic "Convert"; -[2 $$0,0#00000000000000000000000000000000:Default] [i448;a25;kKO9;2 $$1,0#37138531426314131252341829483380:class] [l288;2 $$2,0#27521748481378242620020725143825:desc] [0 $$3,0#96390100711032703541132217272105:end] @@ -9,6 +8,7 @@ topic "Convert"; [l288;i1121;b17;O9;~~~.1408;2 $$7,0#10431211400427159095818037425705:param] [i448;b42;O9;2 $$8,8#61672508125594000341940100500538:tparam] [b42;2 $$9,9#13035079074754324216151401829390:normal] +[2 $$0,0#00000000000000000000000000000000:Default] [{_}%EN-US [ {{10000@(113.42.0) [s0; [*@7;4 Convert]]}}&] [s3;%- &] @@ -125,14 +125,38 @@ ll]()&] otNull](false).&] [s3; &] [s4;%- &] +[s5;:Upp`:`:ConvertDate`:`:Default`(Upp`:`:Date`):%- [_^Upp`:`:ConvertDate^ ConvertDate +][@(0.0.255) `&]_[* Default]([_^Upp`:`:Date^ Date]_[*@3 d])&] +[s2; When the text is empty, Scan returns this value.&] +[s3; &] +[s4;%- &] [s5;:ConvertDate`:`:GetMin`(`)const:%- [_^Date^ Date]_[* GetMin]()_[@(0.0.255) const]&] -[s7; [*/ Return value]-|Minimal allowed date.&] +[s2; Returns minimal allowed date. This is maximum of value set by +Min and default minimum (GetDefaultMin).&] [s3; &] [s4;%- &] [s5;:ConvertDate`:`:GetMax`(`)const:%- [_^Date^ Date]_[* GetMax]()_[@(0.0.255) const]&] -[s7; [*/ Return value]-|Maximal allowed date.&] +[s2; Returns upper limit of allowed dates. This is minimum of value +set by Max and default maximum (GetDefaultMax).&] [s3; &] [s4;%- &] +[s5;:Upp`:`:ConvertDate`:`:GetDefaultMin`(`):%- [@(0.0.255) static] +[_^Upp`:`:Date^ Date]_[* GetDefaultMin]()&] +[s2; Returns default minimum.&] +[s3;%- &] +[s4;%- &] +[s5;:Upp`:`:ConvertDate`:`:GetDefaultMax`(`):%- [@(0.0.255) static] +[_^Upp`:`:Date^ Date]_[* GetDefaultMax]()&] +[s2; Returns default maximum.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:ConvertDate`:`:SetDefaultMinMax`(Upp`:`:Date`,Upp`:`:Date`):%- [@(0.0.255) v +oid]_[* SetDefaultMinMax]([_^Upp`:`:Date^ Date]_[*@3 min], [_^Upp`:`:Date^ Date]_[*@3 max]) +&] +[s2; Sets values for default minimum and maximum. Default values +are Date`::Low() and Date`::Hight().&] +[s3;%- &] +[s4;%- &] [s5;:ConvertDate`:`:IsNotNull`(`)const:%- [@(0.0.255) bool]_[* IsNotNull]()_[@(0.0.255) con st]&] [s7; [*/ Return value]-|true is Nulls are disallowed.&] @@ -140,6 +164,132 @@ st]&] [s0; &] [s0;%- &] [s0;%- &] +[ {{10000@(113.42.0) [s0; [*@7;4 ConvertTime]]}}&] +[s3; &] +[s1;:ConvertTime`:`:class:%- [@(0.0.255)3 class][3 _][*3 ConvertTime][3 _:_][@(0.0.255)3 public][3 _ +][*@3;3 Convert]&] +[s9; Time converter.&] +[s0; &] +[s0;%- [%%/ Derived from][%% ][^topic`:`/`/Core`/src`/Convert`$en`-us`#Convert`:`:class^ C +onvert]&] +[s3; &] +[s0; &] +[ {{10000F(128)G(128)@1 [s0; [* Constructor Detail]]}}&] +[s3;%- &] +[s5;:ConvertTime`:`:ConvertTime`(Time`,Time`,bool`):%- [* ConvertTime]([_^Time^ Time]_[*@3 m +inval]_`=_ToTime(Date`::Low()), [_^Time^ Time]_[*@3 maxval]_`=_ToTime(Date`::High()), +[@(0.0.255) bool]_[*@3 notnull]_`=_[@(0.0.255) false])&] +[s2;%- Constructor.&] +[s7; [%-*C@3 minval]-|Lower limit. Default means there is no limit.&] +[s7; [%-*C@3 maxval]-|Upper limit. Default means there is no limit.&] +[s7; [%-*C@3 notnull]-|true disallows Nulls.&] +[s3;%- &] +[s4;%- &] +[s5;:ConvertTime`:`:`~ConvertTime`(`):%- [@(0.0.255) `~][* ConvertTime]()&] +[s2; Default destructor.&] +[s3; &] +[s0; &] +[ {{10000F(128)G(128)@1 [s0; [* Public Member List]]}}&] +[s3;%- &] +[s5;:ConvertTime`:`:MinMax`(Time`,Time`):%- [_^ConvertTime^ ConvertTime][@(0.0.255) `&]_[* M +inMax]([_^Time^ Time]_[*@3 `_min], [_^Time^ Time]_[*@3 `_max])&] +[s2;%- Time limeits.&] +[s7; [%-*C@3 `_min]-|Lower limit.&] +[s7; [%-*C@3 `_max]-|Upper limit.&] +[s7; [*/ Return value]-|`*this.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:ConvertTime`:`:Min`(Upp`:`:Time`):%- [_^Upp`:`:ConvertTime^ ConvertTime][@(0.0.255) `& +]_[* Min]([_^Upp`:`:Time^ Time]_[*@3 `_min])&] +[s2; Sets lower limit.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:ConvertTime`:`:Max`(Upp`:`:Time`):%- [_^Upp`:`:ConvertTime^ ConvertTime][@(0.0.255) `& +]_[* Max]([_^Upp`:`:Time^ Time]_[*@3 `_max])&] +[s2; Sets upper limit.&] +[s3; &] +[s4;%- &] +[s5;:ConvertTime`:`:NotNull`(bool`):%- [_^ConvertTime^ ConvertTime][@(0.0.255) `&]_[* NotNu +ll]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] +[s2; Disallows empty Strings.&] +[s7; [%-*C@3 b]-|true to disallow.&] +[s7; [*/ Return value]-|`*this.&] +[s3; &] +[s4;%- &] +[s5;:ConvertTime`:`:NoNotNull`(`):%- [_^ConvertTime^ ConvertTime][@(0.0.255) `&]_[* NoNotNu +ll]()&] +[s2; Same as [^topic`:`/`/Core`/src`/Convert`$en`-us`#ConvertTime`:`:NotNull`(bool`)^ N +otNull](false).&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:ConvertTime`:`:Seconds`(bool`):%- [_^Upp`:`:ConvertTime^ ConvertTime][@(0.0.255) `& +]_[* Seconds]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] +[s2; If true (which is default), Format returns time with seconds.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:ConvertTime`:`:NoSeconds`(`):%- [_^Upp`:`:ConvertTime^ ConvertTime][@(0.0.255) `& +]_[* NoSeconds]()&] +[s2; Same as Seconds(fale)&] +[s3;%- &] +[s4;%- &] +[s5;:Upp`:`:ConvertTime`:`:IsSeconds`(`)const:%- [@(0.0.255) bool]_[* IsSeconds]()_[@(0.0.255) c +onst]&] +[s2; Returns the value set by Seconds.,&] +[s3;%- &] +[s4;%- &] +[s5;:ConvertTime`:`:TimeAlways`(bool`):%- [_^ConvertTime^ ConvertTime][@(0.0.255) `&]_[* Ti +meAlways]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] +[s2; If active, Format always shows time, even if the Value is Date +or is at midnight. Default is false.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:ConvertTime`:`:IsTimeAlways`(`)const:%- [@(0.0.255) bool]_[* IsTimeAlways]()_ +[@(0.0.255) const]&] +[s2; Returns the value set by TimeAlways.&] +[s3;%- &] +[s4;%- &] +[s5;:ConvertTime`:`:DayEnd`(bool`):%- [_^ConvertTime^ ConvertTime][@(0.0.255) `&]_[* DayEnd +]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] +[s2; If active, when Scan encounters date without time, it sets the +time to 23:59:59. Default is false.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:ConvertTime`:`:IsDayEnd`(`)const:%- [@(0.0.255) bool]_[* IsDayEnd]()_[@(0.0.255) c +onst]&] +[s2; Returns the value set by DayEnd.&] +[s3;%- &] +[s4;%- &] +[s5;:Upp`:`:ConvertTime`:`:Default`(Upp`:`:Time`):%- [_^Upp`:`:ConvertTime^ ConvertTime +][@(0.0.255) `&]_[* Default]([_^Upp`:`:Time^ Time]_[*@3 d])&] +[s2; Sets default time returned by Scan when input is empty.&] +[s3; &] +[s4;%- &] +[s5;:ConvertTime`:`:GetMin`(`)const:%- [_^Time^ Time]_[* GetMin]()_[@(0.0.255) const]&] +[s2; Returns minimal allowed time. This is maximum of value set by +Min and default minimum (GetDefaultMin).&] +[s3; &] +[s4;%- &] +[s5;:ConvertTime`:`:GetMax`(`)const:%- [_^Time^ Time]_[* GetMax]()_[@(0.0.255) const]&] +[s2; Returns upper limit of allowed times. This is minimum of value +set by Max and default maximum (GetDefaultMax).&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:ConvertTime`:`:GetDefaultMin`(`):%- [@(0.0.255) static] +[_^Upp`:`:Time^ Time]_[* GetDefaultMin]()&] +[s2; Returns Date`::GetDefaultMin converted to Time.&] +[s3;%- &] +[s4;%- &] +[s5;:Upp`:`:ConvertTime`:`:GetDefaultMax`(`):%- [@(0.0.255) static] +[_^Upp`:`:Time^ Time]_[* GetDefaultMax]()&] +[s2; Returns Date`::GetDefaultMax converted to Time.&] +[s3;%- &] +[s4;%- &] +[s5;:ConvertTime`:`:IsNotNull`(`)const:%- [@(0.0.255) bool]_[* IsNotNull]()_[@(0.0.255) con +st]&] +[s7; [*/ Return value]-|true means Nulls are disallowed.&] +[s3; &] +[s0; &] +[s0;%- &] [ {{10000@(113.42.0) [s0; [*@7;4 ConvertDouble]]}}&] [s3; &] [s1;:ConvertDouble`:`:class:%- [@(0.0.255)3 class][3 _][*3 ConvertDouble][3 _:_][@(0.0.255)3 pub @@ -388,81 +538,6 @@ onst]&] [s0; &] [s0; &] [s0;%- &] -[ {{10000@(113.42.0) [s0; [*@7;4 ConvertString]]}}&] -[s3; &] -[s1;:ConvertTime`:`:class:%- [@(0.0.255)3 class][3 _][*3 ConvertTime][3 _:_][@(0.0.255)3 public][3 _ -][*@3;3 Convert]&] -[s9; Time converter.&] -[s0; &] -[s0;%- [%%/ Derived from][%% ][^topic`:`/`/Core`/src`/Convert`$en`-us`#Convert`:`:class^ C -onvert]&] -[s3; &] -[s0; &] -[ {{10000F(128)G(128)@1 [s0; [* Constructor Detail]]}}&] -[s3;%- &] -[s5;:ConvertTime`:`:ConvertTime`(Time`,Time`,bool`):%- [* ConvertTime]([_^Time^ Time]_[*@3 m -inval]_`=_ToTime(Date`::Low()), [_^Time^ Time]_[*@3 maxval]_`=_ToTime(Date`::High()), -[@(0.0.255) bool]_[*@3 notnull]_`=_[@(0.0.255) false])&] -[s2;%- Constructor.&] -[s7; [%-*C@3 minval]-|Lower limit. Default means there is no limit.&] -[s7; [%-*C@3 maxval]-|Upper limit. Default means there is no limit.&] -[s7; [%-*C@3 notnull]-|true disallows Nulls.&] -[s3;%- &] -[s4;%- &] -[s5;:ConvertTime`:`:`~ConvertTime`(`):%- [@(0.0.255) `~][* ConvertTime]()&] -[s2; Default destructor.&] -[s3; &] -[s0; &] -[ {{10000F(128)G(128)@1 [s0; [* Public Member List]]}}&] -[s3;%- &] -[s5;:ConvertTime`:`:MinMax`(Time`,Time`):%- [_^ConvertTime^ ConvertTime][@(0.0.255) `&]_[* M -inMax]([_^Time^ Time]_[*@3 `_min], [_^Time^ Time]_[*@3 `_max])&] -[s2;%- Time limeits.&] -[s7; [%-*C@3 `_min]-|Lower limit.&] -[s7; [%-*C@3 `_max]-|Upper limit.&] -[s7; [*/ Return value]-|`*this.&] -[s3; &] -[s4;%- &] -[s5;:ConvertTime`:`:NotNull`(bool`):%- [_^ConvertTime^ ConvertTime][@(0.0.255) `&]_[* NotNu -ll]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s2; Disallows empty Strings.&] -[s7; [%-*C@3 b]-|true to disallow.&] -[s7; [*/ Return value]-|`*this.&] -[s3; &] -[s4;%- &] -[s5;:ConvertTime`:`:NoNotNull`(`):%- [_^ConvertTime^ ConvertTime][@(0.0.255) `&]_[* NoNotNu -ll]()&] -[s2; Same as [^topic`:`/`/Core`/src`/Convert`$en`-us`#ConvertTime`:`:NotNull`(bool`)^ N -otNull](false).&] -[s3; &] -[s4;%- &] -[s5;:ConvertTime`:`:TimeAlways`(bool`):%- [_^ConvertTime^ ConvertTime][@(0.0.255) `&]_[* Ti -meAlways]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s2; If active, Format always shows time, even if the Value is Date -or is at midnight.&] -[s3; &] -[s4;%- &] -[s5;:ConvertTime`:`:DayEnd`(bool`):%- [_^ConvertTime^ ConvertTime][@(0.0.255) `&]_[* DayEnd -]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s2; If active, when Scan encounters date without time, it sets the -time to 23:59:59.&] -[s3; &] -[s4;%- &] -[s5;:ConvertTime`:`:GetMin`(`)const:%- [_^Time^ Time]_[* GetMin]()_[@(0.0.255) const]&] -[s7; [*/ Return value]-|Lower limit.&] -[s3; &] -[s4;%- &] -[s5;:ConvertTime`:`:GetMax`(`)const:%- [_^Time^ Time]_[* GetMax]()_[@(0.0.255) const]&] -[s7; [*/ Return value]-|Upper limit.&] -[s3; &] -[s4;%- &] -[s5;:ConvertTime`:`:IsNotNull`(`)const:%- [@(0.0.255) bool]_[* IsNotNull]()_[@(0.0.255) con -st]&] -[s7; [*/ Return value]-|true means Nulls are disallowed.&] -[s3; &] -[s0; &] -[s0; &] -[s0;%- &] [ {{10000@(113.42.0) [s0; [*@7;4 FormatConvert]]}}&] [s3; &] [s1;:FormatConvert`:`:class:%- [@(0.0.255)3 class][3 _][*3 FormatConvert][3 _:_][@(0.0.255)3 pub