On Saturday, 24 June 2017 at 12:22:54 UTC, Petar Kirov [ZombineDev] wrote:
[ ... ]

/**
 * Returns:
 * A pointer to a null-terminated string in O(1) time,
 * (with regards to the length of the string and the required
 * memory, if any) or `null` if  * the time constraint
 * can't be met.
 */
immutable(T)* fastStringZ(T)(return immutable(T)[] s) @trusted
if (isSomeChar!T)
{
    if (isStaticallyAllocated(s) && s.ptr[s.length] == 0)
        return s.ptr;
    else
        return null;
}
---

(Without `isStaticallyAllocated`, `fastStringZ` may *appear* to
work but if you pass the pointer to e.g. a C library and that
library keeps it after the call has completed, good luck tracking
memory corruption if the slice was pointing to automatic/dynamic
memory - e.g. static array buffer on the stack or GC / RC * heap
allocation.
* malloc or custom allocator + smart pointer wrapper)

Please note that not all static immutable strings have to be null terminated. It is possible to generate a string at ctfe which may appear the same as string literal, but does not have the \0 at the end.

Reply via email to