You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2015/05/19 01:34:11 UTC
thrift git commit: THRIFT-2916 Add default toHash method to 'class'
and 'struct' to meet D's associative arrays requirement. Client: D Patch:
Phongphan Phuttha
Repository: thrift
Updated Branches:
refs/heads/master 1f6e380c5 -> e84c58253
THRIFT-2916 Add default toHash method to 'class' and 'struct' to meet D's associative arrays requirement.
Client: D
Patch: Phongphan Phuttha <ph...@acm.org>
This closes #503
Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/e84c5825
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/e84c5825
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/e84c5825
Branch: refs/heads/master
Commit: e84c582531a78b41f81165816e0c03d9cbbb5b8c
Parents: 1f6e380
Author: Jens Geyer <je...@apache.org>
Authored: Mon May 18 22:44:42 2015 +0200
Committer: Jens Geyer <je...@apache.org>
Committed: Tue May 19 01:33:23 2015 +0200
----------------------------------------------------------------------
lib/d/src/thrift/codegen/base.d | 40 ++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/thrift/blob/e84c5825/lib/d/src/thrift/codegen/base.d
----------------------------------------------------------------------
diff --git a/lib/d/src/thrift/codegen/base.d b/lib/d/src/thrift/codegen/base.d
index 35e566a..9061d0b 100644
--- a/lib/d/src/thrift/codegen/base.d
+++ b/lib/d/src/thrift/codegen/base.d
@@ -419,6 +419,10 @@ mixin template TStructHelpers(alias fieldMetaData = cast(TFieldMeta[])null) if (
return (cast()super).opEquals(other);
}
+
+ size_t toHash() const {
+ return thriftToHashImpl();
+ }
} else {
string toString() const {
return thriftToStringImpl();
@@ -427,6 +431,10 @@ mixin template TStructHelpers(alias fieldMetaData = cast(TFieldMeta[])null) if (
bool opEquals(ref const This other) const {
return thriftOpEqualsImpl(other);
}
+
+ size_t toHash() const @safe nothrow {
+ return thriftToHashImpl();
+ }
}
private string thriftToStringImpl() const {
@@ -459,6 +467,15 @@ mixin template TStructHelpers(alias fieldMetaData = cast(TFieldMeta[])null) if (
return true;
}
+ private size_t thriftToHashImpl() const @trusted nothrow {
+ size_t hash = 0;
+ foreach (name; FieldNames!This) {
+ auto val = mixin("this." ~ name);
+ hash += typeid(val).getHash(&val);
+ }
+ return hash;
+ }
+
static if (any!`!a.defaultValue.empty`(mergeFieldMeta!(This, fieldMetaData))) {
static if (is(This _ == class)) {
this() {
@@ -941,6 +958,29 @@ unittest {
static assert(__traits(compiles, { Test t; t.write(cast(TProtocol)null); }));
}
+// Ensure opEquals and toHash consistency.
+unittest {
+ struct TestEquals {
+ int a1;
+
+ mixin TStructHelpers!([
+ TFieldMeta("a1", 1, TReq.OPT_IN_REQ_OUT),
+ ]);
+ }
+
+ TestEquals a, b;
+ assert(a == b);
+ assert(a.toHash() == b.toHash());
+
+ a.a1 = 42;
+ assert(a != b);
+ assert(a.toHash() != b.toHash());
+
+ b.a1 = 42;
+ assert(a == b);
+ assert(a.toHash() == b.toHash());
+}
+
private {
/*
* Returns a D code string containing the matching TType value for a passed