]> git.lyx.org Git - lyx.git/blobdiff - src/support/convert.cpp
Use HAVE_LONG_LONG_INT instead of LYX_USE_LONG_LONG
[lyx.git] / src / support / convert.cpp
index 894d7647293cdb05d9514665bc6d4084439aa66c..9455643a667800f931143c8fd4dc060d1fb533a8 100644 (file)
@@ -1,33 +1,46 @@
 /**
- * \file tostr.C
+ * \file convert.cpp
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author André Pönitz
- * \author Lars Gullik Bjønnes
+ * \author André Pönitz
+ * \author Lars Gullik Bjønnes
  *
  * Full author contact details are available in file CREDITS.
  */
 
 #include <config.h>
 
-#include "convert.h"
-
+#include "support/convert.h"
 #include "support/docstring.h"
 
 #include <boost/lexical_cast.hpp>
 
 #include <string>
+#include <sstream>
+//needed for Mac OSX 10.5.2 Leopard
+#include <cstdlib>
 
+using namespace std;
 
-namespace lyx {
+namespace {
 
-using lyx::docstring;
+// A version of lexical cast that does not throw. Useful for when we convert to string
+template<typename To, typename From>
+To lexical_cast(From const & value, To const & defaultResult = To())
+{
+       try {
+               return boost::lexical_cast<To>(value);
+       } catch(...) {
+               // Ignore all exceptions and use default.
+               return defaultResult;
+       }
+}
 
-using boost::lexical_cast;
+} // namespace
 
-using std::string;
 
+namespace lyx {
 
 template<>
 string convert<string>(bool b)
@@ -60,7 +73,7 @@ string convert<string>(int i)
 template<>
 docstring convert<docstring>(int i)
 {
-       return lyx::from_ascii(lexical_cast<string>(i));
+       return from_ascii(lexical_cast<string>(i));
 }
 
 
@@ -74,7 +87,7 @@ string convert<string>(unsigned int ui)
 template<>
 docstring convert<docstring>(unsigned int ui)
 {
-       return lyx::from_ascii(lexical_cast<string>(ui));
+       return from_ascii(lexical_cast<string>(ui));
 }
 
 
@@ -88,10 +101,26 @@ string convert<string>(unsigned long ul)
 template<>
 docstring convert<docstring>(unsigned long ul)
 {
-       return lyx::from_ascii(lexical_cast<string>(ul));
+       return from_ascii(lexical_cast<string>(ul));
+}
+
+
+#ifdef HAVE_LONG_LONG_INT
+template<>
+string convert<string>(unsigned long long ull)
+{
+       return lexical_cast<string>(ull);
 }
 
 
+template<>
+docstring convert<docstring>(unsigned long long ull)
+{
+       return from_ascii(lexical_cast<string>(ull));
+}
+#endif
+
+
 template<>
 string convert<string>(long l)
 {
@@ -102,21 +131,48 @@ string convert<string>(long l)
 template<>
 docstring convert<docstring>(long l)
 {
-       return lyx::from_ascii(lexical_cast<string>(l));
+       return from_ascii(lexical_cast<string>(l));
+}
+
+
+#ifdef HAVE_LONG_LONG_INT
+template<>
+string convert<string>(long long ll)
+{
+       return lexical_cast<string>(ll);
 }
 
 
+template<>
+docstring convert<docstring>(long long ll)
+{
+       return from_ascii(lexical_cast<string>(ll));
+}
+#endif
+
+
 template<>
 string convert<string>(float f)
 {
-       return lexical_cast<string>(f);
+       std::ostringstream val;
+       val << f;
+       return val.str();
 }
 
 
 template<>
 string convert<string>(double d)
 {
-       return lexical_cast<string>(d);
+       std::ostringstream val;
+       val << d;
+       return val.str();
+}
+
+
+template<>
+docstring convert<docstring>(double d)
+{
+       return from_ascii(convert<string>(d));
 }
 
 
@@ -130,7 +186,7 @@ int convert<int>(string const s)
 template<>
 int convert<int>(docstring const s)
 {
-       return strtol(lyx::to_ascii(s).c_str(), 0, 10);
+       return strtol(to_ascii(s).c_str(), 0, 10);
 }
 
 
@@ -141,6 +197,13 @@ unsigned int convert<unsigned int>(string const s)
 }
 
 
+template<>
+unsigned long convert<unsigned long>(string const s)
+{
+       return strtoul(s.c_str(), 0, 10);
+}
+
+
 template<>
 double convert<double>(string const s)
 {