/**
 * TypeInfo support code.
 *
 * Copyright: Copyright Digital Mars 2016.
 * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
 * Authors:   Kenji Hara
 */

/*          Copyright Digital Mars 2016.
 * Distributed under the Boost Software License, Version 1.0.
 *    (See accompanying file LICENSE or copy at
 *          http://www.boost.org/LICENSE_1_0.txt)
 */
module rt.typeinfo.ti_n;

// typeof(null)

class TypeInfo_n : TypeInfo
{
    override string toString() const @safe { return "typeof(null)"; }

    override size_t getHash(scope const void* p) const
    {
        return 0;
    }

    override bool equals(in void* p1, in void* p2) const @trusted
    {
        //return *cast(typeof(null)*)p1 is *cast(typeof(null)*)p2;
        return true;
    }

    override int compare(in void* p1, in void* p2) const @trusted
    {
        //if (*cast(int*) p1 < *cast(int*) p2)
        //    return -1;
        //else if (*cast(int*) p1 > *cast(int*) p2)
        //    return 1;
        return 0;
    }

    override @property size_t tsize() const
    {
        return typeof(null).sizeof;
    }

    override const(void)[] initializer() const @trusted
    {
        __gshared immutable void[typeof(null).sizeof] init;
        return init[];
    }

    override void swap(void *p1, void *p2) const @trusted
    {
        //auto t = *cast(typeof(null)*)p1;
        //*cast(typeof(null)*)p1 = *cast(typeof(null)*)p2;
        //*cast(typeof(null)*)p2 = t;
    }

    override @property immutable(void)* rtInfo() nothrow pure const @safe { return rtinfoNoPointers; }
}
