require '_h2ph_pre.ph';

no warnings qw(redefine misc);

unless(defined(&_EXT_NUMERIC_TRAITS)) {
    eval 'sub _EXT_NUMERIC_TRAITS () {1;}' unless defined(&_EXT_NUMERIC_TRAITS);
    require 'limits';
    require 'bits/cpp_type_traits.ph';
    require 'ext/type_traits.ph';
    eval 'sub __glibcxx_signed {
        my($_Tp) = @_;
	    eval q((($_Tp)(-1) < 0));
    }' unless defined(&__glibcxx_signed);
    eval 'sub __glibcxx_digits {
        my($_Tp) = @_;
	    eval q(($sizeof{$_Tp} *  &__CHAR_BIT__ -  &__glibcxx_signed($_Tp)));
    }' unless defined(&__glibcxx_digits);
    eval 'sub __glibcxx_min {
        my($_Tp) = @_;
	    eval q(( &__glibcxx_signed($_Tp) ? ($_Tp)1<<  &__glibcxx_digits($_Tp) : ($_Tp)0));
    }' unless defined(&__glibcxx_min);
    eval 'sub __glibcxx_max {
        my($_Tp) = @_;
	    eval q(( &__glibcxx_signed($_Tp) ? ((((($_Tp)1<< ( &__glibcxx_digits($_Tp) - 1)) - 1) << 1) + 1) : ~($_Tp)0));
    }' unless defined(&__glibcxx_max);
    undef(&__glibcxx_signed) if defined(&__glibcxx_signed);
    undef(&__glibcxx_min) if defined(&__glibcxx_min);
    undef(&__glibcxx_max) if defined(&__glibcxx_max);
    undef(&__glibcxx_digits) if defined(&__glibcxx_digits);
}
1;
