Mercurial > projects > qtd
diff d2/qtd/meta/Runtime.d @ 372:a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Thu, 08 Jul 2010 17:19:05 +0300 |
parents | 185df9220ea7 |
children |
line wrap: on
line diff
--- a/d2/qtd/meta/Runtime.d Sun Jul 04 14:17:49 2010 +0100 +++ b/d2/qtd/meta/Runtime.d Thu Jul 08 17:19:05 2010 +0300 @@ -91,6 +91,9 @@ } } +/** + All meta-object classes inherit from this base class. + */ abstract class MetaBase { alias typeof(this) This; @@ -123,7 +126,7 @@ { alias attr[2] MA; alias TypeTuple!(attr[0..2], attr[3..$]) args; - attributes ~= MA /*COMPILER BUG: tuple element as tuple*/[0].create!args(); + attributes ~= MA /*COMPILER BUG: tuple element as tuple*/[0].create(args); } } } @@ -238,7 +241,7 @@ static struct AllMembersRange { - public //private + private { This metaClass_; MetaBase[] members_; @@ -249,10 +252,7 @@ { metaClass_ = metaClass_.base_; if (!metaClass_) - { - members_ = null; return; - } } members_ = metaClass_.members_; @@ -345,6 +345,7 @@ /* internal */ void construct(T : Object)() { super.construct!T(); + classInfo_ = T.classinfo; static if (!is(T == Object)) { alias BaseClassesTuple!(T)[0] Base; @@ -353,7 +354,6 @@ next_ = base_.firstDerived_; base_.firstDerived_ = this; } - classInfo_ = T.classinfo; } /** @@ -393,20 +393,9 @@ m = sharedM; } - assert (m is sharedM); return m; } -version (QtdUnittest) unittest -{ - class A - { - } - - auto m = meta!A; - assert(m is meta!A); -} - /** */ // only classes and structs for now @@ -438,14 +427,13 @@ super(name, opts); } - static MetaVariantAttribute create(string name, AttributeOptions opts, A...)() + static MetaVariantAttribute create(A...)(string name, AttributeOptions opts, A args) { auto ret = new This(name, opts); + foreach(i, _; A) - { - static if (__traits(compiles, { ret.values ~= Variant(A[i]); } )) - ret.values ~= Variant(A[i]); - } + ret.values ~= Variant(args[i]); + return ret; } } @@ -464,42 +452,50 @@ super(name, opts); } - static This create(string name, AttributeOptions opts, A...)() + static This create(A...)(string name, AttributeOptions opts, A args) { auto ret = new This(name, opts); foreach(i, _; A) - { - static if (i % 2 == 0 && __traits(compiles, { ret.values[A[i]] = Variant(A[i + 1]); } )) - ret.values[A[i]] = Variant(A[i + 1]); // PHOBOS BUG: phobos asserts on this - } + ret.values[args[i]] = Variant(args[i + 1]); // PHOBOS BUG: phobos asserts on this + return ret; } } version(QtdUnittest) unittest { + enum x = 42; static void foo() {} static class C { - mixin InnerAttribute!("variantAttribute", MetaVariantAttribute, "22", foo, 33); + + mixin InnerAttribute!("variantAttribute", MetaVariantAttribute, "22", x, 33); + + /+ PHOBOS BUG: variant is unusable with AAs mixin InnerAttribute!("variantDictAttribute", MetaVariantDictAttribute, - //"a", "33", // PHOBOS BUG: variant is unusable with AAs - "b", foo - //"c", 44 + "a", "33", + "b", 44, + "c", x ); + +/ } auto attrs = meta!(C).attributes; - assert(attrs.length == 2); + assert(attrs.length == 1); auto attr = cast(MetaVariantAttribute)attrs[0]; assert(attr.name == "variantAttribute"); assert(attr.values[0] == "22"); - assert(attr.values[1] == 33); + assert(attr.values[1] == x); + assert(attr.values[2] == 33); + + /+ auto attr2 = cast(MetaVariantDictAttribute) attrs[1]; assert(attr2.name == "variantDictAttribute"); //assert(attr2.values["a"] == "33"); - //assert(attr2.values["c"] == 44); + //assert(attr2.values["b"] == 44); + //assert(attr2.values["c"] == x); + +/ }