22// The .NET Foundation licenses this file to you under the MIT license.
33
44using System . Reflection ;
5- using System . Runtime . CompilerServices ;
65
76namespace Silk . NET . Input ;
87
@@ -143,6 +142,7 @@ static unsafe EnumInfo()
143142 MaxValue = AllValuesOrdered[ ^ 1 ] ;
144143 }
145144
145+ #pragma warning disable ST0006 ST0007 ST0008 ST0009
146146 /// <summary>
147147 /// Gets the ordered index of the unnamed enum value provided. This index is calculated by:
148148 /// (the number of named members in this enum type) + (the raw value of the number if unnamed)
@@ -154,7 +154,7 @@ static unsafe EnumInfo()
154154 public static int ValueIndexOf( T value)
155155 {
156156 // happy path - it's a named value we've already computed
157- if ( _numericallyDistinctIndices . TryGetValue ( value , out var index ) )
157+ if ( _numericallyDistinctIndices. TryGetValue( value, out var index) )
158158 {
159159 return index;
160160 }
@@ -166,46 +166,17 @@ public static int ValueIndexOf(T value)
166166 return - 1 ;
167167 }
168168
169- var rawValue = Convert < T , int > ( value ) ;
169+ var rawValue = value . Convert< T, int > ( ) ;
170170
171171 // todo - don't rely on joystickButton's unknown - find the MinValue
172- if ( rawValue < = 0 || rawValue >= Convert < ulong , int > ( _allEnumValuesRaw [ 0 ] ) )
172+ if ( rawValue <= 0 || rawValue >= _allEnumValuesRaw [ 0 ] . Convert< ulong , int > ( ) )
173173 {
174174 return - 1 ;
175175 }
176176
177- return _allValuesOrdered . Length + rawValue ;
177+ return _allValuesOrdered. Length + rawValue;
178178 }
179179
180- /// <summary>
181- /// Returns the numerical value of the enum value provided in a type-safe way
182- /// </summary>
183- /// <param name="value"></param>
184- /// <typeparam name="TFrom"></typeparam>
185- /// <typeparam name="TTo"></typeparam>
186- /// <returns></returns>
187- private static unsafe TTo Convert< TFrom , TTo > ( TFrom value ) where TTo : unmanaged where TFrom : unmanaged
188- {
189- if ( sizeof ( T ) == sizeof ( TTo ) )
190- {
191- return Unsafe . Read < TTo > ( & value ) ;
192- }
193-
194- var minSize = Math . Min ( sizeof ( TTo ) , sizeof ( T ) ) ;
195-
196- var originalValuePtr = ( byte * ) & value ;
197-
198- var valuePtr = & originalValuePtr [ Math . Abs ( minSize - sizeof ( T ) ) ] ; // does this assume little-endianness?
199- var numberPtr = stackalloc byte [ sizeof ( TTo ) ] ;
200-
201- // ensure block is initialized (as it isnt guaranteed?) so any missing bytes of the output will stay 0
202- // if type TNumber is a larger size than type T
203- Unsafe . InitBlock ( numberPtr , 0 , ( uint ) sizeof ( TTo ) ) ;
204-
205- var copyToPtr = & numberPtr [ Math . Abs ( minSize - sizeof ( TTo ) ) ] ;
206- Buffer. MemoryCopy ( valuePtr , copyToPtr , sizeof ( TTo ) , minSize ) ;
207- return * ( TTo * ) numberPtr ;
208- }
209180
210181 private static T[ ] OrderedValues< TNumber> ( bool byNumericValue)
211182 where TNumber : unmanaged, IComparable< TNumber>
@@ -215,19 +186,21 @@ private static T[] OrderedValues<TNumber>(bool byNumericValue)
215186
216187 if ( byNumericValue)
217188 {
218- allValues = allValues . DistinctBy ( Convert < T , TNumber > ) . ToArray ( ) ;
189+ allValues = allValues. DistinctBy( UnsafeNumericValueExtensions . Convert< T, TNumber> ) . ToArray( ) ;
219190 }
220191
221192 // sort by increasing order
222193 allValues. AsSpan( ) . StableSort( ( a, b) => {
223- var aNumber = Convert < T , TNumber > ( a ) ;
224- var bNumber = Convert < T , TNumber > ( b ) ;
194+ var aNumber = a . Convert< T, TNumber> ( ) ;
195+ var bNumber = b . Convert< T, TNumber> ( ) ;
225196 return aNumber. CompareTo( bNumber) ;
226197 } ) ;
227198
228199 return allValues;
229200 }
230201
202+ #pragma warning restore ST0006 ST0007 ST0008 ST0009
203+
231204 private static bool IsIgnored( T value)
232205 {
233206 var attr = value. GetType( ) . GetField( value. ToString( ) ) ? . GetCustomAttribute< OrderedIndexIgnoreAttribute> ( ) ;
0 commit comments