mirror of
https://github.com/bitwiseworks/gcc-os2.git
synced 2026-02-14 06:04:44 +00:00
Source URL: git://gcc.gnu.org/git/gcc.git Source Commit: 3e7b85061947bdc7c7465743ba90734566860821
67 lines
1.4 KiB
D
67 lines
1.4 KiB
D
/**
|
|
* 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;
|
|
}
|