sdiff/source/sdiff/init.d

59 lines
1.1 KiB
D

module sdiff.init;
import xdiff;
import core.stdc.stdlib : malloc, free, realloc;
import std.exception : enforce;
import std.conv : to;
extern (C)
{
private void* wrap_malloc(void*, uint size)
{
return malloc(size);
}
private void wrap_free(void*, void* p)
{
free(p);
}
private void* wrap_realloc(void*, void* p, uint size)
{
return realloc(p, size);
}
}
shared static this()
{
memallocator_t m = {null, &wrap_malloc, &wrap_free, &wrap_realloc};
auto rc = xdl_set_allocator(&m);
enforce(rc == 0, "xdl_set_allocator failed (rc=" ~ rc.to!string ~ ")");
}
abstract class MM
{
private:
mmfile_t initMmfile(size_t blockSize)
{
mmfile_t mf;
auto rc = xdl_init_mmfile(&mf, blockSize.to!long, XDL_MMF_ATOMIC);
enforce(rc == 0, "xdl_init_mmfile failed (rc=" ~ rc.to!string ~ ")");
return mf;
}
protected:
mmfile_t _inner;
public:
this(long bsize = 0) {
_inner = initMmfile(bsize);
}
final @property size_t size()
{
return xdl_mmfile_size(&_inner).to!size_t;
}
final bool isCompact() const
{
return xdl_mmfile_iscompact(cast(mmfile_t*)&_inner) != 0;
}
}