// See the file "COPYING" in the main distribution directory for copyright.

#include "zeek/Overflow.h"

#include "zeek/Val.h"

namespace zeek::detail {

bool would_overflow(const zeek::Type* from_type, const zeek::Type* to_type, const Val* val) {
    if ( ! to_type || ! from_type )
        return true;

    if ( same_type(to_type, from_type) )
        return false;

    if ( to_type->InternalType() == TYPE_INTERNAL_DOUBLE )
        return false;

    if ( to_type->InternalType() == TYPE_INTERNAL_UNSIGNED ) {
        if ( from_type->InternalType() == TYPE_INTERNAL_DOUBLE )
            return double_to_count_would_overflow(val->InternalDouble());
        if ( from_type->InternalType() == TYPE_INTERNAL_INT )
            return int_to_count_would_overflow(val->InternalInt());
    }

    if ( to_type->InternalType() == TYPE_INTERNAL_INT ) {
        if ( from_type->InternalType() == TYPE_INTERNAL_DOUBLE )
            return double_to_int_would_overflow(val->InternalDouble());
        if ( from_type->InternalType() == TYPE_INTERNAL_UNSIGNED )
            return count_to_int_would_overflow(val->InternalUnsigned());
    }

    return false;
}

} // namespace zeek::detail
