Skip to content

Commit

Permalink
Merge b92d8d1 into 5dcb10d
Browse files Browse the repository at this point in the history
  • Loading branch information
Jan Jurzitza committed Sep 8, 2016
2 parents 5dcb10d + b92d8d1 commit 329ee54
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 0 deletions.
4 changes: 4 additions & 0 deletions dub.sdl
Expand Up @@ -5,3 +5,7 @@ homepage "https://github.com/msoucy/painlesstraits"
authors "Edwin van Leeuwen" "Pierre Krafft" "Matt Soucy"
license "BSL-1.0"
targetType "library"
configuration "unittest" {
sourcePaths "source" "test"
importPaths "source" "test"
}
32 changes: 32 additions & 0 deletions source/painlesstraits.d
Expand Up @@ -190,6 +190,38 @@ unittest {
assert( foo.failure(1) == 1 );
}

private template publicMemberFilter(T, alias filter)
{
template Filter(alias memberName)
{
static if (is(typeof(__traits(getMember, T.init, memberName))))
{
static if (__traits(compiles, { enum Foo = __traits(getMember, T.init, memberName); }))
{
enum Filter = filter!(__traits(getMember, T.init, memberName));
}
else
enum Filter = false;
}
else
enum Filter = false;
}
}

template allPublicFieldsOrProperties(T)
{
import std.meta : Filter;
enum allPublicFieldsOrProperties = Filter!(publicMemberFilter!(T, isFieldOrProperty).Filter, __traits(allMembers, T));
static assert(allPublicFieldsOrProperties.length > 0, "No properties for type " ~ T.stringof);
}

template allPublicFields(T)
{
import std.meta : Filter;
enum allPublicFields = Filter!(publicMemberFilter!(T, isField).Filter, __traits(allMembers, T));
static assert(allPublicFields.length > 0, "No properties for type " ~ T.stringof);
}

unittest {
import std.typecons : Tuple;
// toString is template, should be ignored
Expand Down
43 changes: 43 additions & 0 deletions test/publicmembers.d
@@ -0,0 +1,43 @@
import painlesstraits;

unittest {
struct TestStruct
{
int i = 5;
string str = "a";
long l;
private double b;
static ubyte s;

void foo()
{
}

int bar() @property
{
return i;
}

this(int j)
{
i = j;
}

void hello()()
{
}
}

alias members = allPublicFieldsOrProperties!TestStruct;
static assert(members.length == 4);
static assert(members[0] == "i");
static assert(members[1] == "str");
static assert(members[2] == "l");
static assert(members[3] == "bar");

alias fields = allPublicFields!TestStruct;
static assert(fields.length == 3);
static assert(fields[0] == "i");
static assert(fields[1] == "str");
static assert(fields[2] == "l");
}

0 comments on commit 329ee54

Please sign in to comment.