Author: wyoung
Date: Mon Jan 21 18:24:22 2008
New Revision: 2123
URL: http://svn.gna.org/viewcvs/mysqlpp?rev=2123&view=rev
Log:
Code rearrangement and declspec tweakage to try and fix yet more Windows
linkage errors.
Modified:
trunk/lib/mystring.h
Modified: trunk/lib/mystring.h
URL:
http://svn.gna.org/viewcvs/mysqlpp/trunk/lib/mystring.h?rev=2123&r1=2122&r2=2123&view=diff
==============================================================================
--- trunk/lib/mystring.h (original)
+++ trunk/lib/mystring.h Mon Jan 21 18:24:22 2008
@@ -44,7 +44,72 @@
namespace mysqlpp {
#if !defined(DOXYGEN_IGNORE)
-class SQLTypeAdapter;
+// Doxygen will not generate documentation for this section.
+
+template <class Type> class internal_string_to_number_proxy;
+
+#define internal_convert_string_to_float(TYPE, FUNC) \
+ template <> \
+ class internal_string_to_number_proxy<TYPE> {\
+ public:\
+ internal_string_to_number_proxy(const char* str, const char *& end) { \
+ num_ = FUNC(str, const_cast<char **>(&end));}\
+ operator TYPE () {return num_;}\
+ private:\
+ TYPE num_;\
+ };\
+
+#define internal_convert_string_to_int(TYPE, FUNC) \
+ template <> \
+ class internal_string_to_number_proxy<TYPE> {\
+ public:\
+ internal_string_to_number_proxy(const char* str, const char *& end) { \
+ num_ = FUNC(str, const_cast<char **>(&end),10);}\
+ operator TYPE () {return num_;}\
+ private:\
+ TYPE num_;\
+ };\
+
+
+#if defined(MYSQLPP_PLATFORM_VISUAL_CPP)
+// Squish VC++ warning about "possible loss of data" for these conversions
+# pragma warning(disable: 4244)
+#endif
+
+internal_convert_string_to_float(float, strtod)
+internal_convert_string_to_float(double, strtod)
+
+internal_convert_string_to_int(char, strtol)
+internal_convert_string_to_int(signed char, strtol)
+internal_convert_string_to_int(int, strtol)
+internal_convert_string_to_int(short int, strtol)
+internal_convert_string_to_int(long int, strtol)
+
+internal_convert_string_to_int(unsigned char, strtoul)
+internal_convert_string_to_int(unsigned int, strtoul)
+internal_convert_string_to_int(unsigned short int, strtoul)
+internal_convert_string_to_int(unsigned long int, strtoul)
+
+#if defined(MYSQLPP_PLATFORM_VISUAL_CPP)
+# pragma warning(default: 4244)
+#endif
+
+#if !defined(NO_LONG_LONGS)
+#if defined(MYSQLPP_PLATFORM_VISUAL_CPP)
+// Handle 64-bit ints the VC++ way
+internal_convert_string_to_int(longlong, _strtoi64)
+internal_convert_string_to_int(ulonglong, _strtoui64)
+#else
+// No better idea, so assume the C99 way. If your compiler doesn't
+// support this, please provide a patch to extend this ifdef, or define
+// NO_LONG_LONGS.
+internal_convert_string_to_int(longlong, strtoll)
+internal_convert_string_to_int(ulonglong, strtoull)
+#endif
+#endif // !defined(NO_LONG_LONGS)
+
+#if !defined(DOXYGEN_IGNORE)
+class MYSQLPP_EXPORT SQLTypeAdapter;
#endif
/// \brief A std::string work-alike that can convert itself from SQL
@@ -231,8 +296,37 @@
const char* c_str() const { return data(); }
/// \brief Template for converting the column data to most any
- /// integral data type.
- template <class Type> Type conv(Type) const;
+ /// numeric data type.
+ template <class Type>
+ Type conv(Type) const
+ {
+ if (buffer_) {
+ std::string strbuf;
+ strip_leading_blanks(strbuf);
+ std::string::size_type len = strbuf.size();
+ const char* str = strbuf.data();
+ const char* end = str;
+ Type num = internal_string_to_number_proxy<Type>(str,
end);
+
+ lconv* lc = localeconv();
+ if ((lc && lc->decimal_point && lc->decimal_point[0] )
?
+ *end == lc->decimal_point[0] :
+ *end == '.') {
+ ++end;
+ for (; *end == '0'; ++end) ;
+ }
+
+ if (*end != '\0' && end != 0) {
+ throw BadConversion(typeid(Type).name(), data(),
+ end - str, len);
+ }
+
+ return num;
+ }
+ else {
+ return 0;
+ }
+ }
/// \brief Overload of conv() for types wrapped with Null<>
///
@@ -490,73 +584,6 @@
const String& in);
-
-#if !defined(DOXYGEN_IGNORE)
-// Doxygen will not generate documentation for this section.
-
-template <class Type> class internal_string_to_number_proxy;
-
-#define internal_convert_string_to_float(TYPE, FUNC) \
- template <> \
- class internal_string_to_number_proxy<TYPE> {\
- public:\
- internal_string_to_number_proxy(const char* str, const char *& end) { \
- num_ = FUNC(str, const_cast<char **>(&end));}\
- operator TYPE () {return num_;}\
- private:\
- TYPE num_;\
- };\
-
-#define internal_convert_string_to_int(TYPE, FUNC) \
- template <> \
- class internal_string_to_number_proxy<TYPE> {\
- public:\
- internal_string_to_number_proxy(const char* str, const char *& end) { \
- num_ = FUNC(str, const_cast<char **>(&end),10);}\
- operator TYPE () {return num_;}\
- private:\
- TYPE num_;\
- };\
-
-
-#if defined(MYSQLPP_PLATFORM_VISUAL_CPP)
-// Squish VC++ warning about "possible loss of data" for these conversions
-# pragma warning(disable: 4244)
-#endif
-
-internal_convert_string_to_float(float, strtod)
-internal_convert_string_to_float(double, strtod)
-
-internal_convert_string_to_int(char, strtol)
-internal_convert_string_to_int(signed char, strtol)
-internal_convert_string_to_int(int, strtol)
-internal_convert_string_to_int(short int, strtol)
-internal_convert_string_to_int(long int, strtol)
-
-internal_convert_string_to_int(unsigned char, strtoul)
-internal_convert_string_to_int(unsigned int, strtoul)
-internal_convert_string_to_int(unsigned short int, strtoul)
-internal_convert_string_to_int(unsigned long int, strtoul)
-
-#if defined(MYSQLPP_PLATFORM_VISUAL_CPP)
-# pragma warning(default: 4244)
-#endif
-
-#if !defined(NO_LONG_LONGS)
-#if defined(MYSQLPP_PLATFORM_VISUAL_CPP)
-// Handle 64-bit ints the VC++ way
-internal_convert_string_to_int(longlong, _strtoi64)
-internal_convert_string_to_int(ulonglong, _strtoui64)
-#else
-// No better idea, so assume the C99 way. If your compiler doesn't
-// support this, please provide a patch to extend this ifdef, or define
-// NO_LONG_LONGS.
-internal_convert_string_to_int(longlong, strtoll)
-internal_convert_string_to_int(ulonglong, strtoull)
-#endif
-#endif // !defined(NO_LONG_LONGS)
-
-
#if !defined(MYSQLPP_NO_BINARY_OPERS) && !defined(DOXYGEN_IGNORE)
// Ignore this section is MYSQLPP_NO_BINARY_OPERS is defined, or if this
// section is being parsed by Doxygen. In the latter case, it's ignored
@@ -614,40 +641,6 @@
#endif // DOXYGEN_IGNORE
-// The generic conv() implementation for numeric types.
-template <class Type>
-Type
-String::conv(Type) const
-{
- if (buffer_) {
- std::string strbuf;
- strip_leading_blanks(strbuf);
- std::string::size_type len = strbuf.size();
- const char* str = strbuf.data();
- const char* end = str;
- Type num = internal_string_to_number_proxy<Type>(str, end);
-
- lconv* lc = localeconv();
- if ((lc && lc->decimal_point && lc->decimal_point[0] ) ?
- *end == lc->decimal_point[0] :
- *end == '.') {
- ++end;
- for (; *end == '0'; ++end) ;
- }
-
- if (*end != '\0' && end != 0) {
- throw BadConversion(typeid(Type).name(), data(),
- end - str, len);
- }
-
- return num;
- }
- else {
- return 0;
- }
-}
-
-
#if !defined(DOXYGEN_IGNORE)
// Doxygen isn't smart enough to recognize these template
// specializations. Maybe it's the MYSQLPP_EXPORT tags?
_______________________________________________
Mysqlpp-commits mailing list
[email protected]
https://mail.gna.org/listinfo/mysqlpp-commits