gcc/libstdc++-v3/mknumeric_limits

368 lines
11 KiB
Bash
Executable File

#! /bin/sh
# mknumeric_limits: generates
# - part of bits/std_limits.h completed by gen-num-limits.cc
# - src/limitsMEMBERS.cc that contains the definition of various
# static data members of specialization of class template numeric_limits
#
echo "running mknumeric_limits"
BUILD_DIR=$1
if [ ! -d "$BUILD_DIR" ]; then
echo "build directory $BUILD_DIR not found, exiting."
exit 1
fi
if [ ! -d "$BUILD_DIR/include" ]; then
mkdir "$BUILD_DIR/include"
fi
if [ ! -d "$BUILD_DIR/include/bits" ]; then
mkdir "$BUILD_DIR/include/bits"
fi
if [ ! -d "$BUILD_DIR/src" ]; then
mkdir "$BUILD_DIR/src"
fi
OUT_H="$BUILD_DIR/include/bits/std_limits.h"
OUT_C="$BUILD_DIR/src/limitsMEMBERS.cc"
if [ -f $OUT_C ]; then
rm -f $OUT_H $OUT_C $OUT_H-t $OUT_C-t
fi
SRC_DIR=$2
if [ ! -d "$SRC_DIR" ]; then
echo "source directory $SRC_DIR not found, exiting."
exit 1
fi
XCOMPILE=$3
if [ $XCOMPILE -eq 1 ]; then
echo "using default values for cross compiles"
cp $SRC_DIR/include/bits/limits_generic.h $OUT_H
cp $SRC_DIR/src/limits_generic.cc $OUT_C
exit 0;
fi
CC=${CC="$BUILD_DIR/../../gcc/xgcc -B$BUILD_DIR/../../gcc/"}
# We output to a temporary file, so that we don't appear to have
# succeeded unless we actually do.
cat <<EOF > $OUT_H-t
// The template and inlines for the -*- C++ -*- numeric_limits classes.
// Copyright (C) 1999-2001 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// Note: this is not a conforming implementation.
// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr>
//
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT!
//
//
// ISO 14882:1998
// 18.2.1
//
#ifndef _CPP_NUMERIC_LIMITS
#define _CPP_NUMERIC_LIMITS 1
#include <bits/c++config.h>
#include <bits/std_cfloat.h>
namespace std
{
enum float_round_style
{
round_indeterminate = -1,
round_toward_zero = 0,
round_to_nearest = 1,
round_toward_infinity = 2,
round_toward_neg_infinity = 3
};
enum float_denorm_style
{
denorm_indeterminate = -1,
denorm_absent = 0,
denorm_present = 1
};
template<typename _Tp>
struct numeric_limits
{
static const bool is_specialized = false;
static _Tp min() throw() { return static_cast<_Tp>(0); }
static _Tp max() throw() { return static_cast<_Tp>(0); }
static const int digits = 0;
static const int digits10 = 0;
static const bool is_signed = false;
static const bool is_integer = false;
static const bool is_exact = false;
static const int radix = 0;
static _Tp epsilon() throw() { return static_cast<_Tp>(0); }
static _Tp round_error() throw() { return static_cast<_Tp>(0); }
static const int min_exponent = 0;
static const int min_exponent10 = 0;
static const int max_exponent = 0;
static const int max_exponent10 = 0;
static const bool has_infinity = false;
static const bool has_quiet_NaN = false;
static const bool has_signaling_NaN = false;
static const float_denorm_style has_denorm = denorm_absent;
static const bool has_denorm_loss = false;
static _Tp infinity() throw() { return static_cast<_Tp>(0); }
static _Tp quiet_NaN() throw() { return static_cast<_Tp>(0); }
static _Tp signaling_NaN() throw() { return static_cast<_Tp>(0); }
static _Tp denorm_min() throw() { return static_cast<_Tp>(0); }
static const bool is_iec559 = false;
static const bool is_bounded = false;
static const bool is_modulo = false;
static const bool traps = false;
static const bool tinyness_before = false;
static const float_round_style round_style = round_toward_zero;
};
template<typename _Tp>
const bool
numeric_limits<_Tp>::is_specialized;
template<typename _Tp>
const int
numeric_limits<_Tp>::digits;
template<typename _Tp>
const int
numeric_limits<_Tp>::digits10;
template<typename _Tp>
const bool
numeric_limits<_Tp>::is_signed;
template<typename _Tp>
const bool
numeric_limits<_Tp>::is_integer;
template<typename _Tp>
const bool
numeric_limits<_Tp>::is_exact;
template<typename _Tp>
const int
numeric_limits<_Tp>::radix;
template<typename _Tp>
const int
numeric_limits<_Tp>::min_exponent;
template<typename _Tp>
const int
numeric_limits<_Tp>::min_exponent10;
template<typename _Tp>
const int
numeric_limits<_Tp>::max_exponent;
template<typename _Tp>
const int
numeric_limits<_Tp>::max_exponent10;
template<typename _Tp>
const bool
numeric_limits<_Tp>::has_infinity;
template<typename _Tp>
const bool
numeric_limits<_Tp>::has_quiet_NaN;
template<typename _Tp>
const bool
numeric_limits<_Tp>::has_signaling_NaN;
template<typename _Tp>
const float_denorm_style
numeric_limits<_Tp>::has_denorm;
template<typename _Tp>
const bool
numeric_limits<_Tp>::has_denorm_loss;
template<typename _Tp>
const bool
numeric_limits<_Tp>::is_iec559;
template<typename _Tp>
const bool
numeric_limits<_Tp>::is_bounded;
template<typename _Tp>
const bool
numeric_limits<_Tp>::is_modulo;
template<typename _Tp>
const bool
numeric_limits<_Tp>::traps;
template<typename _Tp>
const bool
numeric_limits<_Tp>::tinyness_before;
template<typename _Tp>
const float_round_style
numeric_limits<_Tp>::round_style;
template<typename _Tp> _Tp __limits_infinity();
template<typename _Tp> _Tp __limits_quiet_NaN();
template<typename _Tp> _Tp __limits_signaling_NaN();
template<typename _Tp> _Tp __limits_denorm_min();
EOF
# Must turn off exceptions, because the C++ exception handling support
# routines have not been built yet.
echo "$CC -I$BUILD_DIR -fno-exceptions \
-o $BUILD_DIR/src/gen-num-limits $SRC_DIR/src/gen-num-limits.cc"
{ $CC -I$BUILD_DIR -fno-exceptions \
-o "$BUILD_DIR/src/gen-num-limits" "$SRC_DIR/src/gen-num-limits.cc"
} || {
echo "gen-num-limits failed to build, exiting."
exit 1
}
"$BUILD_DIR/src/gen-num-limits" >> $OUT_H-t || {
echo "gen-num-limits failed to execute, exiting."
exit 1
}
cat <<EOF >> $OUT_H-t
} // namespace std
#endif // _CPP_NUMERIC_LIMITS
EOF
trait_name=numeric_limits
cat <<EOF > $OUT_C-t
// Static data members of -*- C++ -*- numeric_limits classes
// Copyright (C) 1999, 2000 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr>
//
// ISO C++ 14882:1998
// 18.2.1
//
#include <bits/std_limits.h>
namespace std {
EOF
for type_name in bool char 'signed char' 'unsigned char' \
short 'unsigned short' int 'unsigned int' \
long 'unsigned long' 'long long' 'unsigned long long' \
float double 'long double'
do
grep "<$type_name>" $OUT_H-t >/dev/null 2>&1 || continue
cat <<EOF >> $OUT_C-t
const bool $trait_name<$type_name>::is_specialized;
const int $trait_name<$type_name>::digits;
const int $trait_name<$type_name>::digits10;
const bool $trait_name<$type_name>::is_signed;
const bool $trait_name<$type_name>::is_integer;
const bool $trait_name<$type_name>::is_exact;
const int $trait_name<$type_name>::radix;
const int $trait_name<$type_name>::min_exponent;
const int $trait_name<$type_name>::min_exponent10;
const int $trait_name<$type_name>::max_exponent;
const int $trait_name<$type_name>::max_exponent10;
const bool $trait_name<$type_name>::has_infinity;
const bool $trait_name<$type_name>::has_quiet_NaN;
const bool $trait_name<$type_name>::has_signaling_NaN;
const float_denorm_style $trait_name<$type_name>::has_denorm;
const bool $trait_name<$type_name>::has_denorm_loss;
const bool $trait_name<$type_name>::is_iec559;
const bool $trait_name<$type_name>::is_bounded;
const bool $trait_name<$type_name>::is_modulo;
const bool $trait_name<$type_name>::traps;
const bool $trait_name<$type_name>::tinyness_before;
const float_round_style $trait_name<$type_name>::round_style;
EOF
done
cat <<EOF >> $OUT_C-t
} // namespace std
EOF
mv $OUT_C-t $OUT_C
mv $OUT_H-t $OUT_H