| /** |
| * Common code for writing containers. |
| * |
| * Copyright: Copyright Martin Nowak 2013. |
| * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0). |
| * Authors: Martin Nowak |
| */ |
| module rt.util.container.common; |
| |
| import core.stdc.stdlib : malloc, realloc; |
| public import core.stdc.stdlib : free; |
| import core.internal.traits : dtorIsNothrow; |
| nothrow: |
| |
| void* xrealloc(void* ptr, size_t sz) nothrow @nogc |
| { |
| import core.exception; |
| |
| if (!sz) { .free(ptr); return null; } |
| if (auto nptr = .realloc(ptr, sz)) return nptr; |
| .free(ptr); onOutOfMemoryErrorNoGC(); |
| assert(0); |
| } |
| |
| void* xmalloc(size_t sz) nothrow @nogc |
| { |
| import core.exception; |
| if (auto nptr = .malloc(sz)) |
| return nptr; |
| onOutOfMemoryErrorNoGC(); |
| assert(0); |
| } |
| |
| void destroy(T)(ref T t) if (is(T == struct) && dtorIsNothrow!T) |
| { |
| scope (failure) assert(0); // nothrow hack |
| object.destroy(t); |
| } |
| |
| void destroy(T)(ref T t) if (!is(T == struct)) |
| { |
| t = T.init; |
| } |
| |
| void initialize(T)(ref T t) if (is(T == struct)) |
| { |
| import core.stdc.string; |
| if (auto p = typeid(T).initializer().ptr) |
| memcpy(&t, p, T.sizeof); |
| else |
| memset(&t, 0, T.sizeof); |
| } |
| |
| void initialize(T)(ref T t) if (!is(T == struct)) |
| { |
| t = T.init; |
| } |
| |
| version (unittest) struct RC() |
| { |
| nothrow: |
| this(size_t* cnt) { ++*(_cnt = cnt); } |
| ~this() { if (_cnt) --*_cnt; } |
| this(this) { if (_cnt) ++*_cnt; } |
| size_t* _cnt; |
| } |