34#ifndef DATAQUAY_CONTAINER_BUILDER_H
35#define DATAQUAY_CONTAINER_BUILDER_H
94 template <
typename T,
typename Container>
97 registerContainerExtractor<T, Container>
98 (typeName, containerName, kind);
108 return m_containerExtractors.contains(containerName);
118 return m_containerExtractors.contains(containerName);
129 return m_containerExtractors[containerName]->getTypeName();
140 return m_containerExtractors[containerName]->getKind();
150 return m_containerExtractors[containerName]->extract(v);
161 return m_containerExtractors[containerName]->inject(vl);
169 ~ContainerBuilder() {
170 for (ContainerExtractorMap::iterator i = m_containerExtractors.begin();
171 i != m_containerExtractors.end(); ++i) {
176 template <
typename T,
typename Container>
178 registerContainerExtractor(QString typeName, QString containerName,
180 m_containerExtractors[containerName] =
181 new ContainerExtractor<T, Container>(typeName, kind);
184 struct ContainerExtractorBase {
185 virtual ~ContainerExtractorBase() { }
186 virtual QVariantList extract(
const QVariant &v) = 0;
187 virtual QVariant inject(
const QVariantList &) = 0;
188 virtual QString getTypeName()
const = 0;
192 template <
typename T,
typename Container>
193 struct ContainerExtractor :
public ContainerExtractorBase
196 m_typeName(typeName), m_kind(kind) { }
198 virtual QVariantList extract(
const QVariant &v) {
199 Container tl = v.value<Container>();
201 foreach (
const T &t, tl) vl << QVariant::fromValue<T>(t);
204 virtual QVariant inject(
const QVariantList &vl) {
206 foreach (
const QVariant &v, vl) tl << v.value<T>();
207 return QVariant::fromValue<Container>(tl);
209 virtual QString getTypeName()
const {
220 typedef QHash<QString, ContainerExtractorBase *> ContainerExtractorMap;
221 ContainerExtractorMap m_containerExtractors;
ContainerBuilder is a utility class which assists with storage of arbitrary container objects into va...
bool canInjectContainer(QString containerName)
Return true if the container named containerName can be injected into a variant.
QVariantList extractContainer(QString containerName, const QVariant &v)
Extract the named container type from the given variant object (which must hold that container type) ...
ContainerKind
ContainerKind describes the sort of behaviour a container displays with regard to ordering and struct...
QString getTypeNameForContainer(QString containerName)
Return the typeName that is associated with the given containerName.
ContainerKind getContainerKind(QString containerName)
Return the kind of the container with the given containerName.
bool canExtractContainer(QString containerName)
Return true if the container named containerName can be extracted from a variant.
static ContainerBuilder * getInstance()
Retrieve the single global instance of ContainerBuilder.
void registerContainer(QString typeName, QString containerName, ContainerKind kind)
Register Container as a container of kind ContainerKind holding type T.
QVariant injectContainer(QString containerName, const QVariantList &vl)
Inject the named container type into a new variant object.