30
30
// ReSharper disable once CheckNamespace
31
31
namespace UnitsNet
32
32
{
33
- internal delegate TUnitType ParseUnitDelegate < out TUnitType > ( string unitString , IFormatProvider formatProvider ) where TUnitType : Enum ;
34
- internal delegate bool TryParseUnitDelegate < TUnitType > ( string unitString , IFormatProvider formatProvider , out TUnitType unit ) where TUnitType : Enum ;
35
-
36
33
#if ! WINDOWS_UWP
37
34
internal delegate TQuantity QuantityFromDelegate < out TQuantity , TUnitType > ( QuantityValue value , TUnitType fromUnit )
38
35
where TQuantity : IQuantity
@@ -46,12 +43,14 @@ internal delegate TQuantity QuantityFromDelegate<out TQuantity, TUnitType>(doubl
46
43
internal class QuantityParser
47
44
{
48
45
private readonly UnitAbbreviationsCache unitAbbreviationsCache ;
46
+ private UnitParser _unitParser ;
49
47
50
48
public static QuantityParser Default { get ; }
51
49
52
50
public QuantityParser ( UnitAbbreviationsCache unitAbbreviationsCache )
53
51
{
54
52
this . unitAbbreviationsCache = unitAbbreviationsCache ?? UnitAbbreviationsCache . Default ;
53
+ this . _unitParser = new UnitParser ( this . unitAbbreviationsCache ) ;
55
54
}
56
55
57
56
static QuantityParser ( )
@@ -62,14 +61,12 @@ static QuantityParser()
62
61
[ SuppressMessage ( "ReSharper" , "UseStringInterpolation" ) ]
63
62
internal TQuantity Parse < TQuantity , TUnitType > ( [ NotNull ] string str ,
64
63
[ CanBeNull ] IFormatProvider formatProvider ,
65
- [ NotNull ] ParseUnitDelegate < TUnitType > parseUnit ,
66
64
[ NotNull ] QuantityFromDelegate < TQuantity , TUnitType > fromDelegate ,
67
65
[ NotNull ] Func < TQuantity , TQuantity , TQuantity > add )
68
66
where TQuantity : IQuantity
69
67
where TUnitType : Enum
70
68
{
71
69
if ( str == null ) throw new ArgumentNullException ( nameof ( str ) ) ;
72
- if ( parseUnit == null ) throw new ArgumentNullException ( nameof ( parseUnit ) ) ;
73
70
if ( add == null ) throw new ArgumentNullException ( nameof ( add ) ) ;
74
71
75
72
var numFormat = formatProvider != null
@@ -101,7 +98,7 @@ internal TQuantity Parse<TQuantity, TUnitType>([NotNull] string str,
101
98
@"(and)?,?" , // allow "and" & "," separators between quantities
102
99
@"(?<invalid>[a-z]*)?" ) ; // capture invalid input
103
100
104
- var quantities = ParseWithRegex ( regexString , str , parseUnit , fromDelegate , formatProvider ) ;
101
+ var quantities = ParseWithRegex ( regexString , str , fromDelegate , formatProvider ) ;
105
102
if ( quantities . Count == 0 )
106
103
{
107
104
throw new ArgumentException (
@@ -116,7 +113,7 @@ internal TQuantity Parse<TQuantity, TUnitType>([NotNull] string str,
116
113
/// Parse a string given a particular regular expression.
117
114
/// </summary>
118
115
/// <exception cref="UnitsNetException">Error parsing string.</exception>
119
- private static List < TQuantity > ParseWithRegex < TQuantity , TUnitType > ( string regexString , string str , ParseUnitDelegate < TUnitType > parseUnit ,
116
+ private List < TQuantity > ParseWithRegex < TQuantity , TUnitType > ( string regexString , string str ,
120
117
QuantityFromDelegate < TQuantity , TUnitType > fromDelegate , IFormatProvider formatProvider = null )
121
118
where TQuantity : IQuantity
122
119
where TUnitType : Enum
@@ -147,7 +144,7 @@ private static List<TQuantity> ParseWithRegex<TQuantity, TUnitType>(string regex
147
144
try
148
145
{
149
146
var value = double . Parse ( valueString , formatProvider ) ;
150
- var parsedUnit = parseUnit ( unitString , formatProvider ) ;
147
+ var parsedUnit = _unitParser . Parse < TUnitType > ( unitString , formatProvider ) ;
151
148
var quantity = fromDelegate ( value , parsedUnit ) ;
152
149
153
150
converted . Add ( quantity ) ;
@@ -173,7 +170,6 @@ private static List<TQuantity> ParseWithRegex<TQuantity, TUnitType>(string regex
173
170
[ SuppressMessage ( "ReSharper" , "UseStringInterpolation" ) ]
174
171
internal bool TryParse < TQuantity , TUnitType > ( [ NotNull ] string str ,
175
172
[ CanBeNull ] IFormatProvider formatProvider ,
176
- [ NotNull ] TryParseUnitDelegate < TUnitType > parseUnit ,
177
173
[ NotNull ] QuantityFromDelegate < TQuantity , TUnitType > fromDelegate ,
178
174
[ NotNull ] Func < TQuantity , TQuantity , TQuantity > add , out TQuantity value )
179
175
where TQuantity : IQuantity
@@ -182,7 +178,6 @@ internal bool TryParse<TQuantity, TUnitType>([NotNull] string str,
182
178
value = default ( TQuantity ) ;
183
179
184
180
if ( string . IsNullOrWhiteSpace ( str ) ) return false ;
185
- if ( parseUnit == null ) return false ;
186
181
if ( add == null ) return false ;
187
182
188
183
var numFormat = formatProvider != null
@@ -214,7 +209,7 @@ internal bool TryParse<TQuantity, TUnitType>([NotNull] string str,
214
209
@"(and)?,?" , // allow "and" & "," separators between quantities
215
210
@"(?<invalid>[a-z]*)?" ) ; // capture invalid input
216
211
217
- if ( ! TryParseWithRegex < TQuantity , TUnitType > ( regexString , str , parseUnit , fromDelegate , formatProvider , out var quantities ) )
212
+ if ( ! TryParseWithRegex < TQuantity , TUnitType > ( regexString , str , fromDelegate , formatProvider , out var quantities ) )
218
213
return false ;
219
214
220
215
value = quantities . Aggregate ( add ) ;
@@ -225,7 +220,7 @@ internal bool TryParse<TQuantity, TUnitType>([NotNull] string str,
225
220
/// Parse a string given a particular regular expression.
226
221
/// </summary>
227
222
/// <exception cref="UnitsNetException">Error parsing string.</exception>
228
- private static bool TryParseWithRegex < TQuantity , TUnitType > ( string regexString , string str , TryParseUnitDelegate < TUnitType > tryParseUnit ,
223
+ private bool TryParseWithRegex < TQuantity , TUnitType > ( string regexString , string str ,
229
224
QuantityFromDelegate < TQuantity , TUnitType > fromDelegate , IFormatProvider formatProvider , out List < TQuantity > converted )
230
225
where TQuantity : IQuantity
231
226
where TUnitType : Enum
@@ -250,7 +245,7 @@ private static bool TryParseWithRegex<TQuantity, TUnitType>(string regexString,
250
245
if ( ! double . TryParse ( valueString , NumberStyles . Any , formatProvider , out var value ) )
251
246
return false ;
252
247
253
- if ( ! tryParseUnit ( unitString , formatProvider , out var parsedUnit ) )
248
+ if ( ! _unitParser . TryParse < TUnitType > ( unitString , formatProvider , out var parsedUnit ) )
254
249
return false ;
255
250
256
251
var quantity = fromDelegate ( value , parsedUnit ) ;
0 commit comments