#ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_OBJECTID_H
#define OPENMW_COMPONENTS_DETOURNAVIGATOR_OBJECTID_H

#include <cstddef>
#include <unordered_map>

namespace DetourNavigator
{
    class ObjectId
    {
    public:
        template <class T>
        explicit ObjectId(const T value) throw()
            : mValue(reinterpret_cast<std::size_t>(value))
        {
        }

        std::size_t value() const throw()
        {
            return mValue;
        }

        friend bool operator <(const ObjectId lhs, const ObjectId rhs) throw()
        {
            return lhs.mValue < rhs.mValue;
        }

        friend bool operator ==(const ObjectId lhs, const ObjectId rhs) throw()
        {
            return lhs.mValue == rhs.mValue;
        }

    private:
        std::size_t mValue;
    };
}

namespace std
{
    template <>
    struct hash<DetourNavigator::ObjectId>
    {
        std::size_t operator ()(const DetourNavigator::ObjectId value) const throw()
        {
            return value.value();
        }
    };
}

#endif
