QxOrm 1.4.9
C++ Object Relational Mapping library
Loading...
Searching...
No Matches
QxDataMember_PImpl.h
Go to the documentation of this file.
1/****************************************************************************
2**
3** https://www.qxorm.com/
4** Copyright (C) 2013 Lionel Marty (contact@qxorm.com)
5**
6** This file is part of the QxOrm library
7**
8** This software is provided 'as-is', without any express or implied
9** warranty. In no event will the authors be held liable for any
10** damages arising from the use of this software
11**
12** Commercial Usage
13** Licensees holding valid commercial QxOrm licenses may use this file in
14** accordance with the commercial license agreement provided with the
15** Software or, alternatively, in accordance with the terms contained in
16** a written agreement between you and Lionel Marty
17**
18** GNU General Public License Usage
19** Alternatively, this file may be used under the terms of the GNU
20** General Public License version 3.0 as published by the Free Software
21** Foundation and appearing in the file 'license.gpl3.txt' included in the
22** packaging of this file. Please review the following information to
23** ensure the GNU General Public License version 3.0 requirements will be
24** met : http://www.gnu.org/copyleft/gpl.html
25**
26** If you are unsure which license is appropriate for your use, or
27** if you have questions regarding the use of this file, please contact :
28** contact@qxorm.com
29**
30****************************************************************************/
31
32#ifndef _QX_DATA_MEMBER_PIMPL_H_
33#define _QX_DATA_MEMBER_PIMPL_H_
34
35#ifdef _MSC_VER
36#pragma once
37#endif
38
47
48#define QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(ArchiveInput, ArchiveOutput) \
49virtual void toArchive(const void * pOwner, ArchiveOutput & ar) const Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(ar); } \
50virtual void fromArchive(void * pOwner, ArchiveInput & ar) Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(ar); }
51
52namespace qx {
53
58template <typename DataType, class Owner>
60{
61
62protected:
63
64 typedef DataType Owner::* type_data_member_ptr;
65
67
68public:
69
70 QxDataMember_PImpl(type_data_member_ptr pData, const QString & sKey) : IxDataMember(sKey, 0, false, false, NULL), m_pData(pData) { static_assert(std::is_pointer<DataType>::value, "std::is_pointer<DataType>::value"); this->setAccessDataPointer(true); }
71 virtual ~QxDataMember_PImpl() { ; }
72
73 virtual bool isEqual(const void * pOwner1, const void * pOwner2) const Q_DECL_OVERRIDE { Q_UNUSED(pOwner1); Q_UNUSED(pOwner2); return false; }
74 virtual QVariant toVariant(const void * pOwner, const QString & sFormat, int iIndexName = -1, qx::cvt::context::ctx_type ctx = qx::cvt::context::e_no_context) const Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(sFormat); Q_UNUSED(iIndexName); Q_UNUSED(ctx); return QVariant(); }
75 virtual qx_bool fromVariant(void * pOwner, const QVariant & v, const QString & sFormat, int iIndexName = -1, qx::cvt::context::ctx_type ctx = qx::cvt::context::e_no_context) Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(v); Q_UNUSED(sFormat); Q_UNUSED(iIndexName); Q_UNUSED(ctx); return qx_bool(true); }
76 virtual QString getType() const Q_DECL_OVERRIDE { return QString(); }
77
78#ifndef _QX_NO_JSON
79 virtual QJsonValue toJson(const void * pOwner, const QString & sFormat) const Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(sFormat); return QJsonValue(); }
80 virtual qx_bool fromJson(void * pOwner, const QJsonValue & j, const QString & sFormat) Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(j); Q_UNUSED(sFormat); return qx_bool(true); }
81#endif // _QX_NO_JSON
82
83protected:
84
85 inline DataType * getData(void * pOwner) const { return (& ((static_cast<Owner *>(pOwner))->*m_pData)); }
86 inline const DataType * getData(const void * pOwner) const { return (& ((static_cast<const Owner *>(pOwner))->*m_pData)); }
87
88 virtual qx::any getDataPtr(const void * pOwner) const Q_DECL_FINAL { return (pOwner ? qx::any(* getData(pOwner)) : qx::any()); }
89 virtual qx::any getDataPtr(void * pOwner) Q_DECL_FINAL { return (pOwner ? qx::any(* getData(pOwner)) : qx::any()); }
90 virtual void * getDataVoidPtr(const void * pOwner) const Q_DECL_FINAL { return (pOwner ? static_cast<void *>(const_cast<DataType>(* getData(pOwner))) : NULL); }
91 virtual void * getDataVoidPtr(void * pOwner) Q_DECL_FINAL { return (pOwner ? static_cast<void *>(* getData(pOwner)) : NULL); }
92
93public:
94
95#ifdef _QX_ENABLE_BOOST_SERIALIZATION
96
97#if _QX_SERIALIZE_POLYMORPHIC
98 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::polymorphic_iarchive, boost::archive::polymorphic_oarchive)
99#endif // _QX_SERIALIZE_POLYMORPHIC
100
101#if _QX_SERIALIZE_BINARY
102 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::binary_iarchive, boost::archive::binary_oarchive)
103#endif // _QX_SERIALIZE_BINARY
104
105#if _QX_SERIALIZE_TEXT
106 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::text_iarchive, boost::archive::text_oarchive)
107#endif // _QX_SERIALIZE_TEXT
108
109#if _QX_SERIALIZE_XML
110 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::xml_iarchive, boost::archive::xml_oarchive)
111#endif // _QX_SERIALIZE_XML
112
113#if _QX_SERIALIZE_PORTABLE_BINARY
115#endif // _QX_SERIALIZE_PORTABLE_BINARY
116
117#if _QX_SERIALIZE_WIDE_BINARY
118 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::binary_wiarchive, boost::archive::binary_woarchive)
119#endif // _QX_SERIALIZE_WIDE_BINARY
120
121#if _QX_SERIALIZE_WIDE_TEXT
122 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::text_wiarchive, boost::archive::text_woarchive)
123#endif // _QX_SERIALIZE_WIDE_TEXT
124
125#if _QX_SERIALIZE_WIDE_XML
126 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::xml_wiarchive, boost::archive::xml_woarchive)
127#endif // _QX_SERIALIZE_WIDE_XML
128
129#endif // _QX_ENABLE_BOOST_SERIALIZATION
130
131};
132
133template <typename DataType, class Owner>
134class QxDataMember_PImpl<std::unique_ptr<DataType>, Owner> : public IxDataMember
135{
136
137protected:
138
139 typedef std::unique_ptr<DataType> Owner::* type_data_member_ptr;
140
142
143public:
144
145 QxDataMember_PImpl(type_data_member_ptr pData, const QString & sKey) : IxDataMember(sKey, 0, false, false, NULL), m_pData(pData) { this->setAccessDataPointer(true); }
146 virtual ~QxDataMember_PImpl() { ; }
147
148 virtual bool isEqual(const void * pOwner1, const void * pOwner2) const Q_DECL_OVERRIDE { Q_UNUSED(pOwner1); Q_UNUSED(pOwner2); return false; }
149 virtual QVariant toVariant(const void * pOwner, const QString & sFormat, int iIndexName = -1, qx::cvt::context::ctx_type ctx = qx::cvt::context::e_no_context) const Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(sFormat); Q_UNUSED(iIndexName); Q_UNUSED(ctx); return QVariant(); }
150 virtual qx_bool fromVariant(void * pOwner, const QVariant & v, const QString & sFormat, int iIndexName = -1, qx::cvt::context::ctx_type ctx = qx::cvt::context::e_no_context) Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(v); Q_UNUSED(sFormat); Q_UNUSED(iIndexName); Q_UNUSED(ctx); return qx_bool(true); }
151 virtual QString getType() const Q_DECL_OVERRIDE { return QString(); }
152
153#ifndef _QX_NO_JSON
154 virtual QJsonValue toJson(const void * pOwner, const QString & sFormat) const Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(sFormat); return QJsonValue(); }
155 virtual qx_bool fromJson(void * pOwner, const QJsonValue & j, const QString & sFormat) Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(j); Q_UNUSED(sFormat); return qx_bool(true); }
156#endif // _QX_NO_JSON
157
158protected:
159
160 inline std::unique_ptr<DataType> * getData(void * pOwner) const { return (& ((static_cast<Owner *>(pOwner))->*m_pData)); }
161 inline const std::unique_ptr<DataType> * getData(const void * pOwner) const { return (& ((static_cast<const Owner *>(pOwner))->*m_pData)); }
162
163 virtual qx::any getDataPtr(const void * pOwner) const Q_DECL_FINAL { return (pOwner ? qx::any(getData(pOwner)->get()) : qx::any()); }
164 virtual qx::any getDataPtr(void * pOwner) Q_DECL_FINAL { return (pOwner ? qx::any(getData(pOwner)->get()) : qx::any()); }
165 virtual void * getDataVoidPtr(const void * pOwner) const Q_DECL_FINAL { return (pOwner ? static_cast<void *>(const_cast<DataType *>(getData(pOwner)->get())) : NULL); }
166 virtual void * getDataVoidPtr(void * pOwner) Q_DECL_FINAL { return (pOwner ? static_cast<void *>(getData(pOwner)->get()) : NULL); }
167
168public:
169
170#ifdef _QX_ENABLE_BOOST_SERIALIZATION
171
172#if _QX_SERIALIZE_POLYMORPHIC
173 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::polymorphic_iarchive, boost::archive::polymorphic_oarchive)
174#endif // _QX_SERIALIZE_POLYMORPHIC
175
176#if _QX_SERIALIZE_BINARY
177 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::binary_iarchive, boost::archive::binary_oarchive)
178#endif // _QX_SERIALIZE_BINARY
179
180#if _QX_SERIALIZE_TEXT
181 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::text_iarchive, boost::archive::text_oarchive)
182#endif // _QX_SERIALIZE_TEXT
183
184#if _QX_SERIALIZE_XML
185 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::xml_iarchive, boost::archive::xml_oarchive)
186#endif // _QX_SERIALIZE_XML
187
188#if _QX_SERIALIZE_PORTABLE_BINARY
190#endif // _QX_SERIALIZE_PORTABLE_BINARY
191
192#if _QX_SERIALIZE_WIDE_BINARY
193 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::binary_wiarchive, boost::archive::binary_woarchive)
194#endif // _QX_SERIALIZE_WIDE_BINARY
195
196#if _QX_SERIALIZE_WIDE_TEXT
197 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::text_wiarchive, boost::archive::text_woarchive)
198#endif // _QX_SERIALIZE_WIDE_TEXT
199
200#if _QX_SERIALIZE_WIDE_XML
201 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::xml_wiarchive, boost::archive::xml_woarchive)
202#endif // _QX_SERIALIZE_WIDE_XML
203
204#endif // _QX_ENABLE_BOOST_SERIALIZATION
205
206};
207
208template <typename DataType, class Owner>
209class QxDataMember_PImpl<std::shared_ptr<DataType>, Owner> : public IxDataMember
210{
211
212protected:
213
214 typedef std::shared_ptr<DataType> Owner::* type_data_member_ptr;
215
217
218public:
219
220 QxDataMember_PImpl(type_data_member_ptr pData, const QString & sKey) : IxDataMember(sKey, 0, false, false, NULL), m_pData(pData) { this->setAccessDataPointer(true); }
221 virtual ~QxDataMember_PImpl() { ; }
222
223 virtual bool isEqual(const void * pOwner1, const void * pOwner2) const Q_DECL_OVERRIDE { Q_UNUSED(pOwner1); Q_UNUSED(pOwner2); return false; }
224 virtual QVariant toVariant(const void * pOwner, const QString & sFormat, int iIndexName = -1, qx::cvt::context::ctx_type ctx = qx::cvt::context::e_no_context) const Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(sFormat); Q_UNUSED(iIndexName); Q_UNUSED(ctx); return QVariant(); }
225 virtual qx_bool fromVariant(void * pOwner, const QVariant & v, const QString & sFormat, int iIndexName = -1, qx::cvt::context::ctx_type ctx = qx::cvt::context::e_no_context) Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(v); Q_UNUSED(sFormat); Q_UNUSED(iIndexName); Q_UNUSED(ctx); return qx_bool(true); }
226 virtual QString getType() const Q_DECL_OVERRIDE { return QString(); }
227
228#ifndef _QX_NO_JSON
229 virtual QJsonValue toJson(const void * pOwner, const QString & sFormat) const Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(sFormat); return QJsonValue(); }
230 virtual qx_bool fromJson(void * pOwner, const QJsonValue & j, const QString & sFormat) Q_DECL_OVERRIDE { Q_UNUSED(pOwner); Q_UNUSED(j); Q_UNUSED(sFormat); return qx_bool(true); }
231#endif // _QX_NO_JSON
232
233protected:
234
235 inline std::shared_ptr<DataType> * getData(void * pOwner) const { return (& ((static_cast<Owner *>(pOwner))->*m_pData)); }
236 inline const std::shared_ptr<DataType> * getData(const void * pOwner) const { return (& ((static_cast<const Owner *>(pOwner))->*m_pData)); }
237
238 virtual qx::any getDataPtr(const void * pOwner) const Q_DECL_FINAL { return (pOwner ? qx::any(getData(pOwner)->get()) : qx::any()); }
239 virtual qx::any getDataPtr(void * pOwner) Q_DECL_FINAL { return (pOwner ? qx::any(getData(pOwner)->get()) : qx::any()); }
240 virtual void * getDataVoidPtr(const void * pOwner) const Q_DECL_FINAL { return (pOwner ? static_cast<void *>(const_cast<DataType *>(getData(pOwner)->get())) : NULL); }
241 virtual void * getDataVoidPtr(void * pOwner) Q_DECL_FINAL { return (pOwner ? static_cast<void *>(getData(pOwner)->get()) : NULL); }
242
243public:
244
245#ifdef _QX_ENABLE_BOOST_SERIALIZATION
246
247#if _QX_SERIALIZE_POLYMORPHIC
248 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::polymorphic_iarchive, boost::archive::polymorphic_oarchive)
249#endif // _QX_SERIALIZE_POLYMORPHIC
250
251#if _QX_SERIALIZE_BINARY
252 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::binary_iarchive, boost::archive::binary_oarchive)
253#endif // _QX_SERIALIZE_BINARY
254
255#if _QX_SERIALIZE_TEXT
256 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::text_iarchive, boost::archive::text_oarchive)
257#endif // _QX_SERIALIZE_TEXT
258
259#if _QX_SERIALIZE_XML
260 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::xml_iarchive, boost::archive::xml_oarchive)
261#endif // _QX_SERIALIZE_XML
262
263#if _QX_SERIALIZE_PORTABLE_BINARY
265#endif // _QX_SERIALIZE_PORTABLE_BINARY
266
267#if _QX_SERIALIZE_WIDE_BINARY
268 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::binary_wiarchive, boost::archive::binary_woarchive)
269#endif // _QX_SERIALIZE_WIDE_BINARY
270
271#if _QX_SERIALIZE_WIDE_TEXT
272 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::text_wiarchive, boost::archive::text_woarchive)
273#endif // _QX_SERIALIZE_WIDE_TEXT
274
275#if _QX_SERIALIZE_WIDE_XML
276 QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(boost::archive::xml_wiarchive, boost::archive::xml_woarchive)
277#endif // _QX_SERIALIZE_WIDE_XML
278
279#endif // _QX_ENABLE_BOOST_SERIALIZATION
280
281};
282
283} // namespace qx
284
285#endif // _QX_DATA_MEMBER_PIMPL_H_
Common interface for all class properties registered into QxOrm context.
qx::QxBool qx_bool
Definition QxBool.h:150
#define QX_DATA_MEMBER_PIMPL_VIRTUAL_ARCHIVE_HPP(ArchiveInput, ArchiveOutput)
#define Q_DECL_OVERRIDE
Definition QxMacro.h:254
#define Q_DECL_FINAL
Definition QxMacro.h:258
Portable binary input archive using little endian format.
Portable binary output archive using little endian format.
qx::IxDataMember : common interface for all class properties registered into QxOrm context
void setAccessDataPointer(bool b)
qx_bool : boolean type with code and description message when an error occured
Definition QxBool.h:71
virtual bool isEqual(const void *pOwner1, const void *pOwner2) const Q_DECL_OVERRIDE
virtual void * getDataVoidPtr(void *pOwner) Q_DECL_FINAL
QxDataMember_PImpl(type_data_member_ptr pData, const QString &sKey)
virtual qx_bool fromJson(void *pOwner, const QJsonValue &j, const QString &sFormat) Q_DECL_OVERRIDE
std::shared_ptr< DataType > * getData(void *pOwner) const
const std::shared_ptr< DataType > * getData(const void *pOwner) const
virtual qx_bool fromVariant(void *pOwner, const QVariant &v, const QString &sFormat, int iIndexName=-1, qx::cvt::context::ctx_type ctx=qx::cvt::context::e_no_context) Q_DECL_OVERRIDE
type_data_member_ptr m_pData
Data member under format "& Owner::DataMember".
virtual qx::any getDataPtr(void *pOwner) Q_DECL_FINAL
virtual void * getDataVoidPtr(const void *pOwner) const Q_DECL_FINAL
virtual qx::any getDataPtr(const void *pOwner) const Q_DECL_FINAL
virtual QJsonValue toJson(const void *pOwner, const QString &sFormat) const Q_DECL_OVERRIDE
virtual QVariant toVariant(const void *pOwner, const QString &sFormat, int iIndexName=-1, qx::cvt::context::ctx_type ctx=qx::cvt::context::e_no_context) const Q_DECL_OVERRIDE
const std::unique_ptr< DataType > * getData(const void *pOwner) const
virtual qx_bool fromJson(void *pOwner, const QJsonValue &j, const QString &sFormat) Q_DECL_OVERRIDE
virtual QVariant toVariant(const void *pOwner, const QString &sFormat, int iIndexName=-1, qx::cvt::context::ctx_type ctx=qx::cvt::context::e_no_context) const Q_DECL_OVERRIDE
virtual qx::any getDataPtr(void *pOwner) Q_DECL_FINAL
std::unique_ptr< DataType > * getData(void *pOwner) const
virtual void * getDataVoidPtr(void *pOwner) Q_DECL_FINAL
virtual qx::any getDataPtr(const void *pOwner) const Q_DECL_FINAL
virtual bool isEqual(const void *pOwner1, const void *pOwner2) const Q_DECL_OVERRIDE
virtual qx_bool fromVariant(void *pOwner, const QVariant &v, const QString &sFormat, int iIndexName=-1, qx::cvt::context::ctx_type ctx=qx::cvt::context::e_no_context) Q_DECL_OVERRIDE
virtual QJsonValue toJson(const void *pOwner, const QString &sFormat) const Q_DECL_OVERRIDE
type_data_member_ptr m_pData
Data member under format "& Owner::DataMember".
virtual void * getDataVoidPtr(const void *pOwner) const Q_DECL_FINAL
QxDataMember_PImpl(type_data_member_ptr pData, const QString &sKey)
qx::QxDataMember_PImpl<DataType, Owner> : concrete property of type DataType registered into QxOrm co...
QxDataMember_PImpl(type_data_member_ptr pData, const QString &sKey)
virtual QString getType() const Q_DECL_OVERRIDE
DataType * getData(void *pOwner) const
const DataType * getData(const void *pOwner) const
virtual qx::any getDataPtr(const void *pOwner) const Q_DECL_FINAL
virtual qx_bool fromVariant(void *pOwner, const QVariant &v, const QString &sFormat, int iIndexName=-1, qx::cvt::context::ctx_type ctx=qx::cvt::context::e_no_context) Q_DECL_OVERRIDE
type_data_member_ptr m_pData
Data member under format "& Owner::DataMember".
virtual qx_bool fromJson(void *pOwner, const QJsonValue &j, const QString &sFormat) Q_DECL_OVERRIDE
virtual bool isEqual(const void *pOwner1, const void *pOwner2) const Q_DECL_OVERRIDE
virtual void * getDataVoidPtr(const void *pOwner) const Q_DECL_FINAL
virtual QVariant toVariant(const void *pOwner, const QString &sFormat, int iIndexName=-1, qx::cvt::context::ctx_type ctx=qx::cvt::context::e_no_context) const Q_DECL_OVERRIDE
DataType Owner::* type_data_member_ptr
virtual QJsonValue toJson(const void *pOwner, const QString &sFormat) const Q_DECL_OVERRIDE
virtual qx::any getDataPtr(void *pOwner) Q_DECL_FINAL
virtual void * getDataVoidPtr(void *pOwner) Q_DECL_FINAL
Root namespace for all QxOrm library features.