17 private enum TTT :
byte
90 internal bool EOL =>
_pos >= _value.Length - 1;
113 _pos = startPosition;
123 int num =
_value[pos] - 48;
152 num = num * 10 + num4;
153 if ((num & 0xF0000000u) != 0
L)
353 if (!
AddSep(tok._sep, ref result))
358 case TTT.NumOverflow:
359 return result.SetOverflowFailure();
361 return result.SetBadTimeSpanFailure();
371 return result.SetBadTimeSpanFailure();
402 return result.SetBadTimeSpanFailure();
530 if (c <
'0' || c >
'9')
540 result.parsedTimeSpan =
default(
TimeSpan);
562 if (!
ParseInt(10675199, out var i, ref result))
566 time = i * 864000000000
L;
570 if (!
ParseTime(out var time2, ref result))
582 return result.SetOverflowFailure();
587 return result.SetOverflowFailure();
592 return result.SetBadTimeSpanFailure();
594 result.parsedTimeSpan =
new TimeSpan(time);
602 while (
_ch >=
'0' &&
_ch <=
'9')
604 if ((i & 0xF0000000u) != 0
L)
606 return result.SetOverflowFailure();
608 i = i * 10 +
_ch - 48;
611 return result.SetOverflowFailure();
617 return result.SetBadTimeSpanFailure();
621 return result.SetOverflowFailure();
629 if (!
ParseInt(23, out var i, ref result))
633 time = i * 36000000000
L;
636 return result.SetBadTimeSpanFailure();
639 if (!
ParseInt(59, out i, ref result))
643 time += (long)i * 600000000
L;
649 if (!
ParseInt(59, out i, ref result))
653 time += (long)i * 10000000
L;
659 while (num > 1 &&
_ch >=
'0' &&
_ch <=
'9')
662 time += (
_ch - 48) * num;
672 while (
_ch ==
' ' ||
_ch ==
'\t')
691 _ => (long)
Math.
Pow(10.0, pow),
702 long num = ((long)days.
_num * 3600
L * 24 + (
long)hours._num * 3600
L + (long)minutes.
_num * 60
L + seconds.
_num) * 1000;
703 if (num > 922337203685477
L || num < -922337203685477
L)
708 result = num * 10000 + fraction.
_num;
709 if (positive && result < 0)
779 return result.SetBadTimeSpanFailure();
789 return result.SetBadTimeSpanFailure();
795 return result.SetBadTimeSpanFailure();
802 if (raw._lastSeenTTT ==
TTT.Num)
806 if (!raw.ProcessToken(ref tok, ref result))
808 return result.SetBadTimeSpanFailure();
811 return raw._numCount
switch
818 _ => result.SetBadTimeSpanFailure(),
824 if (raw._sepCount != 6)
826 return result.SetBadTimeSpanFailure();
847 if (!flag4 && raw.FullMatch(raw.PositiveLocalized))
852 if (!flag4 && raw.FullMatch(raw.NegativeLocalized))
860 if (!
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, raw._numbers3, raw._numbers4, out var result2))
862 return result.SetOverflowFailure();
869 return result.SetOverflowFailure();
872 result.parsedTimeSpan =
new TimeSpan(result2);
875 return result.SetBadTimeSpanFailure();
882 return result.SetBadTimeSpanFailure();
896 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, raw._numbers2, raw._numbers3, out result2);
897 flag5 = flag5 || !flag4;
902 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, raw._numbers3, timeSpanToken, out result2);
903 flag5 = flag5 || !flag4;
908 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, raw._numbers3, out result2);
909 flag5 = flag5 || !flag4;
914 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, raw._numbers2, raw._numbers3, out result2);
915 flag5 = flag5 || !flag4;
920 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, raw._numbers3, timeSpanToken, out result2);
921 flag5 = flag5 || !flag4;
926 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, raw._numbers3, out result2);
927 flag5 = flag5 || !flag4;
932 if (!flag4 && raw.FullHMSFMatch(raw.PositiveLocalized))
935 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, raw._numbers2, raw._numbers3, out result2);
936 flag5 = flag5 || !flag4;
938 if (!flag4 && raw.FullDHMSMatch(raw.PositiveLocalized))
941 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, raw._numbers3, timeSpanToken, out result2);
942 flag5 = flag5 || !flag4;
944 if (!flag4 && raw.FullAppCompatMatch(raw.PositiveLocalized))
947 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, raw._numbers3, out result2);
948 flag5 = flag5 || !flag4;
950 if (!flag4 && raw.FullHMSFMatch(raw.NegativeLocalized))
953 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, raw._numbers2, raw._numbers3, out result2);
954 flag5 = flag5 || !flag4;
956 if (!flag4 && raw.FullDHMSMatch(raw.NegativeLocalized))
959 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, raw._numbers3, timeSpanToken, out result2);
960 flag5 = flag5 || !flag4;
962 if (!flag4 && raw.FullAppCompatMatch(raw.NegativeLocalized))
965 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, raw._numbers3, out result2);
966 flag5 = flag5 || !flag4;
976 return result.SetOverflowFailure();
979 result.parsedTimeSpan =
new TimeSpan(result2);
984 return result.SetBadTimeSpanFailure();
986 return result.SetOverflowFailure();
993 return result.SetBadTimeSpanFailure();
1007 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, out result2);
1008 flag5 = flag5 || !flag4;
1013 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, timeSpanToken, out result2);
1014 flag5 = flag5 || !flag4;
1019 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, timeSpanToken, raw._numbers2, out result2);
1020 flag5 = flag5 || !flag4;
1025 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, out result2);
1026 flag5 = flag5 || !flag4;
1031 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, timeSpanToken, out result2);
1032 flag5 = flag5 || !flag4;
1037 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, timeSpanToken, raw._numbers2, out result2);
1038 flag5 = flag5 || !flag4;
1043 if (!flag4 && raw.FullHMSMatch(raw.PositiveLocalized))
1046 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, out result2);
1047 flag5 = flag5 || !flag4;
1049 if (!flag4 && raw.FullDHMMatch(raw.PositiveLocalized))
1052 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, timeSpanToken, out result2);
1053 flag5 = flag5 || !flag4;
1055 if (!flag4 && raw.PartialAppCompatMatch(raw.PositiveLocalized))
1058 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, timeSpanToken, raw._numbers2, out result2);
1059 flag5 = flag5 || !flag4;
1061 if (!flag4 && raw.FullHMSMatch(raw.NegativeLocalized))
1064 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, out result2);
1065 flag5 = flag5 || !flag4;
1067 if (!flag4 && raw.FullDHMMatch(raw.NegativeLocalized))
1070 flag4 =
TryTimeToTicks(flag3, raw._numbers0, raw._numbers1, raw._numbers2, timeSpanToken, timeSpanToken, out result2);
1071 flag5 = flag5 || !flag4;
1073 if (!flag4 && raw.PartialAppCompatMatch(raw.NegativeLocalized))
1076 flag4 =
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, timeSpanToken, raw._numbers2, out result2);
1077 flag5 = flag5 || !flag4;
1087 return result.SetOverflowFailure();
1090 result.parsedTimeSpan =
new TimeSpan(result2);
1095 return result.SetBadTimeSpanFailure();
1097 return result.SetOverflowFailure();
1104 return result.SetBadTimeSpanFailure();
1125 if (!flag4 && raw.FullHMMatch(raw.PositiveLocalized))
1130 if (!flag4 && raw.FullHMMatch(raw.NegativeLocalized))
1139 if (!
TryTimeToTicks(flag3, timeSpanToken, raw._numbers0, raw._numbers1, timeSpanToken, timeSpanToken, out var result2))
1141 return result.SetOverflowFailure();
1148 return result.SetOverflowFailure();
1151 result.parsedTimeSpan =
new TimeSpan(result2);
1154 return result.SetBadTimeSpanFailure();
1161 return result.SetBadTimeSpanFailure();
1182 if (!flag4 && raw.FullDMatch(raw.PositiveLocalized))
1187 if (!flag4 && raw.FullDMatch(raw.NegativeLocalized))
1196 if (!
TryTimeToTicks(flag3, raw._numbers0, timeSpanToken, timeSpanToken, timeSpanToken, timeSpanToken, out var result2))
1198 return result.SetOverflowFailure();
1205 return result.SetOverflowFailure();
1208 result.parsedTimeSpan =
new TimeSpan(result2);
1211 return result.SetBadTimeSpanFailure();
1218 return result.SetBadFormatSpecifierFailure();
1233 return result.SetBadFormatSpecifierFailure(
format[0]);
1255 for (; i <
format.Length; i += returnValue)
1262 if (returnValue > 2 || flag2 || !
ParseExactDigits(ref tokenizer, returnValue, out result3))
1264 return result.SetInvalidStringFailure();
1270 if (returnValue > 2 || flag3 || !
ParseExactDigits(ref tokenizer, returnValue, out result4))
1272 return result.SetInvalidStringFailure();
1278 if (returnValue > 2 || flag4 || !
ParseExactDigits(ref tokenizer, returnValue, out result5))
1280 return result.SetInvalidStringFailure();
1286 if (returnValue > 7 || flag5 || !
ParseExactDigits(ref tokenizer, returnValue, returnValue, out zeroes, out result6))
1288 return result.SetInvalidStringFailure();
1294 if (returnValue > 7 || flag5)
1296 return result.SetInvalidStringFailure();
1298 ParseExactDigits(ref tokenizer, returnValue, returnValue, out zeroes, out result6);
1304 if (returnValue > 8 || flag || !
ParseExactDigits(ref tokenizer, (returnValue < 2) ? 1 : returnValue, (returnValue < 2) ? 8 : returnValue, out var _, out result2))
1306 return result.SetInvalidStringFailure();
1318 return result.SetBadQuoteFailure(c);
1323 return result.SetInvalidStringFailure();
1331 if (num >= 0 && num != 37)
1336 return result.SetInvalidStringFailure();
1341 if (num >= 0 && tokenizer.NextChar == (ushort)num)
1346 return result.SetInvalidStringFailure();
1349 return result.SetInvalidStringFailure();
1354 return result.SetBadTimeSpanFailure();
1363 result.parsedTimeSpan =
new TimeSpan(result7);
1366 return result.SetOverflowFailure();
1371 int maxDigitLength = ((minDigitLength == 1) ? 2 : minDigitLength);
1373 return ParseExactDigits(ref tokenizer, minDigitLength, maxDigitLength, out zeroes, out result);
1381 for (i = 0; i < maxDigitLength; i++)
1383 char nextChar = tokenizer.NextChar;
1384 if (nextChar <
'0' || nextChar >
'9')
1386 tokenizer.BackOne();
1389 num = num * 10 + (nextChar - 48);
1397 return i >= minDigitLength;
1402 for (
int i = 0; i < enquotedString.
Length; i++)
1404 if (enquotedString[i] != tokenizer.NextChar)
1421 return result.SetArgumentNullFailure(
"formats");
1423 if (
input.Length == 0)
1425 return result.SetBadTimeSpanFailure();
1429 return result.SetNoFormatSpecifierFailure();
1433 if (
string.IsNullOrEmpty(
text))
1435 return result.SetBadFormatSpecifierFailure();
1444 return result.SetBadTimeSpanFailure();
static bool TryParseQuoteString(ReadOnlySpan< char > format, int pos, StringBuilder result, out int returnValue)
static bool ParseExactLiteral(ref TimeSpanTokenizer tokenizer, StringBuilder enquotedString)
static bool TryParseByFormat(ReadOnlySpan< char > input, ReadOnlySpan< char > format, TimeSpanStyles styles, ref TimeSpanResult result)
static TimeSpan Parse(ReadOnlySpan< char > input, IFormatProvider formatProvider)
static TimeSpan ParseExactMultiple(ReadOnlySpan< char > input, string[] formats, IFormatProvider formatProvider, TimeSpanStyles styles)
static bool ProcessTerminal_HM(ref TimeSpanRawInfo raw, TimeSpanStandardStyles style, ref TimeSpanResult result)
static bool TryParseExactMultiple(ReadOnlySpan< char > input, string[] formats, IFormatProvider formatProvider, TimeSpanStyles styles, out TimeSpan result)
static bool TryParseExact(ReadOnlySpan< char > input, ReadOnlySpan< char > format, IFormatProvider formatProvider, TimeSpanStyles styles, out TimeSpan result)
static bool TryParseExactMultipleTimeSpan(ReadOnlySpan< char > input, string[] formats, IFormatProvider formatProvider, TimeSpanStyles styles, ref TimeSpanResult result)
static TimeSpan ParseExact(ReadOnlySpan< char > input, ReadOnlySpan< char > format, IFormatProvider formatProvider, TimeSpanStyles styles)
static bool TryParseExactTimeSpan(ReadOnlySpan< char > input, ReadOnlySpan< char > format, IFormatProvider formatProvider, TimeSpanStyles styles, ref TimeSpanResult result)
static bool ProcessTerminal_HM_S_D(ref TimeSpanRawInfo raw, TimeSpanStandardStyles style, ref TimeSpanResult result)
static long Pow10(int pow)
static bool ProcessTerminalState(ref TimeSpanRawInfo raw, TimeSpanStandardStyles style, ref TimeSpanResult result)
static bool TryParse(ReadOnlySpan< char > input, IFormatProvider formatProvider, out TimeSpan result)
static bool ProcessTerminal_HMS_F_D(ref TimeSpanRawInfo raw, TimeSpanStandardStyles style, ref TimeSpanResult result)
static bool TryParseTimeSpanConstant(ReadOnlySpan< char > input, ref TimeSpanResult result)
static bool TryTimeToTicks(bool positive, TimeSpanToken days, TimeSpanToken hours, TimeSpanToken minutes, TimeSpanToken seconds, TimeSpanToken fraction, out long result)
static bool ProcessTerminal_DHMSF(ref TimeSpanRawInfo raw, TimeSpanStandardStyles style, ref TimeSpanResult result)
static bool ParseExactDigits(ref TimeSpanTokenizer tokenizer, int minDigitLength, out int result)
static bool ParseExactDigits(ref TimeSpanTokenizer tokenizer, int minDigitLength, int maxDigitLength, out int zeroes, out int result)
static bool ProcessTerminal_D(ref TimeSpanRawInfo raw, TimeSpanStandardStyles style, ref TimeSpanResult result)
static bool TryParseTimeSpan(ReadOnlySpan< char > input, TimeSpanStandardStyles style, IFormatProvider formatProvider, ref TimeSpanResult result)
static double Pow(double x, double y)
static decimal Round(decimal d)
static double Log10(double d)
static double Floor(double d)
static string Format_BadTimeSpan
static string Overflow_TimeSpanElementTooLarge
static string Format_BadQuote
static string Format(string resourceFormat, object p1)
static string Format_BadFormatSpecifier
static string Format_InvalidString
static string ArgumentNull_String
static string Format_NoFormatSpecifier
static void Release(StringBuilder sb)
static StringBuilder Acquire(int capacity=16)
bool ParseTime(out long time, ref TimeSpanResult result)
bool TryParse(ReadOnlySpan< char > input, ref TimeSpanResult result)
bool ParseInt(int max, out int i, ref TimeSpanResult result)
ReadOnlySpan< char > _str
ReadOnlySpan< char > _literals2
void Init(DateTimeFormatInfo dtfi)
bool FullDHMSMatch(TimeSpanFormat.FormatLiterals pattern)
bool AddSep(ReadOnlySpan< char > sep, ref TimeSpanResult result)
ReadOnlySpan< char > _literals4
TimeSpanFormat.FormatLiterals _negLoc
TimeSpanFormat.FormatLiterals NegativeLocalized
bool AddNum(TimeSpanToken num, ref TimeSpanResult result)
bool FullHMMatch(TimeSpanFormat.FormatLiterals pattern)
bool FullDHMMatch(TimeSpanFormat.FormatLiterals pattern)
ReadOnlySpan< char > _literals5
bool FullMatch(TimeSpanFormat.FormatLiterals pattern)
bool FullHMSFMatch(TimeSpanFormat.FormatLiterals pattern)
ReadOnlySpan< char > _literals0
ReadOnlySpan< char > _literals1
TimeSpanFormat.FormatLiterals PositiveLocalized
ReadOnlySpan< char > _literals3
bool FullHMSMatch(TimeSpanFormat.FormatLiterals pattern)
bool FullAppCompatMatch(TimeSpanFormat.FormatLiterals pattern)
bool FullDMatch(TimeSpanFormat.FormatLiterals pattern)
TimeSpanFormat.FormatLiterals _posLoc
bool ProcessToken(ref TimeSpanToken tok, ref TimeSpanResult result)
bool PartialAppCompatMatch(TimeSpanFormat.FormatLiterals pattern)
readonly bool _throwOnFailure
bool SetNoFormatSpecifierFailure()
TimeSpanResult(bool throwOnFailure, ReadOnlySpan< char > originalTimeSpanString)
readonly ReadOnlySpan< char > _originalTimeSpanString
bool SetBadFormatSpecifierFailure(char? formatSpecifierCharacter=null)
bool SetBadTimeSpanFailure()
bool SetBadQuoteFailure(char failingCharacter)
bool SetOverflowFailure()
bool SetArgumentNullFailure(string argumentName)
bool SetInvalidStringFailure()
bool NormalizeAndValidateFraction()
ReadOnlySpan< char > _sep
TimeSpanToken(int number, int leadingZeroes)
TimeSpanToken(TTT type, int number, int leadingZeroes, ReadOnlySpan< char > separator)
TimeSpanToken(int number)
TimeSpanTokenizer(ReadOnlySpan< char > input)
readonly ReadOnlySpan< char > _value
TimeSpanToken GetNextToken()
TimeSpanTokenizer(ReadOnlySpan< char > input, int startPosition)
ReadOnlySpan< T > Slice(int start)