mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-04 08:36:52 +08:00
refs #245 removed nested tie workarounds for tuples with >10 members
This commit is contained in:
@@ -30,15 +30,6 @@ namespace BlackMisc
|
||||
namespace Private
|
||||
{
|
||||
|
||||
// Helper trait to detect whether a class is a tuple.
|
||||
//! \private
|
||||
//! @{
|
||||
template <class T>
|
||||
struct IsTuple : public std::false_type {};
|
||||
template <class... Ts>
|
||||
struct IsTuple<std::tuple<Ts...>> : public std::true_type {};
|
||||
//! @}
|
||||
|
||||
// Using SFINAE to help detect missing BLACK_ENABLE_TUPLE_CONVERSION macro in static_assert
|
||||
//! \private
|
||||
std::false_type hasEnabledTupleConversionHelper(...);
|
||||
@@ -78,53 +69,18 @@ namespace BlackMisc
|
||||
int compareHelper(const Tu &a, const Tu &b)
|
||||
{
|
||||
typedef typename std::decay<typename std::tuple_element<N, Tu>::type>::type Element;
|
||||
typedef std::integral_constant<bool, std::is_base_of<CValueObject, Element>::value || IsTuple<Element>::value> isCValueObjectTag;
|
||||
|
||||
return compareHelper(std::get<N>(a), std::get<N>(b), isCValueObjectTag());
|
||||
return compareHelper(std::get<N>(a), std::get<N>(b), typename std::is_base_of<CValueObject, Element>::type());
|
||||
}
|
||||
//! @}
|
||||
|
||||
// Helper which returns a copy of its argument if it's a tuple,
|
||||
// otherwise returns a reference to its argument.
|
||||
// Helper which will allow us to hook in our own customizations into BlackMisc::tie
|
||||
//! \private
|
||||
//! @{
|
||||
template <class T>
|
||||
auto tieHelper(T &obj, std::false_type isTupleTag) -> std::reference_wrapper<T>
|
||||
std::reference_wrapper<T> tieHelper(T &obj)
|
||||
{
|
||||
Q_UNUSED(isTupleTag);
|
||||
return obj;
|
||||
}
|
||||
template <class T>
|
||||
auto tieHelper(T &obj, std::true_type isTupleTag) -> T
|
||||
{
|
||||
Q_UNUSED(isTupleTag);
|
||||
return obj;
|
||||
}
|
||||
template <class T>
|
||||
auto tieHelper(T &obj) -> decltype(tieHelper(obj, IsTuple<T>()))
|
||||
{
|
||||
return tieHelper(obj, IsTuple<T>());
|
||||
}
|
||||
//! @}
|
||||
|
||||
// Helper which (de)serializes its argument to/from JSON,
|
||||
// whether it is a simple value or a nested tuple.
|
||||
// Defined later because it uses TupleHelper;
|
||||
// forward-declared because TupleHelper uses it.
|
||||
//! \private
|
||||
//! @{
|
||||
template <class T>
|
||||
static void serializeJsonHelper(QJsonObject &json, const QStringList &members, const T &obj, int index, std::false_type isNestedTag);
|
||||
template <class T>
|
||||
static void serializeJsonHelper(QJsonObject &json, const QStringList &members, const T &obj, int index, std::true_type isNestedTag);
|
||||
template <class T>
|
||||
static void serializeJsonHelper(QJsonObject &json, const QStringList &members, const T &obj, int index);
|
||||
template <class T>
|
||||
static void deserializeJsonHelper(const QJsonObject &json, const QStringList &members, T &obj, int index, std::false_type isNestedTag);
|
||||
template <class T>
|
||||
static void deserializeJsonHelper(const QJsonObject &json, const QStringList &members, T &obj, int index, std::true_type isNestedTag);
|
||||
template <class T>
|
||||
static void deserializeJsonHelper(const QJsonObject &json, const QStringList &members, T &obj, int index);
|
||||
//! @}
|
||||
|
||||
// Applying operations to all elements in a tuple, using recursion
|
||||
@@ -168,14 +124,14 @@ namespace BlackMisc
|
||||
static void serializeJson(QJsonObject &json, const QStringList &members, const Tu &tu)
|
||||
{
|
||||
TupleHelper < N - 1 >::serializeJson(json, members, tu);
|
||||
serializeJsonHelper(json, members, std::get < N - 1 > (tu), N - 1);
|
||||
json << std::make_pair(members.at(N - 1), std::get < N - 1 >(tu));
|
||||
}
|
||||
|
||||
template <class Tu>
|
||||
static void deserializeJson(const QJsonObject &json, const QStringList &members, Tu &tu)
|
||||
{
|
||||
TupleHelper < N - 1 >::deserializeJson(json, members, tu);
|
||||
deserializeJsonHelper(json, members, std::get < N - 1 > (tu), N - 1);
|
||||
json.value(members.at(N - 1)) >> std::get < N - 1 >(tu);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -199,42 +155,6 @@ namespace BlackMisc
|
||||
static void deserializeJson(const QJsonObject &, const QStringList &, Tu &) {}
|
||||
};
|
||||
|
||||
// definitions of helpers declared earlier
|
||||
template <class T>
|
||||
static void serializeJsonHelper(QJsonObject &json, const QStringList &members, const T &obj, int index, std::false_type isNestedTag)
|
||||
{
|
||||
Q_UNUSED(isNestedTag);
|
||||
json << std::make_pair(members.at(index), obj);
|
||||
}
|
||||
template <class T>
|
||||
static void serializeJsonHelper(QJsonObject &json, const QStringList &members, const T &obj, int index, std::true_type isNestedTag)
|
||||
{
|
||||
Q_UNUSED(isNestedTag);
|
||||
TupleHelper<std::tuple_size<T>::value>::serializeJson(json, members.mid(index), obj);
|
||||
}
|
||||
template <class T>
|
||||
static void serializeJsonHelper(QJsonObject &json, const QStringList &members, const T &obj, int index)
|
||||
{
|
||||
serializeJsonHelper(json, members, obj, index, IsTuple<T>());
|
||||
}
|
||||
template <class T>
|
||||
static void deserializeJsonHelper(const QJsonObject &json, const QStringList &members, T &obj, int index, std::false_type isNestedTag)
|
||||
{
|
||||
Q_UNUSED(isNestedTag);
|
||||
json.value(members.at(index)) >> obj;
|
||||
}
|
||||
template <class T>
|
||||
static void deserializeJsonHelper(const QJsonObject &json, const QStringList &members, T &obj, int index, std::true_type isNestedTag)
|
||||
{
|
||||
Q_UNUSED(isNestedTag);
|
||||
TupleHelper<std::tuple_size<T>::value>::deserializeJson(json, members.mid(index), obj);
|
||||
}
|
||||
template <class T>
|
||||
static void deserializeJsonHelper(const QJsonObject &json, const QStringList &members, T &obj, int index)
|
||||
{
|
||||
deserializeJsonHelper(json, members, obj, index, IsTuple<T>());
|
||||
}
|
||||
|
||||
} // namespace Private
|
||||
|
||||
} // namespace BlackMisc
|
||||
|
||||
Reference in New Issue
Block a user