<div dir="ltr"><div>UnsafePointer and UnsafeMutablePointer both contain initializers to convert from Int and Uint, but Int and UInt lack initializers to convert from UnsafePointer and UnsafeMutablePointer. Over in swift-dev, Dimitri Gribenko proposed adding something like the following initializers to stdlib.</div><div><br></div><div><div>extension UInt {</div><div>  init&lt;T&gt;(bitPattern: UnsafePointer&lt;T&gt;) {</div><div>    self = UInt(Builtin.ptrtoint_Word(bitPattern._rawValue))</div><div>  }</div><div><br></div><div>  init&lt;T&gt;(bitPattern: UnsafeMutablePointer&lt;T&gt;) {</div><div>    self = UInt(Builtin.ptrtoint_Word(bitPattern._rawValue))</div><div>  }</div><div>}</div><div><br></div><div>extension Int {</div><div>  init&lt;T&gt;(bitPattern: UnsafePointer&lt;T&gt;) {</div><div>    self = Int(Builtin.ptrtoint_Word(bitPattern._rawValue))</div><div>  }</div><div><br></div><div>  init&lt;T&gt;(bitPattern: UnsafeMutablePointer&lt;T&gt;) {</div><div>    self = Int(Builtin.ptrtoint_Word(bitPattern._rawValue))</div><div>  }</div><div>}</div></div><div><br></div><a href="https://bugs.swift.org/browse/SR-131">https://bugs.swift.org/browse/SR-131</a><br><div><br></div><div>There are two motivations behind this proposal. First, it would allow more complicated pointer arithmetic, such as checking pointer alignment. Second, some C functions take intptr_t and uintptr_t parameters, which are not compatible with UnsafePointer.</div><div><br></div><div>As noted in UnsafePointer.swift.gyb the conversions from UInt and Int are fundamentally unsafe, and these proposed conversions would also be unsafe. They would also allow for more unsafe pointer arithmetic operations. For example, it would allow users to convert two UnsafePointers to UInt8s in order to find the distance between them, which would be a problem if the user subtracted the larger pointer from the smaller pointer.</div><div><br></div><div>Because of this, and because it&#39;s part of the Swift evolution process, it&#39;s worth considering alternatives. Pointer arithmetic could be taken care of by adding functions to UnsafePointer, and these may be worth proposing separately. I&#39;m thinking something like this.</div><div><br></div><div><div style="font-size:13px">func distanceToBoundary(_ boundary: Int) -&gt; Int {</div><div style="font-size:13px">    return Int(Builtin.ptrtoint_Word(self._rawValue)) % boundary</div><div style="font-size:13px">}</div><div style="font-size:13px"><br></div><div style="font-size:13px">func isAlignedToBoundary(_ boundary: Int) -&gt; Bool {</div><div style="font-size:13px">    return distanceToBoundary(boundary) == 0</div><div style="font-size:13px">}</div></div><div><br></div><div>As for intptr_t parameters, the only alternative I can think of is to require users to write adaptor functions in C. Requiring users to write C code also works for pointer alignment and other pointer arithmetic, but it doesn&#39;t feel like a great solution to the problem.</div><div><br></div><div>Any feedback, additional motivations, or additional alternatives welcome. Thanks.</div></div>