@@ -227,6 +227,10 @@ extension EmbeddedIntegerCollection: RandomAccessCollection, MutableCollection {
227227 return indices. distance ( from: start, to: end)
228228 }
229229
230+ @inlinable
231+ public func _customContainsEquatableElement( _ element: Element ) -> Bool ? {
232+ return . some( hasElement ( of: element) )
233+ }
230234 public func withContiguousStorageIfAvailable< R> (
231235 _ body: ( UnsafeBufferPointer < Element > ) throws -> R
232236 ) rethrows -> R ? {
@@ -511,4 +515,28 @@ extension EmbeddedIntegerCollection {
511515 /// every embedded element.
512516 @usableFromInline
513517 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+ }
514542}
0 commit comments