aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/mknumeric_limits
blob: 918743f30d3e9077517e07bc5ceadcc9175a7295 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
#! /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"

case `uname` in
    CYGWIN*) 
	LDFLAGS='-nodefaultlibs -lcygwin -lc -lkernel32 -lgcc' ;;
    AIX*) 
	case $CXX in
	    *pthread*)
		LDFLAGS='-nodefaultlibs -lgcc -L/usr/lib/threads -lpthreads -lc_r /usr/lib/libc.a' ;;
	    *)
		LDFLAGS='-nodefaultlibs -lgcc -lc' ;;
	esac
	;;
    *)
	LDFLAGS='-nodefaultlibs -lgcc -lc' ;;
esac

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   

: ${CXX:="$BUILD_DIR/../../gcc/g++ -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, 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.

// 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> _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

echo "$CXX -I. $CPPFLAGS -I$BUILD_DIR/include -DHAVE_CONFIG_H \
    -o "$BUILD_DIR/src/gen-num-limits" "$SRC_DIR/src/gen-num-limits.cc" \
     $LDFLAGS"

{ $CXX -I. $CPPFLAGS -I$BUILD_DIR/include -DHAVE_CONFIG_H \
    -o "$BUILD_DIR/src/gen-num-limits" "$SRC_DIR/src/gen-num-limits.cc" \
     $LDFLAGS
} || {
  echo "gen-num-limits failed to build, exiting."
  exit 1
}

"$BUILD_DIR/src/gen-num-limits" >> $OUT_H-t

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