refs #624 Removed many workarounds, no longer needed.

This commit is contained in:
Mathew Sutcliffe
2016-03-20 21:59:20 +00:00
parent 187501bb3c
commit a895cc2c54
15 changed files with 23 additions and 121 deletions

View File

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

View File

@@ -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()); }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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