refs #245 removed nested tie workarounds for tuples with >10 members

This commit is contained in:
Mathew Sutcliffe
2014-06-06 01:19:54 +01:00
parent 05fd6fbcae
commit b0ecaff4da
5 changed files with 9 additions and 93 deletions

View File

@@ -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