1
+ /*----------------------------------------------------------
2
+ This Source Code Form is subject to the terms of the
3
+ Mozilla Public License, v.2.0. If a copy of the MPL
4
+ was not distributed with this file, You can obtain one
5
+ at http://mozilla.org/MPL/2.0/.
6
+ ----------------------------------------------------------*/
7
+ using System ;
8
+ using System . Collections . Generic ;
9
+ using OneScript . Types ;
10
+ using OneScript . Values ;
11
+
12
+ namespace OneScript . StandardLibrary . TypeDescriptions
13
+ {
14
+ internal class TypeComparer : IComparer < BslTypeValue >
15
+ {
16
+ private const string TYPE_BINARYDATA_NAME = "ДвоичныеДанные" ;
17
+ private static readonly IDictionary < TypeDescriptor , int > primitives = new Dictionary < TypeDescriptor , int > ( ) ;
18
+
19
+ public int Compare ( BslTypeValue x , BslTypeValue y )
20
+ {
21
+ if ( x . TypeValue . Equals ( y ) ) return 0 ;
22
+
23
+ var primitiveX = PrimitiveIndex ( x ) ;
24
+ var primitiveY = PrimitiveIndex ( y ) ;
25
+
26
+ if ( primitiveX != - 1 )
27
+ {
28
+ if ( primitiveY != - 1 )
29
+ return primitiveX - primitiveY ;
30
+
31
+ return - 1 ;
32
+ }
33
+
34
+ if ( primitiveY != - 1 )
35
+ return 1 ;
36
+
37
+ return x . TypeValue . Id . CompareTo ( y . TypeValue . Id ) ;
38
+ }
39
+
40
+ private int PrimitiveIndex ( BslTypeValue type )
41
+ {
42
+ if ( StringComparer . CurrentCultureIgnoreCase . Equals ( type . TypeValue . Name , TYPE_BINARYDATA_NAME ) )
43
+ {
44
+ // Пора двоичным данным стать примитивом
45
+ return 1 ;
46
+ }
47
+
48
+ if ( primitives . TryGetValue ( type . TypeValue , out var index ) )
49
+ return index ;
50
+
51
+ return - 1 ;
52
+ }
53
+
54
+ static TypeComparer ( )
55
+ {
56
+ primitives . Add ( BasicTypes . Boolean , 0 ) ;
57
+ primitives . Add ( BasicTypes . String , 2 ) ;
58
+ primitives . Add ( BasicTypes . Date , 3 ) ;
59
+ primitives . Add ( BasicTypes . Null , 4 ) ;
60
+ primitives . Add ( BasicTypes . Number , 5 ) ;
61
+ primitives . Add ( BasicTypes . Type , 6 ) ;
62
+ }
63
+
64
+ }
65
+ }
66
+
0 commit comments