![]() |
QxOrm 1.1.6
C++ Object Relational Mapping library
|
00001 /**************************************************************************** 00002 ** 00003 ** http://www.qxorm.com/ 00004 ** http://sourceforge.net/projects/qxorm/ 00005 ** Original file by Lionel Marty 00006 ** 00007 ** This file is part of the QxOrm library 00008 ** 00009 ** This software is provided 'as-is', without any express or implied 00010 ** warranty. In no event will the authors be held liable for any 00011 ** damages arising from the use of this software. 00012 ** 00013 ** GNU Lesser General Public License Usage 00014 ** This file must be used under the terms of the GNU Lesser 00015 ** General Public License version 2.1 as published by the Free Software 00016 ** Foundation and appearing in the file 'license.lgpl.txt' included in the 00017 ** packaging of this file. Please review the following information to 00018 ** ensure the GNU Lesser General Public License version 2.1 requirements 00019 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 00020 ** 00021 ** If you have questions regarding the use of this file, please contact : 00022 ** contact@qxorm.com 00023 ** 00024 ****************************************************************************/ 00025 00026 #ifndef _QX_STRING_CVT_IMPL_H_ 00027 #define _QX_STRING_CVT_IMPL_H_ 00028 00029 #ifdef _MSC_VER 00030 #pragma once 00031 #endif 00032 00033 #include <boost/lexical_cast.hpp> 00034 #include <boost/mpl/if.hpp> 00035 #include <boost/mpl/logical.hpp> 00036 #include <boost/type_traits/is_pointer.hpp> 00037 #include <boost/type_traits/is_enum.hpp> 00038 00039 #include <QxCommon/QxStringCvt.h> 00040 #include <QxCommon/QxBool.h> 00041 00042 #include <QxCollection/QxCollection.h> 00043 00044 #include <QxRegister/QxClass.h> 00045 00046 #include <QxSerialize/QxArchive.h> 00047 00048 #include <QxTraits/is_smart_ptr.h> 00049 #include <QxTraits/is_container.h> 00050 #include <QxTraits/is_qx_registered.h> 00051 #include <QxTraits/is_qt_variant_compatible.h> 00052 #include <QxTraits/get_class_name_primitive.h> 00053 #include <QxTraits/construct_ptr.h> 00054 #include <QxTraits/generic_container.h> 00055 00056 #define QX_STR_CVT_QDATE_FORMAT "yyyyMMdd" 00057 #define QX_STR_CVT_QTIME_FORMAT "hhmmsszzz" 00058 #define QX_STR_CVT_QDATETIME_FORMAT "yyyyMMddhhmmsszzz" 00059 00060 #if _QX_SERIALIZE_POLYMORPHIC 00061 #define QX_STR_CVT_DEFAULT_ARCHIVE qx::serialization::polymorphic_xml 00062 #elif _QX_SERIALIZE_XML 00063 #define QX_STR_CVT_DEFAULT_ARCHIVE qx::serialization::xml 00064 #elif _QX_SERIALIZE_TEXT 00065 #define QX_STR_CVT_DEFAULT_ARCHIVE qx::serialization::text 00066 #elif _QX_SERIALIZE_BINARY 00067 #define QX_STR_CVT_DEFAULT_ARCHIVE qx::serialization::binary 00068 #endif // _QX_SERIALIZE_XML 00069 00070 #define QX_STR_CVT_BY_USING_ARCHIVE_IMPL(className) \ 00071 namespace qx { namespace cvt { namespace detail { \ 00072 template <> struct QxStringCvt_ToString< className > { \ 00073 static inline QString toString(const className & t, const QString & format, int index) \ 00074 { Q_UNUSED(format); Q_UNUSED(index); return QX_STR_CVT_DEFAULT_ARCHIVE::to_string(t); } }; \ 00075 template <> struct QxStringCvt_FromString< className > { \ 00076 static inline qx_bool fromString(const QString & s, className & t, const QString & format, int index) \ 00077 { Q_UNUSED(format); Q_UNUSED(index); return QX_STR_CVT_DEFAULT_ARCHIVE::from_string(t, s); } }; \ 00078 } } } // namespace qx::cvt::detail 00079 00080 namespace qx { 00081 namespace cvt { 00082 namespace detail { 00083 00084 template <typename T> 00085 struct QxStringCvtGeneric 00086 { 00087 00088 static inline QString toString(const T & t, const QString & format, int index) 00089 { 00090 Q_UNUSED(format); Q_UNUSED(index); std::string s; 00091 try { s = boost::lexical_cast<std::string>(t); } 00092 catch (...) { qDebug("[QxOrm] %s", "'QxStringCvtGeneric::toString()' unknown error calling 'boost::lexical_cast<std::string>()'"); s = ""; } 00093 return QString::fromStdString(s); 00094 } 00095 00096 static inline qx_bool fromString(const QString & s, T & t, const QString & format, int index) 00097 { 00098 Q_UNUSED(format); Q_UNUSED(index); 00099 try { t = boost::lexical_cast<T>(s.toStdString()); } 00100 catch (...) { qDebug("[QxOrm] %s", "'QxStringCvtGeneric::fromString()' unknown error calling 'boost::lexical_cast<T>()'"); return qx_bool(false); } 00101 return qx_bool(true); 00102 } 00103 00104 static inline QVariant toVariant(const T & t, const QString & format, int index) 00105 { return cvtQVariant<qx::trait::is_qt_variant_compatible<T>::value, 0>::toVariant(t, format, index); } 00106 00107 static inline qx_bool fromVariant(const QVariant & v, T & t, const QString & format, int index) 00108 { return cvtQVariant<qx::trait::is_qt_variant_compatible<T>::value, 0>::fromVariant(v, t, format, index); } 00109 00110 private: 00111 00112 template <bool isQVariantCompatible /* = false */, int dummy> 00113 struct cvtQVariant 00114 { 00115 static inline QVariant toVariant(const T & t, const QString & format, int index) { return qx::cvt::to_string(t, format, index); }; 00116 static inline qx_bool fromVariant(const QVariant & v, T & t, const QString & format, int index) { return qx::cvt::from_string(v.toString(), t, format, index); }; 00117 }; 00118 00119 template <int dummy> 00120 struct cvtQVariant<true, dummy> 00121 { 00122 static inline QVariant toVariant(const T & t, const QString & format, int index) { Q_UNUSED(format); Q_UNUSED(index); return QVariant(t); }; 00123 static inline qx_bool fromVariant(const QVariant & v, T & t, const QString & format, int index) { Q_UNUSED(format); Q_UNUSED(index); t = v.value<T>(); return qx_bool(true); }; 00124 }; 00125 00126 }; 00127 00128 template <typename T> 00129 struct QxStringCvtPtr 00130 { 00131 00132 static inline QString toString(const T & t, const QString & format, int index) 00133 { return (t ? qx::cvt::to_string((* t), format, index) : ""); } 00134 00135 static inline qx_bool fromString(const QString & s, T & t, const QString & format, int index) 00136 { if (! t) { qx::trait::construct_ptr<T>::get(t); }; return (t ? qx::cvt::from_string(s, (* t), format, index) : qx_bool(false)); } 00137 00138 static inline QVariant toVariant(const T & t, const QString & format, int index) 00139 { return (t ? qx::cvt::to_variant((* t), format, index) : QVariant()); } 00140 00141 static inline qx_bool fromVariant(const QVariant & v, T & t, const QString & format, int index) 00142 { if (! t && ! v.isNull()) { qx::trait::construct_ptr<T>::get(t); }; return (t ? qx::cvt::from_variant(v, (* t), format, index) : qx_bool(false)); } 00143 00144 }; 00145 00146 template <typename T> 00147 struct QxStringCvtRegistered 00148 { 00149 00150 static inline QString toString(const T & t, const QString & format, int index) 00151 { return (getId() ? getId()->toString((& t), format, index) : ""); } 00152 00153 static inline qx_bool fromString(const QString & s, T & t, const QString & format, int index) 00154 { return (getId() ? getId()->fromString((& t), s, format, index) : qx_bool(false)); } 00155 00156 static inline QVariant toVariant(const T & t, const QString & format, int index) 00157 { return (getId() ? getId()->toVariant((& t), format, index) : QVariant()); } 00158 00159 static inline qx_bool fromVariant(const QVariant & v, T & t, const QString & format, int index) 00160 { return (getId() ? getId()->fromVariant((& t), v, format, index) : qx_bool(false)); } 00161 00162 private: 00163 00164 static inline qx::IxDataMember * getId() 00165 { return qx::QxClass<T>::getSingleton()->getDataMemberX()->getId_WithDaoStrategy(); } 00166 00167 }; 00168 00169 template <typename T> 00170 struct QxStringCvtContainer 00171 { 00172 00173 static inline QString toString(const T & t, const QString & format, int index) 00174 { Q_UNUSED(format); Q_UNUSED(index); return QX_STR_CVT_DEFAULT_ARCHIVE::to_string(t); } 00175 00176 static inline qx_bool fromString(const QString & s, T & t, const QString & format, int index) 00177 { Q_UNUSED(format); Q_UNUSED(index); return QX_STR_CVT_DEFAULT_ARCHIVE::from_string(t, s); } 00178 00179 static inline QVariant toVariant(const T & t, const QString & format, int index) 00180 { Q_UNUSED(format); Q_UNUSED(index); return QX_STR_CVT_DEFAULT_ARCHIVE::to_string(t); } 00181 00182 static inline qx_bool fromVariant(const QVariant & v, T & t, const QString & format, int index) 00183 { Q_UNUSED(format); Q_UNUSED(index); return QX_STR_CVT_DEFAULT_ARCHIVE::from_string(t, v.toString()); } 00184 00185 }; 00186 00187 template <typename T> 00188 struct QxStringCvtEnum 00189 { 00190 00191 static inline QString toString(const T & t, const QString & format, int index) 00192 { Q_UNUSED(format); Q_UNUSED(index); return QString::number(static_cast<long>(t)); } 00193 00194 static inline qx_bool fromString(const QString & s, T & t, const QString & format, int index) 00195 { Q_UNUSED(format); Q_UNUSED(index); bool bOk = false; t = static_cast<T>(static_cast<long>(s.toLongLong(& bOk))); return bOk; } 00196 00197 static inline QVariant toVariant(const T & t, const QString & format, int index) 00198 { Q_UNUSED(format); Q_UNUSED(index); return QVariant(static_cast<qlonglong>(t)); } 00199 00200 static inline qx_bool fromVariant(const QVariant & v, T & t, const QString & format, int index) 00201 { Q_UNUSED(format); Q_UNUSED(index); bool bOk = false; t = static_cast<T>(static_cast<long>(v.toLongLong(& bOk))); return bOk; } 00202 00203 }; 00204 00205 template <typename T> 00206 struct QxStringCvtHelper 00207 { 00208 00209 private: 00210 00211 typedef typename boost::mpl::if_c< boost::is_pointer<T>::value, qx::cvt::detail::QxStringCvtPtr<T>, qx::cvt::detail::QxStringCvtGeneric<T> >::type type_str_cvt_helper_1; 00212 typedef typename boost::mpl::if_c< qx::trait::is_smart_ptr<T>::value, qx::cvt::detail::QxStringCvtPtr<T>, type_str_cvt_helper_1 >::type type_str_cvt_helper_2; 00213 typedef typename boost::mpl::if_c< qx::trait::is_container<T>::value, qx::cvt::detail::QxStringCvtContainer<T>, type_str_cvt_helper_2 >::type type_str_cvt_helper_3; 00214 typedef typename boost::mpl::if_c< qx::trait::is_qx_registered<T>::value, qx::cvt::detail::QxStringCvtRegistered<T>, type_str_cvt_helper_3 >::type type_str_cvt_helper_4; 00215 typedef typename boost::mpl::if_c< boost::is_enum<T>::value, qx::cvt::detail::QxStringCvtEnum<T>, type_str_cvt_helper_4 >::type type_str_cvt_helper_5; 00216 00217 public: 00218 00219 typedef typename QxStringCvtHelper<T>::type_str_cvt_helper_5 type; 00220 00221 }; 00222 00223 template <typename T> 00224 struct QxStringCvt_ToString { 00225 static inline QString toString(const T & t, const QString & format, int index) 00226 { return qx::cvt::detail::QxStringCvtHelper<T>::type::toString(t, format, index); } }; 00227 00228 template <typename T> 00229 struct QxStringCvt_FromString { 00230 static inline qx_bool fromString(const QString & s, T & t, const QString & format, int index) 00231 { return qx::cvt::detail::QxStringCvtHelper<T>::type::fromString(s, t, format, index); } }; 00232 00233 template <typename T> 00234 struct QxStringCvt_ToVariant { 00235 static inline QVariant toVariant(const T & t, const QString & format, int index) 00236 { return qx::cvt::detail::QxStringCvtHelper<T>::type::toVariant(t, format, index); } }; 00237 00238 template <typename T> 00239 struct QxStringCvt_FromVariant { 00240 static inline qx_bool fromVariant(const QVariant & v, T & t, const QString & format, int index) 00241 { return qx::cvt::detail::QxStringCvtHelper<T>::type::fromVariant(v, t, format, index); } }; 00242 00243 } // namespace detail 00244 } // namespace cvt 00245 } // namespace qx 00246 00247 #include "../../inl/QxCommon/QxStringCvt_WithIndex.inl" 00248 #include "../../inl/QxCommon/QxStringCvt_ToString.inl" 00249 #include "../../inl/QxCommon/QxStringCvt_FromString.inl" 00250 #include "../../inl/QxCommon/QxStringCvt_ToVariant.inl" 00251 #include "../../inl/QxCommon/QxStringCvt_FromVariant.inl" 00252 #include "../../inl/QxCommon/QxStringCvt_Qt.inl" 00253 00254 #endif // _QX_STRING_CVT_IMPL_H_