Metatype: Specialize IteratorOwner for vector<bool>

Change-Id: I542af3a77b0a139e137a5a736b74042a8c25eb95
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
This commit is contained in:
Stephen Kelly 2014-04-29 15:31:51 +02:00 committed by Ismo Haataja
parent 4b8a81f525
commit 4e7baaaa91
3 changed files with 46 additions and 3 deletions

View File

@ -2405,4 +2405,9 @@ const QMetaObject *metaObjectForQWidget()
} }
} }
namespace QtMetaTypePrivate {
bool VectorBoolElements::true_element = true;
bool VectorBoolElements::false_element = false;
}
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -782,7 +782,7 @@ private:
}; };
template<typename const_iterator> template<typename const_iterator>
struct IteratorOwner struct IteratorOwnerCommon
{ {
static void assign(void **ptr, const_iterator iterator) static void assign(void **ptr, const_iterator iterator)
{ {
@ -804,6 +804,15 @@ struct IteratorOwner
delete static_cast<const_iterator*>(*ptr); delete static_cast<const_iterator*>(*ptr);
} }
static bool equal(void * const *it, void * const *other)
{
return *static_cast<const_iterator*>(*it) == *static_cast<const_iterator*>(*other);
}
};
template<typename const_iterator>
struct IteratorOwner : IteratorOwnerCommon<const_iterator>
{
static const void *getData(void * const *iterator) static const void *getData(void * const *iterator)
{ {
return &**static_cast<const_iterator*>(*iterator); return &**static_cast<const_iterator*>(*iterator);
@ -813,12 +822,30 @@ struct IteratorOwner
{ {
return &*it; return &*it;
} }
};
static bool equal(void * const *it, void * const *other) struct Q_CORE_EXPORT VectorBoolElements
{
static bool true_element;
static bool false_element;
};
template<>
struct IteratorOwner<std::vector<bool>::const_iterator> : IteratorOwnerCommon<std::vector<bool>::const_iterator>
{
public:
static const void *getData(void * const *iterator)
{ {
return *static_cast<const_iterator*>(*it) == *static_cast<const_iterator*>(*other); return **static_cast<std::vector<bool>::const_iterator*>(*iterator) ?
&VectorBoolElements::true_element : &VectorBoolElements::false_element;
}
static const void *getData(const std::vector<bool>::const_iterator& it)
{
return *it ? &VectorBoolElements::true_element : &VectorBoolElements::false_element;
} }
}; };
template<typename value_type> template<typename value_type>
struct IteratorOwner<const value_type*> struct IteratorOwner<const value_type*>
{ {

View File

@ -1359,6 +1359,17 @@ void tst_QMetaType::automaticTemplateRegistration()
TEST_SEQUENTIAL_CONTAINER(std::vector, int) TEST_SEQUENTIAL_CONTAINER(std::vector, int)
TEST_SEQUENTIAL_CONTAINER(std::list, int) TEST_SEQUENTIAL_CONTAINER(std::list, int)
{
std::vector<bool> vecbool;
vecbool.push_back(true);
vecbool.push_back(false);
vecbool.push_back(true);
QVERIFY(QVariant::fromValue(vecbool).value<std::vector<bool> >().front() == true);
QVector<std::vector<bool> > vectorList;
vectorList << vecbool;
QVERIFY(QVariant::fromValue(vectorList).value<QVector<std::vector<bool> > >().first().front() == true);
}
{ {
QList<QByteArray> bytearrayList; QList<QByteArray> bytearrayList;
bytearrayList << QByteArray("foo"); bytearrayList << QByteArray("foo");