| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // Copyright (c) 2021-2025 ChilliBits. All rights reserved. | ||
| 2 | |||
| 3 | #include "GenericType.h" | ||
| 4 | |||
| 5 | namespace spice::compiler { | ||
| 6 | |||
| 7 | /** | ||
| 8 | * Checks if the given symbol qualType matches all conditions to get a manifestation of the current generic qualType | ||
| 9 | * | ||
| 10 | * @param requestedType Qualified qualType to be checked | ||
| 11 | * @param substantiation Concrete substantiation of the generic type | ||
| 12 | * @param ignoreArraySize Ignore the array size for qualType comparison | ||
| 13 | * @param ignoreQualifiers Ignore the type qualifiers for qualType comparison | ||
| 14 | * @return True or false | ||
| 15 | */ | ||
| 16 | 8355 | bool GenericType::checkConditionsOf(const QualType &requestedType, QualType &substantiation, bool ignoreArraySize, | |
| 17 | bool ignoreQualifiers) const { | ||
| 18 | 8355 | return checkTypeConditionOf(requestedType, substantiation, ignoreArraySize, ignoreQualifiers); | |
| 19 | } | ||
| 20 | |||
| 21 | /** | ||
| 22 | * Checks if the given qualType matches all qualType conditions to get a manifestation of the current generic qualType | ||
| 23 | * | ||
| 24 | * @param requestedType Qualified type to be checked | ||
| 25 | * @param substantiation Concrete substantiation of the generic type | ||
| 26 | * @param ignoreArraySize Ignore the array size for qualType comparison | ||
| 27 | * @param ignoreQualifiers Ignore the type qualifiers for qualType comparison | ||
| 28 | * @return True or false | ||
| 29 | */ | ||
| 30 | 8355 | bool GenericType::checkTypeConditionOf(const QualType &requestedType, QualType &substantiation, bool ignoreArraySize, | |
| 31 | bool ignoreQualifiers) const { | ||
| 32 | 8355 | substantiation = requestedType; | |
| 33 | // Succeed if there are no type conditions | ||
| 34 |
1/2✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 8355 times.
|
8355 | if (typeConditions.empty()) |
| 35 | ✗ | return true; | |
| 36 | // Succeed if the given qual type is generic and matches the current one | ||
| 37 |
6/6✓ Branch 6 → 7 taken 1208 times.
✓ Branch 6 → 10 taken 7147 times.
✓ Branch 8 → 9 taken 927 times.
✓ Branch 8 → 10 taken 281 times.
✓ Branch 11 → 12 taken 927 times.
✓ Branch 11 → 13 taken 7428 times.
|
8355 | if (requestedType.hasAnyGenericParts() && requestedType == *this) |
| 38 | 927 | return true; | |
| 39 | // Check type conditions | ||
| 40 |
2/2✓ Branch 26 → 15 taken 11447 times.
✓ Branch 26 → 27 taken 2957 times.
|
14404 | for (const QualType &typeCondition : typeConditions) { |
| 41 | // If we have a dyn type condition, the conditions are fulfilled immediately | ||
| 42 |
3/4✓ Branch 16 → 17 taken 11447 times.
✗ Branch 16 → 29 not taken.
✓ Branch 17 → 18 taken 3336 times.
✓ Branch 17 → 19 taken 8111 times.
|
11447 | if (typeCondition.is(TY_DYN)) |
| 43 | 4471 | return true; | |
| 44 | // In situations like this we need to unwrap: requestedType = const int&, typeCondition = int | ||
| 45 | 8111 | QualType typeConditionCopy = typeCondition; | |
| 46 | 8111 | QualType requestedTypeCopy = requestedType; | |
| 47 |
1/2✓ Branch 19 → 20 taken 8111 times.
✗ Branch 19 → 29 not taken.
|
8111 | unwrapBoth(typeConditionCopy, requestedTypeCopy); |
| 48 |
3/4✓ Branch 20 → 21 taken 8111 times.
✗ Branch 20 → 29 not taken.
✓ Branch 21 → 22 taken 1135 times.
✓ Branch 21 → 23 taken 6976 times.
|
8111 | if (typeConditionCopy.matches(requestedTypeCopy, ignoreArraySize, ignoreQualifiers, ignoreQualifiers)) { |
| 49 | 1135 | substantiation = typeCondition; | |
| 50 | 1135 | return true; | |
| 51 | } | ||
| 52 | } | ||
| 53 | 2957 | return false; | |
| 54 | } | ||
| 55 | |||
| 56 | } // namespace spice::compiler | ||
| 57 |