MCPcopy Create free account
hub / github.com/beefytech/Beef / AreConstraintsSubset

Method AreConstraintsSubset

IDEHelper/Compiler/BfModuleTypeUtils.cpp:497–575  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

495}
496
497bool BfModule::AreConstraintsSubset(BfGenericParamInstance* checkInner, BfGenericParamInstance* checkOuter)
498{
499 if (checkOuter == NULL)
500 return false;
501 if (checkInner == NULL)
502 return true;
503
504 // Added new flags?
505 if ((checkInner->mGenericParamFlags | checkOuter->mGenericParamFlags) != checkOuter->mGenericParamFlags)
506 {
507 // If the outer had a type flag and the inner has a specific type constraint, then see if those are compatible
508 auto outerFlags = checkOuter->mGenericParamFlags;
509 if ((outerFlags & BfGenericParamFlag_Enum) != 0)
510 outerFlags = (BfGenericParamFlags)(outerFlags | BfGenericParamFlag_Struct);
511
512 if (checkOuter->mTypeConstraint != NULL)
513 {
514 if (checkOuter->mTypeConstraint->IsStruct())
515 outerFlags = (BfGenericParamFlags)(outerFlags | BfGenericParamFlag_Struct);
516 else if (checkOuter->mTypeConstraint->IsStructOrStructPtr())
517 outerFlags = (BfGenericParamFlags)(outerFlags | BfGenericParamFlag_StructPtr);
518 else if ((checkOuter->mTypeConstraint->IsObject()) && (!checkOuter->mTypeConstraint->IsDelegate()))
519 outerFlags = (BfGenericParamFlags)(outerFlags | BfGenericParamFlag_Class);
520 else if (checkOuter->mTypeConstraint->IsEnum())
521 outerFlags = (BfGenericParamFlags)(outerFlags | BfGenericParamFlag_Enum | BfGenericParamFlag_Struct);
522 else if (checkOuter->mTypeConstraint->IsInterface())
523 outerFlags = (BfGenericParamFlags)(outerFlags | BfGenericParamFlag_Interface);
524 }
525
526 auto innerFlags = checkInner->mGenericParamFlags;
527 if ((innerFlags & BfGenericParamFlag_Enum) != 0)
528 innerFlags = (BfGenericParamFlags)(innerFlags | BfGenericParamFlag_Struct);
529
530 if (((innerFlags | outerFlags) & ~BfGenericParamFlag_Var) != (outerFlags & ~BfGenericParamFlag_Var))
531 return false;
532 }
533
534 if (checkInner->mTypeConstraint != NULL)
535 {
536 if (checkOuter->mTypeConstraint == NULL)
537 return false;
538 if (!TypeIsSubTypeOf(checkOuter->mTypeConstraint->ToTypeInstance(), checkInner->mTypeConstraint->ToTypeInstance()))
539 return false;
540 }
541
542 for (auto innerIFace : checkInner->mInterfaceConstraints)
543 {
544 if (checkOuter->mInterfaceConstraints.IsEmpty())
545 return false;
546
547 if (checkOuter->mInterfaceConstraintSet == NULL)
548 {
549 std::function<void(BfTypeInstance*)> _AddInterface = [&](BfTypeInstance* ifaceType)
550 {
551 if (!checkOuter->mInterfaceConstraintSet->Add(ifaceType))
552 return;
553 if (ifaceType->mDefineState < BfTypeDefineState_HasInterfaces_Direct)
554 PopulateType(ifaceType, Beefy::BfPopulateType_Interfaces_Direct);

Callers 1

CompareMethodsMethod · 0.80

Calls 10

IsStructMethod · 0.45
IsStructOrStructPtrMethod · 0.45
IsObjectMethod · 0.45
IsDelegateMethod · 0.45
IsEnumMethod · 0.45
IsInterfaceMethod · 0.45
ToTypeInstanceMethod · 0.45
IsEmptyMethod · 0.45
AddMethod · 0.45
ContainsMethod · 0.45

Tested by

no test coverage detected