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() )
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 ) {
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 ) {
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 ) {
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)
static Container::key_type get(const typename Container::const_iterator it)
#define GRANTLEE_DISABLE_RANDOM_ACCESS(Container)
#define GRANTLEE_SEQUENTIAL_TYPE_CONTAINER_ACCESSOR(Container)
static Container::mapped_type get(const typename Container::const_iterator it)
#define GRANTLEE_SMART_PTR_ACCESSOR(SmartPointer)
The Grantlee namespace holds all public Grantlee API.