MCPcopy Create free account
hub / github.com/esengine/esengine / hasAll

Method hasAll

packages/core/src/ECS/Utils/BigIntCompatibility.ts:81–112  ·  view source on GitHub ↗

* 检查掩码是否包含所有指定的位 * @param mask 要检查的掩码 * @param bits 指定的位模式 * @returns 如果掩码包含bits中的所有位则返回true

(mask: BitMask64Data, bits: BitMask64Data)

Source from the content-addressed store, hash-verified

79 * @returns 如果掩码包含bits中的所有位则返回true
80 */
81 public static hasAll(mask: BitMask64Data, bits: BitMask64Data): boolean {
82 const maskBase = mask.base;
83 const bitsBase = bits.base;
84 const maskSegments = mask.segments;
85 const bitsSegments = bits.segments;
86 const baseHasAll = (maskBase[SegmentPart.LOW] & bitsBase[SegmentPart.LOW]) === bitsBase[SegmentPart.LOW] && (maskBase[SegmentPart.HIGH] & bitsBase[SegmentPart.HIGH]) === bitsBase[SegmentPart.HIGH];
87 // 基础区域就不包含指定的位,或bits没有扩展区段,直接短路。
88 if(!baseHasAll || !bitsSegments) return baseHasAll;
89
90 // 扩展区段的hasAll匹配逻辑
91 const maskSegmentsLength = maskSegments?.length ?? 0;
92 // 对mask/bits中都存在的区段,进行hasAll判断
93 if(maskSegments){
94 for (let i = 0; i < Math.min(maskSegmentsLength,bitsSegments.length); i++) {
95 const maskSeg = maskSegments[i]!;
96 const bitsSeg = bitsSegments[i]!;
97 if((maskSeg[SegmentPart.LOW] & bitsSeg[SegmentPart.LOW]) !== bitsSeg[SegmentPart.LOW] || (maskSeg[SegmentPart.HIGH] & bitsSeg[SegmentPart.HIGH]) !== bitsSeg[SegmentPart.HIGH]){
98 // 存在不匹配的位,直接短路
99 return false;
100 }
101 }
102 }
103 // 对mask中不存在,但bits中存在的区段,进行isZero判断
104 for (let i = maskSegmentsLength; i < bitsSegments.length; i++) {
105 const bitsSeg = bitsSegments[i]!;
106 if(bitsSeg[SegmentPart.LOW] !== 0 || bitsSeg[SegmentPart.HIGH] !== 0){
107 // 存在不为0的区段,直接短路
108 return false;
109 }
110 }
111 return true;
112 }
113
114 /**
115 * 检查掩码是否不包含任何指定的位

Callers 5

containsAllMethod · 0.45
queryMultipleAndMethod · 0.45
matchesMethod · 0.45
queryArchetypesMethod · 0.45

Calls 1

minMethod · 0.45

Tested by

no test coverage detected