]> git.lyx.org Git - lyx.git/blobdiff - boost/boost/lexical_cast.hpp
attempt to make LyX linkable without NLS, assuming dummy available() should return...
[lyx.git] / boost / boost / lexical_cast.hpp
index 44c7a666862034e274c3c15f5bd9d89b34e5d8d7..d7d90521a1a7b6a1db903b765832e14cf4bfe1c6 100644 (file)
 #include <climits>
 #include <cstddef>
 #include <istream>
-#include <locale>
 #include <string>
 #include <typeinfo>
+#include <exception>
 #include <boost/config.hpp>
 #include <boost/limits.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/throw_exception.hpp>
 #include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
 #include <boost/call_traits.hpp>
 #include <boost/static_assert.hpp>
 #include <boost/detail/lcast_precision.hpp>
+#include <boost/detail/workaround.hpp>
+
+#ifndef BOOST_NO_STD_LOCALE
+#include <locale>
+#endif
 
 #ifdef BOOST_NO_STRINGSTREAM
 #include <strstream>
 #include <sstream>
 #endif
 
-#if defined(BOOST_NO_STRINGSTREAM) || \
-    defined(BOOST_NO_STD_WSTRING) || \
-    defined(BOOST_NO_STD_LOCALE) 
-#define DISABLE_WIDE_CHAR_SUPPORT
+#if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING)
+#define BOOST_LCAST_NO_WCHAR_T
+#endif
+
+#ifdef BOOST_NO_TYPEID
+#define BOOST_LCAST_THROW_BAD_CAST(S, T) throw_exception(bad_lexical_cast())
+#else
+#define BOOST_LCAST_THROW_BAD_CAST(Source, Target) \
+    throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)))
 #endif
 
 namespace boost
 {
     // exception used to indicate runtime lexical_cast failure
     class bad_lexical_cast : public std::bad_cast
+
+#if defined(__BORLANDC__) && BOOST_WORKAROUND( __BORLANDC__, < 0x560 )
+        // under bcc32 5.5.1 bad_cast doesn't derive from exception
+        , public std::exception
+#endif
+
     {
     public:
         bad_lexical_cast() :
-        source(&typeid(void)), target(&typeid(void))
+#ifndef BOOST_NO_TYPEID
+          source(&typeid(void)), target(&typeid(void))
+#else
+          source(0), target(0) // this breaks getters
+#endif
         {
         }
+
         bad_lexical_cast(
             const std::type_info &source_type_arg,
             const std::type_info &target_type_arg) :
             source(&source_type_arg), target(&target_type_arg)
         {
         }
+
         const std::type_info &source_type() const
         {
             return *source;
@@ -65,6 +88,7 @@ namespace boost
         {
             return *target;
         }
+
         virtual const char *what() const throw()
         {
             return "bad lexical cast: "
@@ -94,7 +118,7 @@ namespace boost
         };
 #endif
 
-#ifndef DISABLE_WIDE_CHAR_SUPPORT
+#ifndef BOOST_LCAST_NO_WCHAR_T
 #ifndef BOOST_NO_INTRINSIC_WCHAR_T
         template<>
         struct stream_char<wchar_t>
@@ -219,7 +243,7 @@ namespace boost
         // lcast_src_length<char, signed char const*>
         // lcast_src_length<char, unsigned char const*>
 
-#ifndef DISABLE_WIDE_CHAR_SUPPORT
+#ifndef BOOST_LCAST_NO_WCHAR_T
         template<>
         struct lcast_src_length<wchar_t, bool>
         {
@@ -258,7 +282,7 @@ namespace boost
             static void check_coverage() {}
         };
 
-#ifndef DISABLE_WIDE_CHAR_SUPPORT
+#ifndef BOOST_LCAST_NO_WCHAR_T
         template<>
         struct lcast_src_length<wchar_t, wchar_t const*>
         {
@@ -289,7 +313,7 @@ namespace boost
             static void check_coverage() {}
         };
 
-#ifndef DISABLE_WIDE_CHAR_SUPPORT
+#ifndef BOOST_LCAST_NO_WCHAR_T
         template<>
         struct lcast_src_length< wchar_t, std::basic_string<wchar_t> >
         {
@@ -327,34 +351,35 @@ namespace boost
 #endif
         };
 
-#define BOOST_AUX_LEXICAL_CAST_DEF1(CharT, T) template<>             \
-    struct lcast_src_length<CharT, T> : lcast_src_length_integral<T> \
+#define BOOST_LCAST_DEF1(CharT, T)               \
+    template<> struct lcast_src_length<CharT, T> \
+        : lcast_src_length_integral<T>           \
     { static void check_coverage() {} };
 
-#ifdef DISABLE_WIDE_CHAR_SUPPORT
-#define BOOST_AUX_LEXICAL_CAST_DEF(T) BOOST_AUX_LEXICAL_CAST_DEF1(char, T)
+#ifdef BOOST_LCAST_NO_WCHAR_T
+#define BOOST_LCAST_DEF(T) BOOST_LCAST_DEF1(char, T)
 #else
-#define BOOST_AUX_LEXICAL_CAST_DEF(T)          \
-        BOOST_AUX_LEXICAL_CAST_DEF1(char, T)   \
-        BOOST_AUX_LEXICAL_CAST_DEF1(wchar_t, T)
+#define BOOST_LCAST_DEF(T)          \
+        BOOST_LCAST_DEF1(char, T)   \
+        BOOST_LCAST_DEF1(wchar_t, T)
 #endif
 
-        BOOST_AUX_LEXICAL_CAST_DEF(short)
-        BOOST_AUX_LEXICAL_CAST_DEF(unsigned short)
-        BOOST_AUX_LEXICAL_CAST_DEF(int)
-        BOOST_AUX_LEXICAL_CAST_DEF(unsigned int)
-        BOOST_AUX_LEXICAL_CAST_DEF(long)
-        BOOST_AUX_LEXICAL_CAST_DEF(unsigned long)
+        BOOST_LCAST_DEF(short)
+        BOOST_LCAST_DEF(unsigned short)
+        BOOST_LCAST_DEF(int)
+        BOOST_LCAST_DEF(unsigned int)
+        BOOST_LCAST_DEF(long)
+        BOOST_LCAST_DEF(unsigned long)
 #if defined(BOOST_HAS_LONG_LONG)
-        BOOST_AUX_LEXICAL_CAST_DEF(boost::ulong_long_type)
-        BOOST_AUX_LEXICAL_CAST_DEF(boost::long_long_type )
+        BOOST_LCAST_DEF(boost::ulong_long_type)
+        BOOST_LCAST_DEF(boost::long_long_type )
 #elif defined(BOOST_HAS_MS_INT64)
-        BOOST_AUX_LEXICAL_CAST_DEF(unsigned __int64)
-        BOOST_AUX_LEXICAL_CAST_DEF(         __int64)
+        BOOST_LCAST_DEF(unsigned __int64)
+        BOOST_LCAST_DEF(         __int64)
 #endif
 
-#undef BOOST_AUX_LEXICAL_CAST_DEF
-#undef BOOST_AUX_LEXICAL_CAST_DEF1
+#undef BOOST_LCAST_DEF
+#undef BOOST_LCAST_DEF1
 
 #ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
         // Helper for floating point types.
@@ -400,7 +425,7 @@ namespace boost
             static void check_coverage() {}
         };
 
-#ifndef DISABLE_WIDE_CHAR_SUPPORT
+#ifndef BOOST_LCAST_NO_WCHAR_T
     template<>
     struct lcast_src_length<wchar_t,float>
       : lcast_src_length_floating<float>
@@ -422,7 +447,7 @@ namespace boost
         static void check_coverage() {}
     };
 
-#endif // #ifndef DISABLE_WIDE_CHAR_SUPPORT
+#endif // #ifndef BOOST_LCAST_NO_WCHAR_T
 #endif // #ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
     }
 
@@ -437,7 +462,7 @@ namespace boost
             BOOST_STATIC_CONSTANT(char, minus = '-');
         };
 
-#ifndef DISABLE_WIDE_CHAR_SUPPORT
+#ifndef BOOST_LCAST_NO_WCHAR_T
         template<>
         struct lcast_char_constants<wchar_t>
         {
@@ -460,37 +485,21 @@ namespace boost
 # pragma warning( push )
 // C4146: unary minus operator applied to unsigned type, result still unsigned
 # pragma warning( disable : 4146 )
+#elif defined( __BORLANDC__ )
+# pragma option push -w-8041
 #endif
-
-        inline unsigned int lcast_to_unsigned(int value)
-        {
-            unsigned int uval = value;
-            return value < 0 ? -uval : uval;
-        }
-
-        inline unsigned long lcast_to_unsigned(long value)
-        {
-            unsigned long uval = value;
-            return value < 0 ? -uval : uval;
-        }
-
-#if defined(BOOST_HAS_LONG_LONG)
-        inline boost::ulong_long_type lcast_to_unsigned(boost::long_long_type v)
-        {
-            boost::ulong_long_type uval = v;
-            return v < 0 ? -uval : uval;
-        }
-#elif defined(BOOST_HAS_MS_INT64)
-        inline unsigned __int64 lcast_to_unsigned(__int64 value)
+        template<class T>
+        inline
+        BOOST_DEDUCED_TYPENAME make_unsigned<T>::type lcast_to_unsigned(T value)
         {
-            unsigned __int64 uval = value;
-            return value < 0 ? -uval : uval;
+            typedef BOOST_DEDUCED_TYPENAME make_unsigned<T>::type result_type;
+            result_type uvalue = static_cast<result_type>(value);
+            return value < 0 ? -uvalue : uvalue;
         }
-#endif
-
 #if (defined _MSC_VER)
-# pragma warning( pop ) // C4146: unary minus operator applied to unsigned type,
-                        // result still unsigned
+# pragma warning( pop )
+#elif defined( __BORLANDC__ )
+# pragma option pop
 #endif
     }
 
@@ -502,22 +511,15 @@ namespace boost
 #ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
             BOOST_STATIC_ASSERT(!std::numeric_limits<T>::is_signed);
 #endif
-            CharT thousands_sep = 0;
 
-#ifdef BOOST_LEXICAL_CAST_ASSUME_C_LOCALE
-            char const* grouping = "";
-            std::size_t const grouping_size = 0;
-#else
+#ifndef BOOST_LEXICAL_CAST_ASSUME_C_LOCALE
+            // TODO: use BOOST_NO_STD_LOCALE
             std::locale loc;
             typedef std::numpunct<CharT> numpunct;
             numpunct const& np = BOOST_USE_FACET(numpunct, loc);
             std::string const& grouping = np.grouping();
             std::string::size_type const grouping_size = grouping.size();
-
-            if(grouping_size)
-                thousands_sep = np.thousands_sep();
-#endif
-
+            CharT thousands_sep = grouping_size ? np.thousands_sep() : 0;
             std::string::size_type group = 0; // current group number
             char last_grp_size = grouping[0] <= 0 ? CHAR_MAX : grouping[0];
             // a) Since grouping is const, grouping[grouping.size()] returns 0.
@@ -526,14 +528,17 @@ namespace boost
 #ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
             BOOST_STATIC_ASSERT(std::numeric_limits<T>::digits10 < CHAR_MAX);
 #endif
+
+            char left = last_grp_size;
+#endif
+
             typedef typename Traits::int_type int_type;
             CharT const czero = lcast_char_constants<CharT>::zero;
             int_type const zero = Traits::to_int_type(czero);
 
-            char left = last_grp_size;
-
             do
             {
+#ifndef BOOST_LEXICAL_CAST_ASSUME_C_LOCALE
                 if(left == 0)
                 {
                     ++group;
@@ -549,6 +554,8 @@ namespace boost
                 }
 
                 --left;
+#endif
+
                 --finish;
                 int_type const digit = static_cast<int_type>(n % 10U);
                 Traits::assign(*finish, Traits::to_char_type(zero + digit));
@@ -575,7 +582,7 @@ namespace boost
             lexical_stream(char_type* = 0, char_type* = 0)
             {
                 stream.unsetf(std::ios::skipws);
-                lcast_set_precision(stream, (Source*)0, (Target*)0);
+                lcast_set_precision(stream, static_cast<Source*>(0), static_cast<Target*>(0) );
             }
             ~lexical_stream()
             {
@@ -614,7 +621,7 @@ namespace boost
                 stream.str().swap(output);
                 return true;
             }
-            #ifndef DISABLE_WIDE_CHAR_SUPPORT
+            #ifndef BOOST_LCAST_NO_WCHAR_T
             bool operator>>(std::wstring &output)
             {
                 stream.str().swap(output);
@@ -670,9 +677,10 @@ namespace boost
                 Traits::assign(*p, ch);
             }
 
-#ifndef DISABLE_WIDE_CHAR_SUPPORT
+#ifndef BOOST_LCAST_NO_WCHAR_T
             static void widen_and_assign(wchar_t* p, char ch)
             {
+                // TODO: use BOOST_NO_STD_LOCALE
                 std::locale loc;
                 wchar_t w = BOOST_USE_FACET(std::ctype<wchar_t>, loc).widen(ch);
                 Traits::assign(*p, w);
@@ -691,7 +699,7 @@ namespace boost
             {
                 this->setp(start, finish);
                 std::basic_ostream<CharT> stream(static_cast<Base*>(this));
-                lcast_set_precision(stream, (OutputStreamable*)0);
+                lcast_set_precision(stream, static_cast<OutputStreamable*>(0));
                 bool const result = !(stream << input).fail();
                 finish = this->pptr();
                 return result;
@@ -703,9 +711,9 @@ namespace boost
 
         public:
 
-            lexical_stream_limited_src(CharT* start, CharT* finish)
-              : start(start)
-              , finish(finish)
+            lexical_stream_limited_src(CharT* sta, CharT* fin)
+              : start(sta)
+              , finish(fin)
             {}
 
         public: // output
@@ -720,7 +728,7 @@ namespace boost
 
             bool operator<<(bool);
             bool operator<<(char);
-#if !defined(DISABLE_WIDE_CHAR_SUPPORT) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+#if !defined(BOOST_LCAST_NO_WCHAR_T) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
             bool operator<<(wchar_t);
 #endif
             bool operator<<(CharT const*);
@@ -761,7 +769,7 @@ namespace boost
                 this->setg(start, start, finish);
                 std::basic_istream<CharT> stream(static_cast<Base*>(this));
                 stream.unsetf(std::ios::skipws);
-                lcast_set_precision(stream, (InputStreamable*)0);
+                lcast_set_precision(stream, static_cast<InputStreamable*>(0));
 #if (defined _MSC_VER)
 # pragma warning( pop )
 #endif
@@ -785,7 +793,7 @@ namespace boost
 
             bool operator>>(std::string&);
 
-#ifndef DISABLE_WIDE_CHAR_SUPPORT
+#ifndef BOOST_LCAST_NO_WCHAR_T
             bool operator>>(std::wstring&);
 #endif
 
@@ -820,7 +828,7 @@ namespace boost
             return true;
         }
 
-#if !defined(DISABLE_WIDE_CHAR_SUPPORT) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+#if !defined(BOOST_LCAST_NO_WCHAR_T) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
         template<typename CharT, class Base, class Traits>
         inline bool lexical_stream_limited_src<CharT,Base,Traits>::operator<<(
                 wchar_t ch)
@@ -907,7 +915,7 @@ namespace boost
         inline bool lexical_stream_limited_src<CharT,Base,Traits>::operator<<(
                 unsigned short n)
         {
-            start = lcast_put_unsigned<Traits>(lcast_to_unsigned(n), finish);
+            start = lcast_put_unsigned<Traits>(n, finish);
             return true;
         }
 
@@ -994,7 +1002,7 @@ namespace boost
             return true;
         }
 
-#ifndef DISABLE_WIDE_CHAR_SUPPORT
+#ifndef BOOST_LCAST_NO_WCHAR_T
         template<typename CharT, class Base, class Traits>
         inline bool lexical_stream_limited_src<CharT,Base,Traits>::operator>>(
                 std::wstring& str)
@@ -1049,7 +1057,7 @@ namespace boost
             BOOST_STATIC_CONSTANT(bool, value = false);
         };
 
-#if !defined(DISABLE_WIDE_CHAR_SUPPORT) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+#if !defined(BOOST_LCAST_NO_WCHAR_T) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
         template<>
         struct lcast_streambuf_for_target<wchar_t>
         {
@@ -1065,7 +1073,7 @@ namespace boost
             BOOST_STATIC_CONSTANT(bool, value = false);
         };
 
-#ifndef DISABLE_WIDE_CHAR_SUPPORT
+#ifndef BOOST_LCAST_NO_WCHAR_T
         template<class Traits, class Alloc>
         struct lcast_streambuf_for_target<
                     std::basic_string<wchar_t,Traits,Alloc> >
@@ -1080,7 +1088,7 @@ namespace boost
             BOOST_STATIC_CONSTANT(bool, value = false);
         };
 
-#ifndef DISABLE_WIDE_CHAR_SUPPORT
+#ifndef BOOST_LCAST_NO_WCHAR_T
         template<>
         struct lcast_streambuf_for_target<std::wstring>
         {
@@ -1108,6 +1116,12 @@ namespace boost
             typedef const T * type;
         };
 
+#if (defined _MSC_VER)
+# pragma warning( push )
+# pragma warning( disable : 4701 ) // possible use of ... before initialization
+# pragma warning( disable : 4702 ) // unreachable code
+#endif
+
         template< typename Target
                 , typename Source
                 , bool Unlimited // string representation of Source is unlimited
@@ -1133,24 +1147,14 @@ namespace boost
               , detail::lexical_stream_limited_src<CharT,base,traits>
               >::type interpreter(buf, buf + src_len);
 
-            // The original form, reproduced below, is more elegant
-            // but yields a spurious C4701 warning ("possible use of
-            // "result" before initialization") with VC7.1 (/W4).
-//
-//            Target result;
-//
-//            if(!(interpreter << arg && interpreter >> result))
-//                throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
-//            return result;
-
-            if(interpreter << arg) {
-                Target result;
-                if (interpreter >> result)
-                    return result;
-            }
-            throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
-            return Target(); // normally never reached (throw_exception)
+            Target result;
+            if(!(interpreter << arg && interpreter >> result))
+                BOOST_LCAST_THROW_BAD_CAST(Source, Target);
+            return result;
         }
+#if (defined _MSC_VER)
+# pragma warning( pop )
+#endif
     }
 
     template<typename Target, typename Source>
@@ -1187,7 +1191,11 @@ namespace boost
         Target result;
 
         if(!(interpreter << arg && interpreter >> result))
+#ifndef BOOST_NO_TYPEID
             throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
+#else
+            throw_exception(bad_lexical_cast());
+#endif
         return result;
     }
 
@@ -1201,5 +1209,5 @@ namespace boost
 // accompanying file LICENSE_1_0.txt or copy at
 // http://www.boost.org/LICENSE_1_0.txt)
 
-#undef DISABLE_WIDE_CHAR_SUPPORT
+#undef BOOST_LCAST_NO_WCHAR_T
 #endif