#include "il2cpp-config.h" 
 | 
#include "il2cpp-class-internals.h" 
 | 
#include "Il2CppTypeCompare.h" 
 | 
  
 | 
namespace il2cpp 
 | 
{ 
 | 
namespace metadata 
 | 
{ 
 | 
    template<typename T> 
 | 
    static inline int Compare(const T& left, const T& right) 
 | 
    { 
 | 
        if (left == right) 
 | 
            return 0; 
 | 
  
 | 
        if (left < right) 
 | 
            return -1; 
 | 
  
 | 
        return 1; 
 | 
    } 
 | 
  
 | 
    static int Compare(const Il2CppType* t1, const Il2CppType* t2) 
 | 
    { 
 | 
        int result = Compare(t1->type, t2->type); 
 | 
        if (result != 0) 
 | 
            return result; 
 | 
  
 | 
        result = Compare(t1->byref, t2->byref); 
 | 
        if (result != 0) 
 | 
            return result; 
 | 
  
 | 
        switch (t1->type) 
 | 
        { 
 | 
            case IL2CPP_TYPE_VALUETYPE: 
 | 
            case IL2CPP_TYPE_CLASS: 
 | 
                return Compare(t1->data.typeHandle, t2->data.typeHandle); 
 | 
  
 | 
            case IL2CPP_TYPE_PTR: 
 | 
            case IL2CPP_TYPE_SZARRAY: 
 | 
                return Compare(t1->data.type, t2->data.type); 
 | 
  
 | 
            case IL2CPP_TYPE_ARRAY: 
 | 
            { 
 | 
                result = Compare(t1->data.array->rank, t2->data.array->rank); 
 | 
                if (result != 0) 
 | 
                    return result; 
 | 
  
 | 
                return Compare(t1->data.array->etype, t2->data.array->etype); 
 | 
            } 
 | 
            case IL2CPP_TYPE_GENERICINST: 
 | 
            { 
 | 
                const Il2CppGenericInst *i1 = t1->data.generic_class->context.class_inst; 
 | 
                const Il2CppGenericInst *i2 = t2->data.generic_class->context.class_inst; 
 | 
  
 | 
                // this happens when maximum generic recursion is hit 
 | 
                if (i1 == NULL || i2 == NULL) 
 | 
                { 
 | 
                    if (i1 == i2) 
 | 
                        return 0; 
 | 
                    return (i1 == NULL) ? -1 : 1; 
 | 
                } 
 | 
  
 | 
                result = Compare(i1->type_argc, i2->type_argc); 
 | 
                if (result != 0) 
 | 
                    return result; 
 | 
  
 | 
                result = Compare(t1->data.generic_class->type->data.typeHandle, t2->data.generic_class->type->data.typeHandle); 
 | 
                if (result != 0) 
 | 
                    return result; 
 | 
  
 | 
                /* FIXME: we should probably just compare the instance pointers directly.  */ 
 | 
                for (uint32_t i = 0; i < i1->type_argc; ++i) 
 | 
                { 
 | 
                    result = Compare(i1->type_argv[i], i2->type_argv[i]); 
 | 
                    if (result != 0) 
 | 
                        return result; 
 | 
                } 
 | 
  
 | 
                return 0; 
 | 
            } 
 | 
            case IL2CPP_TYPE_VAR: 
 | 
            case IL2CPP_TYPE_MVAR: 
 | 
                return Compare(t1->data.genericParameterHandle, t2->data.genericParameterHandle); 
 | 
            default: 
 | 
                return 0; 
 | 
        } 
 | 
  
 | 
        IL2CPP_NOT_IMPLEMENTED(Il2CppTypeEqualityComparer::compare); 
 | 
        return Compare(static_cast<const void*>(t1), static_cast<const void*>(t2)); 
 | 
    } 
 | 
  
 | 
    bool Il2CppTypeEqualityComparer::AreEqual(const Il2CppType* t1, const Il2CppType* t2) 
 | 
    { 
 | 
        return Compare(t1, t2) == 0; 
 | 
    } 
 | 
  
 | 
    bool Il2CppTypeLess::operator()(const Il2CppType * t1, const Il2CppType * t2) const 
 | 
    { 
 | 
        return Compare(t1, t2) < 0; 
 | 
    } 
 | 
} /* namespace vm */ 
 | 
} /* namespace il2cpp */ 
 |