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)

// Can a be converted to b?

// score 0 = exact match
// score Int.MAX_VALUE = no match
// score 1 = conversion needed (boxing/unboxing or non-primitve widening)
// score -2 = primitive widening needed

static int typeConversionScore(Class a, Class b) {
  if (a == b) ret 0;
  
  if (b.isPrimitive()) {
    // target type is primitive
    
    if (a.isPrimitive()) {
      // both types are primitive
      
      // No widenings to bool
      if (b == bool.class) ret Int.MAX_VALUE;
      
      // No widenings to byte
      if (b == byte.class) ret Int.MAX_VALUE;
      
      // byte can be converted to char
      if (b == char.class) ret a == byte.class ? -2 : Int.MAX_VALUE;
      
      // byte can be converted to short
      if (b == short.class) ret a == byte.class ? -2 : Int.MAX_VALUE;
      
      // byte, char and short can be converted to int
      if (b == int.class) ret a == byte.class || a == char.class || a == short.class ? -2 : Int.MAX_VALUE;
      
      // byte, char, short and int can be converted to long
      if (b == long.class) ret a == byte.class || a == char.class || a == short.class || a == int.class ? -2 : Int.MAX_VALUE;
      
      // byte, char, short and int can be converted to float
      if (b == float.class) ret a == byte.class || a == char.class || a == short.class || a == int.class ? -2 : Int.MAX_VALUE;
      
      // all primitive types except bool can be converted to double
      ret a != bool.class ? -2 : Int.MAX_VALUE;
    } else {
      // source type is boxed - check if they're a match 
      ret primitiveToBoxedType(b) == a ?  1 : Int.MAX_VALUE;
    }
  } else {
    // target type is not primitive
    
    // object type is primitive - check for exact match
    if (a.isPrimitive()) ret primitiveToBoxedType(a) == b ? 1 : Int.MAX_VALUE;

    // both types are not primitive
    ret b.isAssignableFrom(a) ? 1 : Int.MAX_VALUE;
  }
}

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: 110 / 120
Version history: 1 change(s)
Referenced in: [show references]