diff --git a/libretroshare/src/chat/rschatitems.cc b/libretroshare/src/chat/rschatitems.cc index 00511c1f8..1eee404b6 100644 --- a/libretroshare/src/chat/rschatitems.cc +++ b/libretroshare/src/chat/rschatitems.cc @@ -212,4 +212,4 @@ RS_REGISTER_SERIALIZABLE_TYPE_DEF(RsChatMsgItem) void PrivateOugoingMapItem::serial_process( RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx ) -{ RS_PROCESS_SERIAL_MEMBER(store); } +{ RS_SERIAL_PROCESS(store); } diff --git a/libretroshare/src/gxstrans/p3gxstransitems.cc b/libretroshare/src/gxstrans/p3gxstransitems.cc index 43745aa4d..1db07c70a 100644 --- a/libretroshare/src/gxstrans/p3gxstransitems.cc +++ b/libretroshare/src/gxstrans/p3gxstransitems.cc @@ -48,24 +48,24 @@ void OutgoingRecord_deprecated::serial_process( RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx ) { - RS_PROCESS_SERIAL_MEMBER_TYPED(status, uint8_t); - RS_PROCESS_SERIAL_MEMBER(recipient); - RS_PROCESS_SERIAL_MEMBER(mailItem); - RS_PROCESS_SERIAL_MEMBER(mailData); - RS_PROCESS_SERIAL_MEMBER_TYPED(clientService, uint16_t); - RS_PROCESS_SERIAL_MEMBER(presignedReceipt); + RS_SERIAL_PROCESS(status); + RS_SERIAL_PROCESS(recipient); + RS_SERIAL_PROCESS(mailItem); + RS_SERIAL_PROCESS(mailData); + RS_SERIAL_PROCESS(clientService); + RS_SERIAL_PROCESS(presignedReceipt); } void OutgoingRecord::serial_process(RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx) { - RS_PROCESS_SERIAL_MEMBER_TYPED(status, uint8_t); - RS_PROCESS_SERIAL_MEMBER(recipient); - RS_PROCESS_SERIAL_MEMBER(author); - RS_PROCESS_SERIAL_MEMBER(group_id); - RS_PROCESS_SERIAL_MEMBER(sent_ts); - RS_PROCESS_SERIAL_MEMBER(mailItem); - RS_PROCESS_SERIAL_MEMBER(mailData); - RS_PROCESS_SERIAL_MEMBER_TYPED(clientService, uint16_t); - RS_PROCESS_SERIAL_MEMBER(presignedReceipt); + RS_SERIAL_PROCESS(status); + RS_SERIAL_PROCESS(recipient); + RS_SERIAL_PROCESS(author); + RS_SERIAL_PROCESS(group_id); + RS_SERIAL_PROCESS(sent_ts); + RS_SERIAL_PROCESS(mailItem); + RS_SERIAL_PROCESS(mailData); + RS_SERIAL_PROCESS(clientService); + RS_SERIAL_PROCESS(presignedReceipt); } diff --git a/libretroshare/src/gxstrans/p3gxstransitems.h b/libretroshare/src/gxstrans/p3gxstransitems.h index 41b1b2d1b..bd13c9e71 100644 --- a/libretroshare/src/gxstrans/p3gxstransitems.h +++ b/libretroshare/src/gxstrans/p3gxstransitems.h @@ -55,7 +55,7 @@ public: void serial_process( RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx ) - { RS_PROCESS_SERIAL_MEMBER_TYPED(mailId, uint64_t); } + { RS_SERIAL_PROCESS(mailId); } }; class RsGxsTransPresignedReceipt : public RsGxsTransBaseMsgItem @@ -140,9 +140,9 @@ public: RsGenericSerializer::SerializeContext& ctx ) { RsGxsTransBaseMsgItem::serial_process(j, ctx); - RS_PROCESS_SERIAL_MEMBER_TYPED(cryptoType, uint8_t); - RS_PROCESS_SERIAL_MEMBER(recipientHint); - RS_PROCESS_SERIAL_MEMBER(payload); + RS_SERIAL_PROCESS(cryptoType); + RS_SERIAL_PROCESS(recipientHint); + RS_SERIAL_PROCESS(payload); } void clear() diff --git a/libretroshare/src/retroshare/rsgxsifacetypes.h b/libretroshare/src/retroshare/rsgxsifacetypes.h index 52daf1023..18637f1b1 100644 --- a/libretroshare/src/retroshare/rsgxsifacetypes.h +++ b/libretroshare/src/retroshare/rsgxsifacetypes.h @@ -100,24 +100,24 @@ struct RsGroupMetaData : RsSerializable void serial_process( RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx ) { - RS_PROCESS_SERIAL_MEMBER(mGroupId); - RS_PROCESS_SERIAL_MEMBER(mGroupName); - RS_PROCESS_SERIAL_MEMBER(mGroupFlags); - RS_PROCESS_SERIAL_MEMBER(mSignFlags); - RS_PROCESS_SERIAL_MEMBER(mPublishTs); - RS_PROCESS_SERIAL_MEMBER(mAuthorId); - RS_PROCESS_SERIAL_MEMBER(mCircleId); - RS_PROCESS_SERIAL_MEMBER(mCircleType); - RS_PROCESS_SERIAL_MEMBER(mAuthenFlags); - RS_PROCESS_SERIAL_MEMBER(mParentGrpId); - RS_PROCESS_SERIAL_MEMBER(mSubscribeFlags); - RS_PROCESS_SERIAL_MEMBER(mPop); - RS_PROCESS_SERIAL_MEMBER(mVisibleMsgCount); - RS_PROCESS_SERIAL_MEMBER(mLastPost); - RS_PROCESS_SERIAL_MEMBER(mGroupStatus); - RS_PROCESS_SERIAL_MEMBER(mServiceString); - RS_PROCESS_SERIAL_MEMBER(mOriginator); - RS_PROCESS_SERIAL_MEMBER(mInternalCircle); + RS_SERIAL_PROCESS(mGroupId); + RS_SERIAL_PROCESS(mGroupName); + RS_SERIAL_PROCESS(mGroupFlags); + RS_SERIAL_PROCESS(mSignFlags); + RS_SERIAL_PROCESS(mPublishTs); + RS_SERIAL_PROCESS(mAuthorId); + RS_SERIAL_PROCESS(mCircleId); + RS_SERIAL_PROCESS(mCircleType); + RS_SERIAL_PROCESS(mAuthenFlags); + RS_SERIAL_PROCESS(mParentGrpId); + RS_SERIAL_PROCESS(mSubscribeFlags); + RS_SERIAL_PROCESS(mPop); + RS_SERIAL_PROCESS(mVisibleMsgCount); + RS_SERIAL_PROCESS(mLastPost); + RS_SERIAL_PROCESS(mGroupStatus); + RS_SERIAL_PROCESS(mServiceString); + RS_SERIAL_PROCESS(mOriginator); + RS_SERIAL_PROCESS(mInternalCircle); } }; diff --git a/libretroshare/src/retroshare/rsidentity.h b/libretroshare/src/retroshare/rsidentity.h index d9ec9c5a7..f021252b3 100644 --- a/libretroshare/src/retroshare/rsidentity.h +++ b/libretroshare/src/retroshare/rsidentity.h @@ -98,10 +98,10 @@ struct GxsReputation : RsSerializable void serial_process( RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx ) { - RS_PROCESS_SERIAL_MEMBER(mOverallScore); - RS_PROCESS_SERIAL_MEMBER(mIdScore); - RS_PROCESS_SERIAL_MEMBER(mOwnOpinion); - RS_PROCESS_SERIAL_MEMBER(mPeerOpinion); + RS_SERIAL_PROCESS(mOverallScore); + RS_SERIAL_PROCESS(mIdScore); + RS_SERIAL_PROCESS(mOwnOpinion); + RS_SERIAL_PROCESS(mPeerOpinion); } }; @@ -278,13 +278,13 @@ struct RsIdentityUsage : RsSerializable void serial_process( RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx ) { - RS_PROCESS_SERIAL_MEMBER(mServiceId); - RS_PROCESS_SERIAL_MEMBER_TYPED(mUsageCode, uint8_t); - RS_PROCESS_SERIAL_MEMBER(mGrpId); - RS_PROCESS_SERIAL_MEMBER(mMsgId); - RS_PROCESS_SERIAL_MEMBER(mAdditionalId); - RS_PROCESS_SERIAL_MEMBER(mComment); - RS_PROCESS_SERIAL_MEMBER(mHash); + RS_SERIAL_PROCESS(mServiceId); + RS_SERIAL_PROCESS(mUsageCode); + RS_SERIAL_PROCESS(mGrpId); + RS_SERIAL_PROCESS(mMsgId); + RS_SERIAL_PROCESS(mAdditionalId); + RS_SERIAL_PROCESS(mComment); + RS_SERIAL_PROCESS(mHash); } friend struct RsTypeSerializer; @@ -329,14 +329,14 @@ struct RsIdentityDetails : RsSerializable virtual void serial_process(RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx) { - RS_PROCESS_SERIAL_MEMBER(mId); - RS_PROCESS_SERIAL_MEMBER(mNickname); - RS_PROCESS_SERIAL_MEMBER(mFlags); - RS_PROCESS_SERIAL_MEMBER(mPgpId); - //RS_PROCESS_SERIAL_MEMBER_TYPED(mReputation, RsSerializable); - //RS_PROCESS_SERIAL_MEMBER_TYPED(mAvatar, RsSerializable); - RS_PROCESS_SERIAL_MEMBER(mLastUsageTS); - RS_PROCESS_SERIAL_MEMBER(mUseCases); + RS_SERIAL_PROCESS(mId); + RS_SERIAL_PROCESS(mNickname); + RS_SERIAL_PROCESS(mFlags); + RS_SERIAL_PROCESS(mPgpId); + //RS_SERIAL_PROCESS(mReputation); + //RS_SERIAL_PROCESS(mAvatar); + RS_SERIAL_PROCESS(mLastUsageTS); + RS_SERIAL_PROCESS(mUseCases); } }; diff --git a/libretroshare/src/rsitems/rsnxsitems.cc b/libretroshare/src/rsitems/rsnxsitems.cc index 383d36614..8c6775275 100644 --- a/libretroshare/src/rsitems/rsnxsitems.cc +++ b/libretroshare/src/rsitems/rsnxsitems.cc @@ -73,12 +73,12 @@ void RsNxsSyncMsgItem::serial_process(RsGenericSerializer::SerializeJob j,RsGene void RsNxsMsg::serial_process( RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx ) { - RS_PROCESS_SERIAL_MEMBER_TYPED(transactionNumber, uint32_t); - RS_PROCESS_SERIAL_MEMBER_TYPED(pos, uint8_t); - RS_PROCESS_SERIAL_MEMBER(msgId); - RS_PROCESS_SERIAL_MEMBER(grpId); - RS_PROCESS_SERIAL_MEMBER_TYPED(msg, RsTlvItem); - RS_PROCESS_SERIAL_MEMBER_TYPED(meta, RsTlvItem); + RS_SERIAL_PROCESS(transactionNumber); + RS_SERIAL_PROCESS(pos); + RS_SERIAL_PROCESS(msgId); + RS_SERIAL_PROCESS(grpId); + RS_SERIAL_PROCESS(msg); + RS_SERIAL_PROCESS(meta); } void RsNxsGrp::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx) diff --git a/libretroshare/src/serialiser/rsserializable.h b/libretroshare/src/serialiser/rsserializable.h index 2c520de4c..acfe995af 100644 --- a/libretroshare/src/serialiser/rsserializable.h +++ b/libretroshare/src/serialiser/rsserializable.h @@ -17,60 +17,48 @@ * along with this program. If not, see . */ +#include + #include "serialiser/rsserializer.h" -/** @brief Minimal ancestor for all serializable structs in RetroShare + +/** @brief Minimal ancestor for all serializable structs in RetroShare. * If you want your struct to be easly serializable you should inherit from this * struct. * If you want your struct to be serializable as part of a container like an - * `std::vector` @see RS_REGISTER_SERIALIZABLE_TYPE(T) + * `std::vector` @see RS_REGISTER_SERIALIZABLE_TYPE_DEF(T) and + * @see RS_REGISTER_SERIALIZABLE_TYPE_DECL(T) */ struct RsSerializable { /** Register struct members to serialize in this method taking advantage of - * the helper macros - * @see RS_PROCESS_SERIAL_MEMBER(I) - * @see RS_PROCESS_SERIAL_MEMBER_TYPED(I, T) + * the helper macro @see RS_SERIAL_PROCESS(I) */ virtual void serial_process(RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx) = 0; }; -/** @def RS_PROCESS_SERIAL_MEMBER(I) +/** @def RS_SERIAL_PROCESS(I) * Use this macro to register the members of `YourSerializable` for serial * processing inside `YourSerializable::serial_process(j, ctx)` * + * Pay special attention for member of enum type which must be declared + * specifying the underlying type otherwise the serialization format may differ + * in an uncompatible way depending on the compiler/platform. + * + * If your member is a derivative of RsSerializable in some cases it may be + * convenient also to register your item type with + * @see RS_REGISTER_SERIALIZABLE_TYPE_DEF(T). + * * Inspired by http://stackoverflow.com/a/39345864 */ -#define RS_PROCESS_SERIAL_MEMBER(I) \ - do { RsTypeSerializer::serial_process(j, ctx, I, #I); } while(0) - - -/** @def RS_PROCESS_SERIAL_MEMBER_TYPED(I, T) - * This macro usage is similar to @see RS_PROCESS_SERIAL_MEMBER(I) but it - * permit to force serialization/deserialization type, it is expecially useful - * with enum class members or RsTlvItem derivative members, be very careful with - * the type you pass, as reinterpret_cast on a reference is used that is - * expecially permissive so you can shot your feet if not carefull enough. - * - * If you are using this with an RsSerializable derivative (so passing - * RsSerializable as T) consider to register your item type with - * @see RS_REGISTER_SERIALIZABLE_TYPE(T) in - * association with @see RS_PROCESS_SERIAL_MEMBER(I) that rely on template - * function generation, as in this particular case - * RS_PROCESS_SERIAL_MEMBER_TYPED(I, T) would cause the serial code rely on - * C++ dynamic dispatching that may have a noticeable impact on runtime - * performances. - */ -#pragma GCC diagnostic ignored "-Wstrict-aliasing" -#define RS_PROCESS_SERIAL_MEMBER_TYPED(I, T) do {\ - RsTypeSerializer::serial_process(j, ctx, reinterpret_cast(I), #I);\ +#define RS_SERIAL_PROCESS(I) do { \ + RsTypeSerializer::serial_process(j, ctx, __priv_to_RS_S_TYPE(I), #I ); \ } while(0) -#pragma GCC diagnostic pop -/** @def RS_REGISTER_SERIALIZABLE_TYPE(T) +/** @def RS_REGISTER_SERIALIZABLE_TYPE_DEF(T) * Use this macro into `youritem.cc` only if you need to process members of * subtypes of RsSerializable. * @@ -90,21 +78,15 @@ struct PrivateOugoingMapItem : RsChatItem std::map store; }; -RS_REGISTER_SERIALIZABLE_TYPE(RsChatMsgItem) +RS_REGISTER_SERIALIZABLE_TYPE_DEF(RsChatMsgItem) void PrivateOugoingMapItem::serial_process( RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx ) { - // store is of type - RS_PROCESS_SERIAL_MEMBER(store); + RS_SERIAL_PROCESS(store); } * @endcode - * - * If you use this macro with a lot of different item types this can cause the - * generated binary grow in size, consider the usage of - * @see RS_PROCESS_SERIAL_MEMBER_TYPED(I, T) passing RsSerializable as type in - * that case. */ #define RS_REGISTER_SERIALIZABLE_TYPE_DEF(T) template<> /*static*/\ void RsTypeSerializer::serial_process( \ @@ -118,11 +100,11 @@ void PrivateOugoingMapItem::serial_process( /** @def RS_REGISTER_SERIALIZABLE_TYPE_DECL(T) - * The usage of this macro into your header file is needed only in case you + * The usage of this macro into your header file may be needed only in case you * needed @see RS_REGISTER_SERIALIZABLE_TYPE_DEF(T) in your definitions file, * but it was not enough and the compiler kept complanining about undefined * references to serialize, deserialize, serial_size, print_data, to_JSON, - * from_JSON for your RsSerializable derrived type. + * from_JSON for your RsSerializable derived type. * * One example of such case is RsIdentityUsage that is declared in * retroshare/rsidentity.h but defined in services/p3idservice.cc, also if @@ -135,4 +117,40 @@ void PrivateOugoingMapItem::serial_process( void RsTypeSerializer::serial_process( \ RsGenericSerializer::SerializeJob j,\ RsGenericSerializer::SerializeContext& ctx, T& item,\ - const std::string& /*objName*/ ); + const std::string& objName ); + + +//============================================================================// +// Private type conversion helpers // +//============================================================================// + +/** + * @brief Privates type conversion helpers for RS_SERIAL_PROCESS. + * @private DO NOT use explicitely outside this file. + * Used to cast enums and derived type to matching types supported by + * RsTypeSerializer::serial_process(...) templated methods. + */ +template::value>::type> +inline typename std::underlying_type::type& __priv_to_RS_S_TYPE(T& i) +{ + return reinterpret_cast::type&>(i); +} + +template::value>::type> +inline RsSerializable& __priv_to_RS_S_TYPE(T& i) +{ + return static_cast(i); +} + +struct RsTlvItem; +template::value>::type> +inline RsTlvItem& __priv_to_RS_S_TYPE(T& i) +{ + return static_cast(i); +} + +template::value||std::is_base_of::value||std::is_base_of::value)>::type> +inline T& __priv_to_RS_S_TYPE(T& i) +{ + return i; +} diff --git a/libretroshare/src/services/p3idservice.cc b/libretroshare/src/services/p3idservice.cc index d29c80906..4796b3005 100644 --- a/libretroshare/src/services/p3idservice.cc +++ b/libretroshare/src/services/p3idservice.cc @@ -4510,16 +4510,16 @@ void RsGxsIdGroup::serial_process( RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx ) { - RS_PROCESS_SERIAL_MEMBER_TYPED(mMeta, RsSerializable); - RS_PROCESS_SERIAL_MEMBER(mPgpIdHash); - //RS_PROCESS_SERIAL_MEMBER(mPgpIdSign); - RS_PROCESS_SERIAL_MEMBER(mRecognTags); - //RS_PROCESS_SERIAL_MEMBER(mImage); - RS_PROCESS_SERIAL_MEMBER(mLastUsageTS); - RS_PROCESS_SERIAL_MEMBER(mPgpKnown); - RS_PROCESS_SERIAL_MEMBER(mIsAContact); - RS_PROCESS_SERIAL_MEMBER(mPgpId); - RS_PROCESS_SERIAL_MEMBER_TYPED(mReputation, RsSerializable); + RS_SERIAL_PROCESS(mMeta); + RS_SERIAL_PROCESS(mPgpIdHash); + //RS_SERIAL_PROCESS(mPgpIdSign); + RS_SERIAL_PROCESS(mRecognTags); + //RS_SERIAL_PROCESS(mImage); + RS_SERIAL_PROCESS(mLastUsageTS); + RS_SERIAL_PROCESS(mPgpKnown); + RS_SERIAL_PROCESS(mIsAContact); + RS_SERIAL_PROCESS(mPgpId); + RS_SERIAL_PROCESS(mReputation); } RsIdentityUsage::RsIdentityUsage(