Skip to content

Instantly share code, notes, and snippets.

View dabrahams's full-sized avatar
🎵
All about the music

Dave Abrahams dabrahams

🎵
All about the music
View GitHub Profile
@dabrahams
dabrahams / UnsafeReference.swift
Last active October 22, 2020 19:34
Property wrappers that emulate C++ references
@propertyWrapper
struct UnsafeReference<T> {
public let address: UnsafePointer<T>
var projectedValue: Self { self }
init(_ address: UnsafePointer<T>) {
self.address = address
}
var wrappedValue: T {
get { address.pointee }
}
@dabrahams
dabrahams / EfficientAny.swift
Last active June 14, 2021 22:39
An efficient storage foundation for type erasure.
// Copyright 2020 Penguin Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@dabrahams
dabrahams / TypeErasureSurvey.swift
Last active August 29, 2020 15:28
Swift type erasure survey / performance analysis. Build with `swiftc -O -g -whole-module-optimization`
// Protocol to use for type erasure.
protocol Summable {
func sum() -> Int
}
// Concrete model. Type
extension Int: Summable {
func sum() -> Int { self }
}
@dabrahams
dabrahams / Example1.swift
Last active August 4, 2021 18:28
Ambiguity problems with giving generic types the right behavior with conditional conformances
protocol P { var pop: String { get } }
extension P {
var pop: String { "slow" }
var pop1: String { pop }
}
protocol Q: P {}
extension Q { var pop: String { "fastQ" } }
protocol R: P {}
@dabrahams
dabrahams / FactoryInitialization.swift
Last active June 5, 2024 20:44
Class factory initializers
/// Classes whose initializers actually create derived classes
protocol FactoryInitializable {
/// The type of the least-derived class declared to be FactoryInitializable.
///
/// - Warning: Do not define this in your FactoryInitializable type!
associatedtype FactoryBase: AnyObject, FactoryInitializable = Self
// This associatedtype is a trick that captures `Self` at the point where
// `FactoryInitializable` enters a class hierarchy; in other contexts, `Self`
// refers to the most-derived type.
}
@dabrahams
dabrahams / CollectionAdapter.swift
Last active July 17, 2020 09:33
Motivation for non-public conformances providing public API
/// A collection formed by adapting some `Base` collection, typically
/// displaying some altered form of the base collection's behavior.
///
/// Default implementations of all requirements are provided, forwarding their
/// implementations to the `Base` collection instance.
public protocol CollectionAdapter: Collection {
/// The type of the underlying collection being adapted.
associatedtype Base: Collection
/// The instance of the underlying collection being adapted.
@dabrahams
dabrahams / UnsafeReference.swift
Created May 15, 2020 13:32
Rescued very old proposal to redesign Unmanaged
#if false
Changes to Unmanaged
-public struct Unmanaged<Instance : AnyObject> {
// New API: `UnsafeReference(bitPattern:)`.
- public static func fromOpaque(value: COpaquePointer) -> Unmanaged
// New API: `OpaquePointer(bitPattern:)`.
- public func toOpaque() -> COpaquePointer
@dabrahams
dabrahams / NominalElementDictionary.swift
Created May 15, 2020 01:59
Plain Swift Dictionary uses a tuple as its Element type, which prevents the Element from conforming to anything
/// A Dictionary with a nominal `Element` type, that can conform to things.
@frozen public struct Dictionary2<Key: Hashable, Value> {
public typealias Base = [Key : Value]
/// A view of a dictionary's keys.
public typealias Keys = Base.Keys
/// A view of a dictionary's values.
public typealias Values = Base.Values
// (A) Definition
protocol P {
static var isEquatable: Bool { get }
}
// (B) Default implementation
extension P {
static var isEquatable: Bool { false }
}
@dabrahams
dabrahams / ASimplerExample.swift
Last active June 18, 2020 14:58
(https://bugs.swift.org/browse/SR-12692) Demonstrates that the current model for protocol extensions and conditional conformances is… unreasonable.
extension Sequence {
var array: Array<Element> {
print("preallocating", self.underestimatedCount)
return Array(self)
}
}
_ = Array(0..<1000).reversed().array // preallocating 1000
_ = repeatElement(1..<10, count: 200).joined().array // preallocating 0