 extension UnsafeRawPointer : SDAtomicProtocol {
     
     /// Atomic fetch the current value with barrier.
-    public mutating func fetch() -> UnsafeRawPointer {
+    public mutating func fetchSelf() -> (self: UnsafeRawPointer, value: UnsafeRawPointer) {
         @_transparent
         func load(_ theVal: UnsafeMutablePointer<UnsafeRawPointer>) -> UnsafeMutableRawPointer {
             return theVal.withMemoryRebound(to: Optional<UnsafeRawPointer>.self, capacity: 1) { _AtomicLoadPtrBarrier($0) }
         }
-        return UnsafeRawPointer(load(&self))
+        let val = UnsafeRawPointer(load(&self))
+        return (val, val)
     }
     
     /// Atomic sets the value with barrier.

extension UnsafePointer : SDAtomicProtocol {
    
    /// Atomic fetch the current value with barrier.
    public mutating func fetch() -> UnsafePointer {
        @_transparent
        func load(_ theVal: UnsafeMutablePointer<UnsafePointer<Pointee>>) -> UnsafeMutableRawPointer {
            return theVal.withMemoryRebound(to: Optional<UnsafeRawPointer>.self, capacity: 1) { _AtomicLoadPtrBarrier($0) }
        }
        return UnsafePointer(load(&self).assumingMemoryBound(to: Pointee.self))
    }
    
    /// Atomic sets the value with barrier.

extension UnsafeMutablePointer : SDAtomicProtocol {
    
    /// Atomic fetch the current value with barrier.
    public mutating func fetchSelf() -> (self: UnsafeMutablePointer, value: UnsafeMutablePointer) {
        @_transparent
        func load(_ theVal: UnsafeMutablePointer<UnsafeMutablePointer<Pointee>>) -> UnsafeMutableRawPointer {
            return theVal.withMemoryRebound(to: Optional<UnsafeRawPointer>.self, capacity: 1) { _AtomicLoadPtrBarrier($0) }
        }
        let val = load(&self).assumingMemoryBound(to: Pointee.self)
        return (val, val)
    }
    
    /// Atomic sets the value with barrier.
