This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [v3] ext/type_traits.h


Benjamin Kosnik wrote:
+_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
+
+ // XXX What about std::tr1::true_type?
+ template<bool _Cond, typename _Iftrue, typename _Iffalse>
+ struct conditional_type
+ { typedef _Iftrue type; };
+
+ template<typename _Iftrue, typename _Iffalse>
+ struct conditional_type<false, _Iftrue, _Iffalse>
+ { typedef _Iffalse type; };
+
+ // Compile time constants for builtin integral types.
+ // Sadly std::numeric_limits member functions cannot be used for this.
+#define __glibcxx_signed(T) ((T)(-1) < 0)
+#define __glibcxx_digits(T) (sizeof(T) * __CHAR_BIT__ - __glibcxx_signed(T))
+
+#define __glibcxx_min(T) \
+ (__glibcxx_signed(T) ? (T)1 << __glibcxx_digits(T) : (T)0)
+
+#define __glibcxx_max(T) \
+ (__glibcxx_signed(T) ? ((T)1 << __glibcxx_digits(T)) - 1 : ~(T)0)
+
+ template<typename _Value>
+ struct numeric_traits
+ {
+ typedef _Value value_type;
+ + // Only integer types.
+ static const value_type min = __glibcxx_min(value_type);
+ static const value_type max = __glibcxx_max(value_type);
+ + // Only floating point types. See N1822. + static const std::streamsize max_digits10 =
+ 2 + std::numeric_limits<_Value>::digits * 3010/10000;
+ };
+
+ template<typename _Value>
+ const _Value numeric_traits<_Value>::min;
+
+ template<typename _Value>
+ const _Value numeric_traits<_Value>::max;
+
+ template<typename _Value>
+ const std::streamsize numeric_traits<_Value>::max_digits10;
My only doubt is about uglification: are we sure we want to add the non-uglified names numeric_traits and conditional_type (maybe other)? It's also a matter of consistency because generally we do uglify everything else (e.g., _Value, _Cond, _To_unsigned_type...). Personally, to be on the safe side, I'm trying to consistently uglify all the new code as mush as possible, same policy of the library proper in /ext and /tr1, that is. I was even thinking adjusting unordered_* containers and be done with it...

Paolo.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]