mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-02 06:35:52 +08:00
refs #624 Removed many workarounds, no longer needed.
This commit is contained in:
@@ -13,7 +13,6 @@
|
||||
#define BLACKGUI_COLUMNS_H
|
||||
|
||||
#include "blackgui/blackguiexport.h"
|
||||
#include "blackmisc/valueobject.h" // for qHash overload, include before Qt stuff due GCC issue
|
||||
#include "blackmisc/collection.h"
|
||||
#include "blackmisc/propertyindex.h"
|
||||
#include "columnformatters.h"
|
||||
|
||||
@@ -429,9 +429,9 @@ namespace BlackMisc
|
||||
void clear() override { m_impl.clear(); }
|
||||
iterator insert(const T &value) override { return iterator::fromImpl(insertHelper(m_impl.insert(value))); }
|
||||
iterator insert(T &&value) override { return iterator::fromImpl(insertHelper(m_impl.insert(std::move(value)))); }
|
||||
iterator erase(iterator pos) override { return iterator::fromImpl(m_impl.erase(*static_cast<const typename C::iterator *>(pos.getImpl()))); }
|
||||
//iterator erase(iterator it1, iterator it2) override { return iterator::fromImpl(m_impl.erase(*static_cast<const typename C::iterator *>(it1.getImpl()), *static_cast<const typename C::iterator*>(it2.getImpl()))); }
|
||||
iterator erase(iterator it1, iterator it2) override { while (it1 != it2) { it1 = iterator::fromImpl(m_impl.erase(*static_cast<const typename C::iterator *>(it1.getImpl()))); } return it1; }
|
||||
iterator erase(iterator pos) override { return iterator::fromImpl(m_impl.erase(pos.template getImpl<const typename C::iterator>())); }
|
||||
//iterator erase(iterator it1, iterator it2) override { return iterator::fromImpl(m_impl.erase(it1.template getImpl<const typename C::iterator>(), it2.template getImpl<const typename C::iterator>())); }
|
||||
iterator erase(iterator it1, iterator it2) override { while (it1 != it2) { it1 = iterator::fromImpl(m_impl.erase(it1.template getImpl<const typename C::iterator>())); } return it1; }
|
||||
iterator find(const T &value) override { return iterator::fromImpl(m_impl.find(value)); }
|
||||
const_iterator find(const T &value) const override { return const_iterator::fromImpl(m_impl.find(value)); }
|
||||
bool operator ==(const PimplBase &other) const override { return implType() == other.implType() ? m_impl == *static_cast<const C *>(other.impl()) : size() == other.size() && std::equal(begin(), end(), other.begin()); }
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <type_traits>
|
||||
#include <iterator>
|
||||
#include <utility>
|
||||
#include <typeindex>
|
||||
|
||||
namespace BlackMisc
|
||||
{
|
||||
@@ -393,9 +394,8 @@ namespace BlackMisc
|
||||
/*!
|
||||
* \brief Return opaque pointer to underlying implementation iterator object.
|
||||
* \pre The iterator must have been initialized.
|
||||
* \todo Returning by void* is rotten, but GCC gives a very cryptic error if I make it a function template with a cast inside.
|
||||
*/
|
||||
void *getImpl() { return pimpl()->impl(); }
|
||||
template <typename U> U &getImpl() { pimpl()->assertType(typeid(std::decay_t<U>)); return *static_cast<U*>(pimpl()->impl()); }
|
||||
|
||||
private:
|
||||
class PimplBase
|
||||
@@ -408,6 +408,7 @@ namespace BlackMisc
|
||||
virtual void operator +=(difference_type) = 0;
|
||||
virtual bool operator ==(const PimplBase &) const = 0;
|
||||
virtual void *impl() = 0;
|
||||
virtual void assertType(std::type_index) const = 0;
|
||||
};
|
||||
|
||||
template <class I> class Pimpl : public PimplBase
|
||||
@@ -422,6 +423,7 @@ namespace BlackMisc
|
||||
virtual void operator +=(difference_type n) override { std::advance(m_impl, n); }
|
||||
virtual bool operator ==(const PimplBase &other) const override { return m_impl == static_cast<const Pimpl&>(other).m_impl; }
|
||||
virtual void *impl() override { return &m_impl; }
|
||||
virtual void assertType(std::type_index ti) const override { Q_ASSERT(ti == typeid(I)); Q_UNUSED(ti); }
|
||||
private:
|
||||
I m_impl;
|
||||
};
|
||||
@@ -586,9 +588,8 @@ namespace BlackMisc
|
||||
/*!
|
||||
* \brief Return opaque pointer to underlying implementation iterator object.
|
||||
* \pre The iterator must have been initialized.
|
||||
* \todo Returning by void* is rotten, but GCC gives a very cryptic error if I make it a function template with a cast inside.
|
||||
*/
|
||||
void *getImpl() { return pimpl()->impl(); }
|
||||
template <typename U> U &getImpl() { pimpl()->assertType(typeid(std::decay_t<U>)); return *static_cast<U*>(pimpl()->impl()); }
|
||||
|
||||
private:
|
||||
class PimplBase
|
||||
@@ -608,6 +609,7 @@ namespace BlackMisc
|
||||
virtual bool operator <=(const PimplBase &) const = 0;
|
||||
virtual bool operator >=(const PimplBase &) const = 0;
|
||||
virtual void *impl() = 0;
|
||||
virtual void assertType(std::type_index) const = 0;
|
||||
};
|
||||
|
||||
template <class I> class Pimpl : public PimplBase
|
||||
@@ -629,6 +631,7 @@ namespace BlackMisc
|
||||
virtual bool operator <=(const PimplBase &other) const override { return m_impl <= static_cast<const Pimpl&>(other).m_impl; }
|
||||
virtual bool operator >=(const PimplBase &other) const override { return m_impl >= static_cast<const Pimpl&>(other).m_impl; }
|
||||
virtual void *impl() override { return &m_impl; }
|
||||
virtual void assertType(std::type_index ti) const override { Q_ASSERT(ti == typeid(I)); Q_UNUSED(ti); }
|
||||
private:
|
||||
I m_impl;
|
||||
};
|
||||
@@ -805,9 +808,8 @@ namespace BlackMisc
|
||||
/*!
|
||||
* \brief Return opaque pointer to underlying implementation iterator object.
|
||||
* \pre The iterator must have been initialized.
|
||||
* \todo Returning by void* is rotten, but GCC gives a very cryptic error if I make it a function template with a cast inside.
|
||||
*/
|
||||
void *getImpl() { return pimpl()->impl(); }
|
||||
template <typename U> U &getImpl() { pimpl()->assertType(typeid(std::decay_t<U>)); return *static_cast<U*>(pimpl()->impl()); }
|
||||
|
||||
private:
|
||||
class PimplBase
|
||||
@@ -828,6 +830,7 @@ namespace BlackMisc
|
||||
virtual bool operator <=(const PimplBase &) const = 0;
|
||||
virtual bool operator >=(const PimplBase &) const = 0;
|
||||
virtual void *impl() = 0;
|
||||
virtual void assertType(std::type_index) const = 0;
|
||||
};
|
||||
|
||||
template <class I> class Pimpl : public PimplBase
|
||||
@@ -850,6 +853,7 @@ namespace BlackMisc
|
||||
virtual bool operator <=(const PimplBase &other) const override { return m_impl <= static_cast<const Pimpl&>(other).m_impl; }
|
||||
virtual bool operator >=(const PimplBase &other) const override { return m_impl >= static_cast<const Pimpl&>(other).m_impl; }
|
||||
virtual void *impl() override { return &m_impl; }
|
||||
virtual void assertType(std::type_index ti) const override { Q_ASSERT(ti == typeid(I)); Q_UNUSED(ti); }
|
||||
private:
|
||||
I m_impl;
|
||||
};
|
||||
|
||||
@@ -64,9 +64,8 @@ namespace BlackMisc
|
||||
};
|
||||
} // namespace
|
||||
|
||||
//! \todo remove flags when gcc 4.7 streaming issue is resolved
|
||||
BLACK_DECLARE_TUPLE_CONVERSION(BlackMisc::CPixmap, (
|
||||
attr(o.m_array, flags<DisabledForJson>())
|
||||
attr(o.m_array)
|
||||
))
|
||||
Q_DECLARE_METATYPE(BlackMisc::CPixmap)
|
||||
|
||||
|
||||
@@ -25,17 +25,6 @@
|
||||
|
||||
namespace BlackMisc
|
||||
{
|
||||
namespace Private
|
||||
{
|
||||
// Trait to exclude std::initializer_list from the overload set of CRange conversion operators using SFINAE.
|
||||
// Needed to workaround a bug in MSVC whereby it considers the copy constructor and initializer list constructor
|
||||
// of a container to be ambiguous when converting from a CRange.
|
||||
//! \private
|
||||
template <class T> struct is_initializer_list : public std::false_type {};
|
||||
//! \private
|
||||
template <class T> struct is_initializer_list<std::initializer_list<T>> : public std::true_type {};
|
||||
}
|
||||
|
||||
template <class> class CRange;
|
||||
|
||||
/*!
|
||||
@@ -201,8 +190,7 @@ namespace BlackMisc
|
||||
//! @}
|
||||
|
||||
//! Implicit conversion to any container of value_type which supports push_back. This will copy elements.
|
||||
template <class T, class = typename std::enable_if<! Private::is_initializer_list<T>::value &&
|
||||
std::is_convertible<value_type, typename T::value_type>::value>::type>
|
||||
template <class T, class = std::enable_if_t<std::is_convertible<value_type, typename T::value_type>::value>>
|
||||
operator T() const
|
||||
{
|
||||
T container;
|
||||
|
||||
@@ -693,12 +693,12 @@ namespace BlackMisc
|
||||
size_type size() const override { return m_impl.size(); }
|
||||
bool empty() const override { return m_impl.empty(); }
|
||||
void clear() override { m_impl.clear(); }
|
||||
iterator insert(iterator pos, const T &value) override { return iterator::fromImpl(m_impl.insert(*static_cast<const typename C::iterator *>(pos.getImpl()), value)); }
|
||||
iterator insert(iterator pos, const T &value) override { return iterator::fromImpl(m_impl.insert(pos.template getImpl<const typename C::iterator>(), value)); }
|
||||
void push_back(const T &value) override { m_impl.push_back(value); }
|
||||
void push_back(T &&value) override { m_impl.push_back(std::move(value)); }
|
||||
void pop_back() override { m_impl.pop_back(); }
|
||||
iterator erase(iterator pos) override { return iterator::fromImpl(m_impl.erase(*static_cast<const typename C::iterator *>(pos.getImpl()))); }
|
||||
iterator erase(iterator it1, iterator it2) override { return iterator::fromImpl(m_impl.erase(*static_cast<const typename C::iterator *>(it1.getImpl()), *static_cast<const typename C::iterator *>(it2.getImpl()))); }
|
||||
iterator erase(iterator pos) override { return iterator::fromImpl(m_impl.erase(pos.template getImpl<const typename C::iterator>())); }
|
||||
iterator erase(iterator it1, iterator it2) override { return iterator::fromImpl(m_impl.erase(it1.template getImpl<const typename C::iterator>(), it2.template getImpl<const typename C::iterator>())); }
|
||||
void *impl() override { return &m_impl; }
|
||||
private:
|
||||
C m_impl;
|
||||
|
||||
@@ -225,13 +225,12 @@ namespace BlackMisc
|
||||
* \param owner Will be the parent of the new thread (the worker has no parent).
|
||||
* \param name A name for the task, which will be used to create a name for the thread.
|
||||
* \param task A function object which will be run by the worker in its thread.
|
||||
* \todo An MSVC bug prevents perfect-forwarding of task.
|
||||
*/
|
||||
template <typename F>
|
||||
static CWorker *fromTask(QObject *owner, const QString &name, F task)
|
||||
static CWorker *fromTask(QObject *owner, const QString &name, F &&task)
|
||||
{
|
||||
int typeId = qMetaTypeId<typename std::decay<decltype(task())>::type>();
|
||||
return fromTaskImpl(owner, name, typeId, [task]() { return CVariant::fromResultOf(task); });
|
||||
int typeId = qMetaTypeId<std::decay_t<decltype(std::forward<F>(task)())>>();
|
||||
return fromTaskImpl(owner, name, typeId, [task = std::forward<F>(task)]() { return CVariant::fromResultOf(std::move(task)); });
|
||||
}
|
||||
|
||||
//! Connects to a functor to which will be passed the result when the task is finished.
|
||||
|
||||
@@ -28,11 +28,7 @@ namespace XBus
|
||||
struct CMessage
|
||||
{
|
||||
//! Constructor.
|
||||
CMessage(const std::string &text, float r, float g, float b) : m_text(text)
|
||||
{
|
||||
// MSVC initializer list bug
|
||||
std::tie(m_rgb[0], m_rgb[1], m_rgb[2]) = std::tie(r, g, b);
|
||||
}
|
||||
CMessage(const std::string &text, float r, float g, float b) : m_text(text), m_rgb{{ r, g, b }} {}
|
||||
|
||||
//! Text.
|
||||
std::string m_text;
|
||||
|
||||
Reference in New Issue
Block a user