Yes, I intentionally kept this out of inlinable code and orthogonal to whether the object is ObjC. String supports resilient shared and resilient foreign representations. Shared means it can give a pointer to contiguous UTF-8 as the result of a (not inlinable, read-only) function call, as opposed to masking off some biased bits for native. Shared still participates in the majority of the fast path. Foreign has no constraints, nor any extra performance guarantees. I did not bake in the assumption foreign is UTF-16 encoded, at least in the ABI (since -length
is at least a function call anyways).
I have (jokingly) been referring to a common interchange format as a "deconstructed COW" or simply struct 💥🐮
, so that you can do the following:
Array
->💥🐮
String
->💥🐮
(might copy if foreign, might allocate if small) -> String (shared)
And the -ness reflects a common agreement that the
AnyObject?
field is copy-on-write, that is if any holder of the owner has guaranteed uniqueness, it can do an in-place mutation. 💥🐮
allows for exclusive ownership of storage.
This could then be adopted by other types such as Data
, ByteBuffer
, etc., as appropriate.