21 #ifndef GRANTLEE_TYPEACCESSOR_H
22 #define GRANTLEE_TYPEACCESSOR_H
24 #include "containeraccessor.h"
25 #include "grantlee_core_export.h"
27 #include <QtCore/QLinkedList>
28 #include <QtCore/QSet>
29 #include <QtCore/QSharedPointer>
30 #include <QtCore/QVariant>
45 static QVariant lookUp(
const T
object,
const QString &property );
49 struct TypeAccessor<T*>
51 static QVariant lookUp(
const T *
const object,
const QString &property );
55 struct TypeAccessor<T&>
57 static QVariant lookUp(
const T &
object,
const QString &property );
64 template<
typename Container>
65 struct SequentialContainerLookup
67 static QVariant doLookUp(
const Container &container,
const QString &property )
69 if ( property == QLatin1String(
"size" ) || property == QLatin1String(
"count" ) ) {
70 return QVariant::fromValue<int>( std::distance( container.begin(), container.end() ) );
74 const size_t listIndex = ( size_t )property.toInt( &ok );
76 if ( !ok || listIndex >= (
size_t )container.size() ) {
80 return QVariant::fromValue( container[listIndex] );
84 template<
typename Container>
85 QVariant doAssociativeContainerLookup(
const Container &
object,
const QString &property )
88 typename Container::const_iterator it = Finder<Container>::find(
object, property );
89 if ( it !=
object.end() )
90 return QVariant::fromValue( MappedValueGetter<Container>::get( it ) );
92 if ( property == QLatin1String(
"size" ) || property == QLatin1String(
"count" ) ) {
93 return QVariant::fromValue<int>( std::distance(
object.begin(),
object.end() ) );
95 if ( property == QLatin1String(
"items" ) ) {
96 typename Container::const_iterator it =
object.begin();
97 const typename Container::const_iterator end =
object.end();
99 for ( ; it != end; ++it ) {
101 nested.push_back( QVariant::fromValue( KeyGetter<Container>::get( it ) ) );
102 nested.push_back( QVariant::fromValue( MappedValueGetter<Container>::get( it ) ) );
103 list.push_back( nested );
108 if ( property == QLatin1String(
"keys" ) ) {
109 typename Container::const_iterator it =
object.begin();
110 const typename Container::const_iterator end =
object.end();
112 for ( ; it != end; ++it ) {
113 list.push_back( QVariant::fromValue( KeyGetter<Container>::get( it ) ) );
118 if ( property == QLatin1String(
"values" ) ) {
119 typename Container::const_iterator it =
object.begin();
120 const typename Container::const_iterator end =
object.end();
122 for ( ; it != end; ++it ) {
123 list.push_back( QVariant::fromValue( MappedValueGetter<Container>::get( it ) ) );
135 QVariant GRANTLEE_CORE_EXPORT TypeAccessor<QObject*>::lookUp(
const QObject *
const object,
const QString &property );
140 QVariant GRANTLEE_CORE_EXPORT doQobjectLookUp(
const QObject *
const object,
const QString& property );
151 #define GRANTLEE_DISABLE_RANDOM_ACCESS(Container) \
152 namespace Grantlee { \
153 template<typename T> \
154 struct TypeAccessor<Container<T>&> \
156 static QVariant lookUp( const Container<T> &c, const QString &p) \
158 if ( p == QLatin1String( "size" ) \
159 || p == QLatin1String( "count" ) ) { \
160 return QVariant::fromValue<int>( \
161 std::distance( c.begin(), c.end() ) ); \
173 #define GRANTLEE_SEQUENTIAL_TYPE_CONTAINER_ACCESSOR(Container) \
174 namespace Grantlee { \
175 template<typename T> \
176 struct TypeAccessor<Container<T>&> \
178 static QVariant lookUp( const Container<T> &c, const QString &property ) \
180 return SequentialContainerLookup<Container<T> >::doLookUp( c, property ); \
192 #define GRANTLEE_ASSOCIATIVE_TYPE_CONTAINER_ACCESSOR(Container) \
193 namespace Grantlee { \
194 template<typename T, typename U> \
195 struct TypeAccessor<Container<T, U>&> \
197 static QVariant lookUp( const Container<T, U> &c, const QString &property ) \
199 return doAssociativeContainerLookup( c, property ); \
209 #define GRANTLEE_SMART_PTR_ACCESSOR(SmartPointer) \
210 namespace Grantlee { \
211 template<typename T> \
212 struct TypeAccessor<SmartPointer<T>&> \
214 static QVariant lookUp( const SmartPointer<T> &object, const QString &property ) \
216 return doQobjectLookUp( object.operator->(), property ); \
#define GRANTLEE_ASSOCIATIVE_TYPE_CONTAINER_ACCESSOR(Container)
#define GRANTLEE_DISABLE_RANDOM_ACCESS(Container)
#define GRANTLEE_SEQUENTIAL_TYPE_CONTAINER_ACCESSOR(Container)
#define GRANTLEE_SMART_PTR_ACCESSOR(SmartPointer)