@@ -227,6 +227,10 @@ extension EmbeddedIntegerCollection: RandomAccessCollection, MutableCollection {
227
227
return indices. distance ( from: start, to: end)
228
228
}
229
229
230
+ @inlinable
231
+ public func _customContainsEquatableElement( _ element: Element ) -> Bool ? {
232
+ return . some( hasElement ( of: element) )
233
+ }
230
234
public func withContiguousStorageIfAvailable< R> (
231
235
_ body: ( UnsafeBufferPointer < Element > ) throws -> R
232
236
) rethrows -> R ? {
@@ -511,4 +515,28 @@ extension EmbeddedIntegerCollection {
511
515
/// every embedded element.
512
516
@usableFromInline
513
517
static var allEmbeddedOnes : Wrapped { Wrapped . max / Wrapped( Element . max) }
518
+ /// Generates a collection with every element having a value of
519
+ /// just its highest bit set.
520
+ @usableFromInline
521
+ static var allEmbeddedHighBits : Wrapped {
522
+ allEmbeddedOnes << ( Element . bitWidth - 1 )
523
+ }
524
+
525
+ /// Whether at least one embedded element has a value of zero.
526
+ @usableFromInline
527
+ var hasZeroElement : Bool {
528
+ ( container &- Self . allEmbeddedOnes) & ~ container & Self . allEmbeddedHighBits
529
+ != 0
530
+ }
531
+ /// Whether at least one embedded element has the given value.
532
+ ///
533
+ /// - Parameter value: The value to compare against.
534
+ /// - Returns: `true` if at least one embedded element equals `value`,
535
+ /// `false` otherwise.
536
+ @usableFromInline
537
+ func hasElement( of value: Element ) -> Bool {
538
+ var values = Self ( repeating: value, iteratingFrom: self . endianness)
539
+ values. container ^= self . container
540
+ return values. hasZeroElement
541
+ }
514
542
}
0 commit comments