File indexing completed on 2024-05-12 04:37:59

0001 /*
0002     SPDX-FileCopyrightText: 2008 David Nolden <david.nolden.kdevelop@art-master.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 #include "duchainregister.h"
0008 #include "duchainbase.h"
0009 
0010 #include <QDebug>
0011 
0012 #define ENSURE_VALID_CLASSID(id) \
0013     qFatal("Invalid class id: %i", id);
0014 
0015 namespace KDevelop {
0016 DUChainItemSystem::~DUChainItemSystem()
0017 {
0018     qDeleteAll(m_factories);
0019 }
0020 
0021 DUChainBase* DUChainItemSystem::create(DUChainBaseData* data) const
0022 {
0023     if (uint(m_factories.size()) <= data->classId || m_factories[data->classId] == nullptr)
0024         return nullptr;
0025     return m_factories[data->classId]->create(data);
0026 }
0027 
0028 DUChainBaseData* DUChainItemSystem::cloneData(const DUChainBaseData& data) const
0029 {
0030     if (uint(m_factories.size()) <= data.classId || m_factories[data.classId] == nullptr) {
0031         ENSURE_VALID_CLASSID(data.classId)
0032         return nullptr;
0033     }
0034     return m_factories[data.classId]->cloneData(data);
0035 }
0036 
0037 void DUChainItemSystem::callDestructor(DUChainBaseData* data) const
0038 {
0039     if (uint(m_factories.size()) <= data->classId || m_factories[data->classId] == nullptr)
0040         return;
0041     m_factories[data->classId]->callDestructor(data);
0042 }
0043 
0044 void DUChainItemSystem::freeDynamicData(KDevelop::DUChainBaseData* data) const
0045 {
0046     if (uint(m_factories.size()) <= data->classId || m_factories[data->classId] == nullptr)
0047         return;
0048     m_factories[data->classId]->freeDynamicData(data);
0049 }
0050 
0051 void DUChainItemSystem::deleteDynamicData(DUChainBaseData* data) const
0052 {
0053     if (uint(m_factories.size()) <= data->classId || m_factories[data->classId] == nullptr)
0054         return;
0055     m_factories[data->classId]->deleteDynamicData(data);
0056 }
0057 
0058 uint DUChainItemSystem::dynamicSize(const DUChainBaseData& data) const
0059 {
0060     if (uint(m_factories.size()) <= data.classId || m_factories[data.classId] == nullptr)
0061         return 0;
0062     return m_factories[data.classId]->dynamicSize(data);
0063 }
0064 
0065 uint DUChainItemSystem::dataClassSize(const DUChainBaseData& data) const
0066 {
0067     if (uint(m_dataClassSizes.size()) <= data.classId || m_dataClassSizes[data.classId] == 0)
0068         return 0;
0069     return m_dataClassSizes[data.classId];
0070 }
0071 
0072 void DUChainItemSystem::copy(const DUChainBaseData& from, DUChainBaseData& to, bool constant) const
0073 {
0074     if (uint(m_factories.size()) <= from.classId || m_factories[from.classId] == nullptr) {
0075         ENSURE_VALID_CLASSID(from.classId)
0076         return;
0077     }
0078     m_factories[from.classId]->copy(from, to, constant);
0079 }
0080 
0081 DUChainItemSystem& DUChainItemSystem::self()
0082 {
0083     static DUChainItemSystem system;
0084     return system;
0085 }
0086 }