/** * Implementation of dynamic array property support routines. * * Copyright: Copyright Digital Mars 2000 - 2015. * License: Distributed under the * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). * (See accompanying file LICENSE) * Authors: Walter Bright * Source: $(DRUNTIMESRC rt/_adi.d) */ module rt.adi; //debug=adi; // uncomment to turn on debugging printf's private { debug(adi) import core.stdc.stdio; } /*************************************** * Support for array equality test. * Returns: * 1 equal * 0 not equal */ extern (C) int _adEq2(void[] a1, void[] a2, TypeInfo ti) { debug(adi) printf("_adEq2(a1.length = %d, a2.length = %d)\n", a1.length, a2.length); if (a1.length != a2.length) return 0; // not equal if (!ti.equals(&a1, &a2)) return 0; return 1; } @safe unittest { debug(adi) printf("array.Eq unittest\n"); struct S(T) { T val; } alias String = S!string; alias Float = S!float; String[1] a = [String("hello"c)]; assert(a != [String("hel")]); assert(a != [String("helloo")]); assert(a != [String("betty")]); assert(a == [String("hello")]); assert(a != [String("hxxxx")]); Float[1] fa = [Float(float.nan)]; assert(fa != fa); } unittest { debug(adi) printf("struct.Eq unittest\n"); static struct TestStruct { int value; bool opEquals(const TestStruct rhs) const { return value == rhs.value; } } TestStruct[] b = [TestStruct(5)]; TestStruct[] c = [TestStruct(6)]; assert(_adEq2(*cast(void[]*)&b, *cast(void[]*)&c, typeid(TestStruct[])) == false); assert(_adEq2(*cast(void[]*)&b, *cast(void[]*)&b, typeid(TestStruct[])) == true); }