summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md1
-rw-r--r--dub.json2
-rw-r--r--meta/tanya/meta/trait.d207
-rw-r--r--middle/tanya/memory/mmappool.d64
-rw-r--r--source/tanya/container/buffer.d1
-rw-r--r--source/tanya/conv.d2
-rw-r--r--source/tanya/hash/lookup.d1
-rw-r--r--source/tanya/net/iface.d18
8 files changed, 69 insertions, 227 deletions
diff --git a/README.md b/README.md
index d6b1074..690714f 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,5 @@
# Tanya
-[![CI/CD](https://img.shields.io/badge/CI-CD-brightgreen)](https://build.caraus.tech/go/pipelines)
[![Dub version](https://img.shields.io/dub/v/tanya.svg)](https://code.dlang.org/packages/tanya)
[![Dub downloads](https://img.shields.io/dub/dt/tanya.svg)](https://code.dlang.org/packages/tanya)
[![License: MPL 2.0](https://img.shields.io/badge/license-MPL_2.0-blue.svg)](https://opensource.org/licenses/MPL-2.0)
diff --git a/dub.json b/dub.json
index 3b652b9..79f7c90 100644
--- a/dub.json
+++ b/dub.json
@@ -2,7 +2,7 @@
"name": "tanya",
"description": "@nogc library. Containers, networking, metaprogramming, memory management, utilities",
"license": "MPL-2.0",
- "copyright": "© Eugene Wissner <info@caraus.de>",
+ "copyright": "© Eugene Wissner <belka@caraus.de>",
"authors": [
"Eugene Wissner"
],
diff --git a/meta/tanya/meta/trait.d b/meta/tanya/meta/trait.d
index 36bab8e..2d81a9e 100644
--- a/meta/tanya/meta/trait.d
+++ b/meta/tanya/meta/trait.d
@@ -70,47 +70,6 @@ enum bool isWideString(T) = is(T : const dchar[]) && !isStaticArray!T;
static assert(!isWideString!(dchar[10]));
}
-/**
- * Determines whether $(D_PARAM T) is a complex type.
- *
- * Complex types are:
- * $(UL
- * $(LI cfloat)
- * $(LI ifloat)
- * $(LI cdouble)
- * $(LI idouble)
- * $(LI creal)
- * $(LI ireal)
- * )
- *
- * Params:
- * T = A type.
- *
- * Returns: $(D_KEYWORD true) if $(D_PARAM T) is a complex type,
- * $(D_KEYWORD false) otherwise.
- */
-enum bool isComplex(T) = is(Unqual!(OriginalType!T) == cfloat)
- || is(Unqual!(OriginalType!T) == ifloat)
- || is(Unqual!(OriginalType!T) == cdouble)
- || is(Unqual!(OriginalType!T) == idouble)
- || is(Unqual!(OriginalType!T) == creal)
- || is(Unqual!(OriginalType!T) == ireal);
-
-///
-@nogc nothrow pure @safe unittest
-{
- static assert(isComplex!cfloat);
- static assert(isComplex!ifloat);
- static assert(isComplex!cdouble);
- static assert(isComplex!idouble);
- static assert(isComplex!creal);
- static assert(isComplex!ireal);
-
- static assert(!isComplex!float);
- static assert(!isComplex!double);
- static assert(!isComplex!real);
-}
-
/*
* Tests whether $(D_PARAM T) is an interface.
*
@@ -354,32 +313,6 @@ enum bool isIntegral(T) = isUnsigned!T
}
/**
- * Determines whether $(D_PARAM T) is a numeric (floating point, integral or
- * complex) type.
-*
- * Params:
- * T = A type.
- *
- * Returns: $(D_KEYWORD true) if $(D_PARAM T) is a numeric type,
- * $(D_KEYWORD false) otherwise.
- *
- * See_Also: $(D_PSYMBOL isIntegral!T),
- * $(D_PSYMBOL isFloatingPoint),
- * $(D_PSYMBOL isComplex).
- */
-enum bool isNumeric(T) = isIntegral!T || isFloatingPoint!T || isComplex!T;
-
-///
-@nogc nothrow pure @safe unittest
-{
- alias F = float;
- static assert(isNumeric!F);
- static assert(!isNumeric!bool);
- static assert(!isNumeric!char);
- static assert(!isNumeric!wchar);
-}
-
-/**
* Determines whether $(D_PARAM T) is a boolean type, i.e. $(D_KEYWORD bool).
*
* Params:
@@ -459,67 +392,6 @@ enum bool isSomeChar(T) = is(Unqual!(OriginalType!T) == char)
}
/**
- * Determines whether $(D_PARAM T) is a scalar type.
- *
- * Scalar types are numbers, booleans and characters.
- *
- * Params:
- * T = A type.
- *
- * Returns: $(D_KEYWORD true) if $(D_PARAM T) is a scalar type,
- * $(D_KEYWORD false) otherwise.
- *
- * See_Also: $(D_PSYMBOL isNumeric),
- * $(D_PSYMBOL isBoolean),
- * $(D_PSYMBOL isSomeChar).
- */
-enum bool isScalarType(T) = isNumeric!T || isBoolean!T || isSomeChar!T;
-
-///
-@nogc nothrow pure @safe unittest
-{
- static assert(isScalarType!int);
- static assert(!isScalarType!(int[]));
-}
-
-/**
- * Determines whether $(D_PARAM T) is a basic type.
- *
- * Basic types are scalar types and $(D_KEYWORD void).
- *
- * Params:
- * T = A type.
- *
- * Returns: $(D_KEYWORD true) if $(D_PARAM T) is a basic type,
- * $(D_KEYWORD false) otherwise.
- *
- * See_Also: $(D_PSYMBOL isScalarType).
- */
-enum bool isBasicType(T) = isScalarType!T || is(T : void);
-
-///
-@nogc nothrow pure @safe unittest
-{
- static struct S
- {
- }
- class C
- {
- }
- enum E : int
- {
- i = 0,
- }
-
- static assert(isBasicType!void);
- static assert(isBasicType!(shared void));
- static assert(isBasicType!E);
- static assert(!isBasicType!(int*));
- static assert(!isBasicType!(void function()));
- static assert(!isBasicType!C);
-}
-
-/**
* Determines whether $(D_PARAM T) is a pointer type.
*
* Params:
@@ -677,34 +549,6 @@ template isAssociativeArray(T)
}
/**
- * Determines whether $(D_PARAM T) is a built-in type.
- *
- * Built-in types are all basic types and arrays.
- *
- * Params:
- * T = A type.
- *
- * Returns: $(D_KEYWORD true) if $(D_PARAM T) is a built-in type,
- * $(D_KEYWORD false) otherwise.
- *
- * See_Also: $(D_PSYMBOL isBasicType!T),
- * $(D_PSYMBOL isArray),
- * $(D_PSYMBOL isAssociativeArray).
- */
-enum bool isBuiltinType(T) = isBasicType!T
- || isArray!T
- || isAssociativeArray!T;
-
-///
-@nogc nothrow pure @safe unittest
-{
- static assert(isBuiltinType!int);
- static assert(isBuiltinType!(int[]));
- static assert(isBuiltinType!(int[int]));
- static assert(!isBuiltinType!(int*));
-}
-
-/**
* Determines whether $(D_PARAM T) is an aggregate type.
*
* Aggregate types are:
@@ -845,57 +689,6 @@ enum bool isSomeString(T) = isNarrowString!T || isWideString!T;
}
/**
- * Returns the minimum value of type $(D_PARAM T). In contrast to
- * $(D_INLINECODE T.min) this template works with floating point and complex
- * types as well.
- *
- * Params:
- * T = Integral, boolean, floating point, complex or character type.
- *
- * Returns: The minimum value of $(D_PARAM T).
- *
- * See_Also: $(D_PSYMBOL isIntegral),
- * $(D_PSYMBOL isBoolean),
- * $(D_PSYMBOL isSomeChar),
- * $(D_PSYMBOL isFloatingPoint),
- * $(D_PSYMBOL isComplex).
- */
-template mostNegative(T)
-{
- static if (isIntegral!T || isBoolean!T || isSomeChar!T)
- {
- enum T mostNegative = T.min;
- }
- else static if (isFloatingPoint!T || isComplex!T)
- {
- enum T mostNegative = -T.max;
- }
- else
- {
- static assert(false, T.stringof ~ " doesn't have the minimum value");
- }
-}
-
-///
-@nogc nothrow pure @safe unittest
-{
- static assert(mostNegative!char == char.min);
- static assert(mostNegative!wchar == wchar.min);
- static assert(mostNegative!dchar == dchar.min);
-
- static assert(mostNegative!byte == byte.min);
- static assert(mostNegative!ubyte == ubyte.min);
- static assert(mostNegative!bool == bool.min);
-
- static assert(mostNegative!float == -float.max);
- static assert(mostNegative!double == -double.max);
- static assert(mostNegative!real == -real.max);
-
- static assert(mostNegative!ifloat == -ifloat.max);
- static assert(mostNegative!cfloat == -cfloat.max);
-}
-
-/**
* Determines whether the type $(D_PARAM T) is copyable.
*
* Only structs can be not copyable if their postblit constructor or the
diff --git a/middle/tanya/memory/mmappool.d b/middle/tanya/memory/mmappool.d
index 5c25dd4..3ce49d5 100644
--- a/middle/tanya/memory/mmappool.d
+++ b/middle/tanya/memory/mmappool.d
@@ -19,13 +19,30 @@ import tanya.memory.allocator;
import tanya.memory.op;
import tanya.os.error;
-extern(C) pragma(mangle, "mmap")
-private void* mapMemory(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
-@nogc nothrow pure @system;
+version (Windows)
+{
+ import core.sys.windows.basetsd : SIZE_T;
+ import core.sys.windows.windef : BOOL, DWORD;
+ import core.sys.windows.winnt : MEM_COMMIT, MEM_RELEASE, PAGE_READWRITE, PVOID;
+
+ extern (Windows)
+ private PVOID VirtualAlloc(PVOID, SIZE_T, DWORD, DWORD)
+ @nogc nothrow pure @system;
-extern(C) pragma(mangle, "munmap")
-private bool unmapMemory(shared void* addr, size_t length)
-@nogc nothrow pure @system;
+ extern (Windows)
+ private BOOL VirtualFree(shared PVOID, SIZE_T, DWORD)
+ @nogc nothrow pure @system;
+}
+else
+{
+ extern(C) pragma(mangle, "mmap")
+ private void* mapMemory(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
+ @nogc nothrow pure @system;
+
+ extern(C) pragma(mangle, "munmap")
+ private bool unmapMemory(shared void* addr, size_t length)
+ @nogc nothrow pure @system;
+}
/*
* This allocator allocates memory in regions (multiple of 64 KB for example).
@@ -192,7 +209,10 @@ final class MmapPool : Allocator
{
block.region.next.prev = block.region.prev;
}
- return unmapMemory(block.region, block.region.size) == 0;
+ version (Windows)
+ return VirtualFree(block.region, 0, MEM_RELEASE) != 0;
+ else
+ return unmapMemory(block.region, block.region.size) == 0;
}
// Merge blocks if neigbours are free.
if (block.next !is null && block.next.free)
@@ -380,15 +400,29 @@ final class MmapPool : Allocator
{
return null;
}
- void* p = mapMemory(null,
- regionSize,
- PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS,
- -1,
- 0);
- if (cast(ptrdiff_t) p == -1)
+ version (Windows)
{
- return null;
+ void* p = VirtualAlloc(null,
+ regionSize,
+ MEM_COMMIT,
+ PAGE_READWRITE);
+ if (p is null)
+ {
+ return null;
+ }
+ }
+ else
+ {
+ void* p = mapMemory(null,
+ regionSize,
+ PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS,
+ -1,
+ 0);
+ if (cast(ptrdiff_t) p == -1)
+ {
+ return null;
+ }
}
Region region = cast(Region) p;
diff --git a/source/tanya/container/buffer.d b/source/tanya/container/buffer.d
index fac9a82..6c8a1e2 100644
--- a/source/tanya/container/buffer.d
+++ b/source/tanya/container/buffer.d
@@ -14,6 +14,7 @@
*/
module tanya.container.buffer;
+import std.traits : isScalarType;
import tanya.memory.allocator;
import tanya.meta.trait;
diff --git a/source/tanya/conv.d b/source/tanya/conv.d
index dcd6a5c..6d6dfdd 100644
--- a/source/tanya/conv.d
+++ b/source/tanya/conv.d
@@ -14,7 +14,7 @@
*/
module tanya.conv;
-import std.traits : Unsigned;
+import std.traits : Unsigned, isNumeric;
import tanya.container.string;
import tanya.memory.allocator;
import tanya.meta.trait;
diff --git a/source/tanya/hash/lookup.d b/source/tanya/hash/lookup.d
index a4fd55a..536904d 100644
--- a/source/tanya/hash/lookup.d
+++ b/source/tanya/hash/lookup.d
@@ -14,6 +14,7 @@
*/
module tanya.hash.lookup;
+import std.traits : isScalarType;
import tanya.meta.trait;
import tanya.range.primitive;
diff --git a/source/tanya/net/iface.d b/source/tanya/net/iface.d
index 8e2675a..3bc165a 100644
--- a/source/tanya/net/iface.d
+++ b/source/tanya/net/iface.d
@@ -22,8 +22,22 @@ import tanya.range;
version (Windows)
{
- import tanya.sys.windows.ifdef;
- import tanya.sys.windows.iphlpapi;
+ private union NET_LUID_LH { ulong Value, Info; }
+ private alias NET_LUID = NET_LUID_LH;
+ private alias NET_IFINDEX = uint;
+ private enum IF_MAX_STRING_SIZE = 256;
+ extern(Windows) @nogc nothrow private @system
+ {
+ uint ConvertInterfaceNameToLuidA(const(char)* InterfaceName,
+ NET_LUID* InterfaceLuid);
+ uint ConvertInterfaceLuidToIndex(const(NET_LUID)* InterfaceLuid,
+ NET_IFINDEX* InterfaceIndex);
+ uint ConvertInterfaceIndexToLuid(NET_IFINDEX InterfaceIndex,
+ NET_LUID* InterfaceLuid);
+ uint ConvertInterfaceLuidToNameA(const(NET_LUID)* InterfaceLuid,
+ char* InterfaceName,
+ size_t Length);
+ }
}
else version (Posix)
{