Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

53
LINES

< > BotCompany Repo | #1035459 // typeConversionScore - backup before precise subtype dispatch

JavaX fragment (include)

1  
// Can a be converted to b?
2  
3  
// score 0 = exact match
4  
// score Int.MAX_VALUE = no match
5  
// score 1 = conversion needed (boxing/unboxing or non-primitve widening)
6  
// score -2 = primitive widening needed
7  
8  
static int typeConversionScore(Class a, Class b) {
9  
  if (a == b) ret 0;
10  
  
11  
  if (b.isPrimitive()) {
12  
    // target type is primitive
13  
    
14  
    if (a.isPrimitive()) {
15  
      // both types are primitive
16  
      
17  
      // No widenings to bool
18  
      if (b == bool.class) ret Int.MAX_VALUE;
19  
      
20  
      // No widenings to byte
21  
      if (b == byte.class) ret Int.MAX_VALUE;
22  
      
23  
      // byte can be converted to char
24  
      if (b == char.class) ret a == byte.class ? -2 : Int.MAX_VALUE;
25  
      
26  
      // byte can be converted to short
27  
      if (b == short.class) ret a == byte.class ? -2 : Int.MAX_VALUE;
28  
      
29  
      // byte, char and short can be converted to int
30  
      if (b == int.class) ret a == byte.class || a == char.class || a == short.class ? -2 : Int.MAX_VALUE;
31  
      
32  
      // byte, char, short and int can be converted to long
33  
      if (b == long.class) ret a == byte.class || a == char.class || a == short.class || a == int.class ? -2 : Int.MAX_VALUE;
34  
      
35  
      // byte, char, short and int can be converted to float
36  
      if (b == float.class) ret a == byte.class || a == char.class || a == short.class || a == int.class ? -2 : Int.MAX_VALUE;
37  
      
38  
      // all primitive types except bool can be converted to double
39  
      ret a != bool.class ? -2 : Int.MAX_VALUE;
40  
    } else {
41  
      // source type is boxed - check if they're a match 
42  
      ret primitiveToBoxedType(b) == a ?  1 : Int.MAX_VALUE;
43  
    }
44  
  } else {
45  
    // target type is not primitive
46  
    
47  
    // object type is primitive - check for exact match
48  
    if (a.isPrimitive()) ret primitiveToBoxedType(a) == b ? 1 : Int.MAX_VALUE;
49  
50  
    // both types are not primitive
51  
    ret b.isAssignableFrom(a) ? 1 : Int.MAX_VALUE;
52  
  }
53  
}

Author comment

Began life as a copy of #1034747

download  show line numbers  debug dex  old transpilations   

Travelled to 2 computer(s): mowyntqkapby, mqqgnosmbjvj

No comments. add comment

Snippet ID: #1035459
Snippet name: typeConversionScore - backup before precise subtype dispatch
Eternal ID of this version: #1035459/2
Text MD5: 62c12248b21ab04e6f76cb9f16b1a8b4
Author: stefan
Category: javax
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-05-19 20:28:32
Source code size: 1948 bytes / 53 lines
Pitched / IR pitched: No / No
Views / Downloads: 54 / 61
Version history: 1 change(s)
Referenced in: [show references]