Add functional module. Fix #52

This commit is contained in:
Eugen Wissner 2018-07-07 12:17:59 +02:00
parent 3df4eb6259
commit a94b1b0af4
4 changed files with 83 additions and 2 deletions

View File

@ -7,6 +7,7 @@ os:
language: d
d:
- dmd-2.081.0
- dmd-2.080.1
- dmd-2.079.1
- dmd-2.078.3
@ -23,7 +24,7 @@ addons:
- gcc-multilib
before_script:
- if [ "`$DC --version | head -n 1 | grep 'v2.080.1'`" ]; then
- if [ "`$DC --version | head -n 1 | grep 'v2.081.0'`" ]; then
export UNITTEST="unittest-cov";
fi

View File

@ -32,6 +32,8 @@ types.
* `encoding`: This package provides tools to work with text encodings.
* `exception`: Common exceptions and errors.
* `format`: Formatting and conversion functions.
* `functional`: Functions that manipulate other functions and their argument
lists.
* `hash`: Hash algorithms.
* `math`: Arbitrary precision integer and a set of functions.
* `memory`: Tools for manual memory management (allocators, smart pointers).
@ -172,7 +174,8 @@ parameter is used)
| DMD | GCC |
|:-------:|:---------:|
| 2.080.1 | *master* |
| 2.081.0 | *master* |
| 2.080.1 | |
| 2.079.1 | |
| 2.078.3 | |
| 2.077.1 | |

View File

@ -3,6 +3,12 @@ os: Visual Studio 2015
environment:
matrix:
- DC: dmd
DVersion: 2.081.0
arch: x64
- DC: dmd
DVersion: 2.081.0
arch: x86
- DC: dmd
DVersion: 2.080.1
arch: x64

71
source/tanya/functional.d Normal file
View File

@ -0,0 +1,71 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/**
* Functions that manipulate other functions and their argument lists.
*
* Copyright: Eugene Wissner 2018.
* License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
* Mozilla Public License, v. 2.0).
* Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
* Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/functional.d,
* tanya/functional.d)
*/
module tanya.functional;
import tanya.algorithm.mutation;
import tanya.meta.metafunction;
private template forwardOne(alias arg)
{
static if (__traits(isRef, arg) || __traits(isOut, arg))
{
alias forwardOne = arg;
}
else
{
@property auto forwardOne()
{
return move(arg);
}
}
}
/**
* Forwards its argument list preserving $(D_KEYWORD ref) and $(D_KEYWORD out)
* storage classes.
*
* $(D_PSYMBOL forward) accepts a list of variables or literals. It returns an
* argument list of the same length that can be for example passed to a
* function accepting the arguments of this type.
*
* Params:
* args = Argument list.
*
* Returns: $(D_PARAM args) with their original storage classes.
*/
template forward(args...)
{
static if (args.length == 1)
{
alias forward = forwardOne!(args[0]);
}
else
{
alias forward = Map!(forwardOne, args);
}
}
///
@nogc nothrow pure @safe unittest
{
static assert(is(typeof((int i) { int v = forward!i; })));
static assert(is(typeof((ref int i) { int v = forward!i; })));
static assert(is(typeof({
void f(int i, ref int j, out int k)
{
f(forward!(i, j, k));
}
})));
}