File indexing completed on 2024-06-16 04:23:17

0001 /*
0002     SPDX-FileCopyrightText: 2009 David Nolden <david.nolden.kdevelop@art-master.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 #ifndef KDEVPLATFORM_UNSURETYPE_H
0008 #define KDEVPLATFORM_UNSURETYPE_H
0009 
0010 #include "abstracttype.h"
0011 #include "typesystemdata.h"
0012 #include "../appendedlist.h"
0013 #include <language/languageexport.h>
0014 
0015 namespace KDevelop {
0016 KDEVPLATFORMLANGUAGE_EXPORT DECLARE_LIST_MEMBER_HASH(UnsureTypeData, m_types, IndexedType)
0017 
0018 struct KDEVPLATFORMLANGUAGE_EXPORT UnsureTypeData
0019     : public AbstractTypeData
0020 {
0021     UnsureTypeData()
0022     {
0023         initializeAppendedLists(m_dynamic);
0024     }
0025 
0026     ~UnsureTypeData()
0027     {
0028         freeAppendedLists();
0029     }
0030 
0031     UnsureTypeData(const UnsureTypeData& rhs) : AbstractTypeData(rhs)
0032     {
0033         initializeAppendedLists(m_dynamic);
0034         copyListsFrom(rhs);
0035     }
0036 
0037     UnsureTypeData& operator=(const UnsureTypeData& rhs) = delete;
0038 
0039     START_APPENDED_LISTS_BASE(UnsureTypeData, AbstractTypeData)
0040     APPENDED_LIST_FIRST(UnsureTypeData, IndexedType, m_types)
0041     END_APPENDED_LISTS(UnsureTypeData, m_types)
0042 };
0043 
0044 class KDEVPLATFORMLANGUAGE_EXPORT UnsureType
0045     : public AbstractType
0046 {
0047 public:
0048     using Ptr = TypePtr<UnsureType>;
0049 
0050     UnsureType(const UnsureType& rhs);
0051     UnsureType();
0052     explicit UnsureType(UnsureTypeData& data);
0053 
0054     UnsureType& operator=(const UnsureType& rhs) = delete;
0055 
0056     KDevelop::AbstractType* clone() const override;
0057     QString toString() const override;
0058     bool equals(const KDevelop::AbstractType* rhs) const override;
0059     bool contains(const KDevelop::AbstractType* type) const override;
0060     uint hash() const override;
0061     KDevelop::AbstractType::WhichType whichType() const override;
0062     void exchangeTypes(KDevelop::TypeExchanger* exchanger) override;
0063 
0064     virtual void addType(const IndexedType& type);
0065     virtual void removeType(const IndexedType& type);
0066 
0067     ///Array of represented types. You can conveniently iterate it using the FOREACH_FUNCTION macro,
0068     ///or just access them using indices
0069     const IndexedType* types() const;
0070     ///Count of types accessible through types()
0071     uint typesSize() const;
0072 
0073     enum {
0074         Identity = 39
0075     };
0076 
0077     using Data = UnsureTypeData;
0078 
0079 protected:
0080     TYPE_DECLARE_DATA(UnsureType)
0081     void accept0(KDevelop::TypeVisitor* v) const override;
0082 };
0083 }
0084 
0085 #endif // KDEVPLATFORM_UNSURETYPE_H