ACF $AcfVersion:0$
TAttributeStaticInfo.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ACF-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QMap>
7
8// ACF includes
9#include <istd/CClassInfo.h>
12
13
14namespace icomp
15{
16
17
18template <class Attribute>
20{
21public:
24 const QByteArray& id,
25 const QString& description,
26 const Attribute* defaultValuePtr,
27 int flags,
28 const istd::CClassInfo& relatedInterfaceInfo);
29
30 // reimplemented (icomp::IRealAttributeStaticInfo)
31 virtual const QByteArray& GetAttributeId() const override;
32 virtual void AddRelatedMetaId(int metaGroupId, const QByteArray& id, int flags) override;
33
34 // reimplemented (icomp::IAttributeStaticInfo)
35 virtual IElementStaticInfo::Ids GetRelatedMetaIds(int metaGroupId, int flags, int flagsMask) const override;
36
37 // reimplemented (iattr::IAttributeMetaInfo)
38 virtual QString GetAttributeDescription() const override;
39 virtual const iser::IObject* GetAttributeDefaultValue() const override;
40 virtual QByteArray GetAttributeTypeId() const override;
41 virtual int GetAttributeFlags() const override;
42
43private:
44 QByteArray m_id;
45 QString m_description;
46 const Attribute* m_defaultValuePtr;
47 int m_attributeFlags;
48
49 typedef QMap<QByteArray, int> IdsToFlagsMap;
50 typedef QMap<int, IdsToFlagsMap> RelatedIdsMap;
51 RelatedIdsMap m_relatedInterfacesMap;
52};
53
54
55// public methods
56
57template <class Attribute>
60 const QByteArray& id,
61 const QString& description,
62 const Attribute* defaultValuePtr,
63 int flags,
64 const istd::CClassInfo& relatedInterfaceInfo)
65: m_id(id),
66 m_description(description),
67 m_defaultValuePtr(defaultValuePtr),
68 m_attributeFlags(flags)
69{
70 if (relatedInterfaceInfo.IsValid() && !relatedInterfaceInfo.IsVoid()){
71 m_relatedInterfacesMap[IComponentStaticInfo::MGI_INTERFACES][relatedInterfaceInfo.GetName()] = flags;
72 }
73
74 staticInfo.RegisterAttributeInfo(id, this);
75}
76
77
78// reimplemented (icomp::IRealAttributeStaticInfo)
79
80template <class Attribute>
82{
83 return m_id;
84}
85
86
87template <class Attribute>
88void TAttributeStaticInfo<Attribute>::AddRelatedMetaId(int metaGroupId, const QByteArray& id, int flags)
89{
90 IdsToFlagsMap& groupMap = m_relatedInterfacesMap[metaGroupId];
91
92 IdsToFlagsMap::iterator foundIter = groupMap.find(id);
93 if (foundIter != groupMap.end()){
94 Q_ASSERT((flags & (AF_REFERENCE | AF_FACTORY)) == (foundIter.value() & (AF_REFERENCE | AF_FACTORY))); // factory can be combined with factory only and reference with reference
95
96 foundIter.value() |= flags & AF_OBLIGATORY; // is obligatory if once obligatory registred is
97 foundIter.value() &= flags | ~AF_NULLABLE; // is nullable if always nullable registred is
98 }
99 else{
100 groupMap[id] = flags;
101 }
102
103 if (metaGroupId == IComponentStaticInfo::MGI_INTERFACES){
104 m_attributeFlags |= flags & AF_OBLIGATORY; // attribute is obligatory if one of declared interfaces obligatory is
105 m_attributeFlags &= flags | ~AF_NULLABLE; // attribute is nullable if all of declared interfaces nullable are
106 }
107}
108
109
110// reimplemented (iattr::IAttributeMetaInfo)
111
112template <class Attribute>
114{
116
117 RelatedIdsMap::ConstIterator foundGroupIter = m_relatedInterfacesMap.constFind(metaGroupId);
118 if (foundGroupIter != m_relatedInterfacesMap.constEnd()){
119 const IdsToFlagsMap& groupMap = foundGroupIter.value();
120
121 for ( IdsToFlagsMap::const_iterator iter = groupMap.begin();
122 iter != groupMap.end();
123 ++iter){
124 const QByteArray& id = iter.key();
125 int idFlags = iter.value();
126
127 if (((idFlags & flagsMask) == flags)){
128 retVal.insert(id);
129 }
130 }
131 }
132
133 return retVal;
134}
135
136
137// reimplemented (icomp::IAttributeStaticInfo)
138
139template <class Attribute>
141{
142 return m_description;
143}
144
145
146template <class Attribute>
148{
149 return m_defaultValuePtr;
150}
151
152
153template <class Attribute>
155{
156 return Attribute::GetTypeName();
157}
158
159
160template <class Attribute>
162{
163 return m_attributeFlags;
164}
165
166
167} // namespace icomp
168
169
Standard implementation of static info for base component classes.
virtual void RegisterAttributeInfo(const QByteArray &attributeId, const IAttributeStaticInfo *attributeInfoPtr)
Register static attribute info.
@ MGI_INTERFACES
ID of meta group storing list of supported interfaces.
Interface adding to attribute static info functionality existing only for real attributes.
virtual const QByteArray & GetAttributeId() const override
Get ID of this attribute.
virtual QByteArray GetAttributeTypeId() const override
Return attribute type ID.
virtual int GetAttributeFlags() const override
Get flags of this attribute.
virtual void AddRelatedMetaId(int metaGroupId, const QByteArray &id, int flags) override
Add related interface to this attribute info.
virtual const iser::IObject * GetAttributeDefaultValue() const override
Get default attribute value.
virtual IElementStaticInfo::Ids GetRelatedMetaIds(int metaGroupId, int flags, int flagsMask) const override
Get related meta information.
TAttributeStaticInfo(icomp::CBaseComponentStaticInfo &staticInfo, const QByteArray &id, const QString &description, const Attribute *defaultValuePtr, int flags, const istd::CClassInfo &relatedInterfaceInfo)
virtual QString GetAttributeDescription() const override
Get description of this attribute.
Common interface for factorisable model objects.
Definition IObject.h:23
Represents platform independent type info and provide set of static class manipulation functions.
Definition CClassInfo.h:23
const QByteArray & GetName() const
Get undecorated and platform undependent class name.
Definition CClassInfo.h:154
bool IsValid() const
Check if this class info object is valid.
Definition CClassInfo.h:148
bool IsVoid() const
Check if this class information represents void type.
Definition CClassInfo.h:160
Package with interfaces and class used for components concept.