language/duchain
duchainbase.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef DUCHAINBASE_H
00021 #define DUCHAINBASE_H
00022
00023 #include "../editor/documentrangeobject.h"
00024 #include "../editor/hashedstring.h"
00025 #include "../languageexport.h"
00026 #include "appendedlist.h"
00027 #include "duchainpointer.h"
00028
00029 namespace KDevelop
00030 {
00031
00032 class DUContext;
00033 class TopDUContext;
00034 class DUChainBase;
00035 class IndexedString;
00036
00038 #define DUCHAIN_DECLARE_DATA(Class) \
00039 inline class Class##Data* d_func_dynamic() { makeDynamic(); return reinterpret_cast<Class##Data *>(d_ptr); } \
00040 inline const class Class##Data* d_func() const { return reinterpret_cast<const Class##Data *>(d_ptr); } \
00041 public: typedef Class ## Data Data; private:
00042
00043 #define DUCHAIN_D(Class) const Class##Data * const d = d_func()
00044 #define DUCHAIN_D_DYNAMIC(Class) Class##Data * const d = d_func_dynamic()
00045
00055 class KDEVPLATFORMLANGUAGE_EXPORT DUChainBaseData : public DocumentRangeObjectData {
00056 public:
00057
00058 DUChainBaseData() : classId(0) {
00059 }
00060 DUChainBaseData(const DUChainBaseData& rhs) : DocumentRangeObjectData(rhs), classId(rhs.classId) {
00061 }
00062
00063 uint classId;
00064
00071 template<class T>
00072 void setClassId(T*) {
00073 classId = T::Identity;
00074 }
00075
00076 uint classSize() const;
00077
00080 void freeDynamicData() {
00081 }
00082
00086 static bool shouldCreateConstantData();
00087 static void setShouldCreateConstantData(bool);
00088 };
00089
00097 class KDEVPLATFORMLANGUAGE_EXPORT DUChainBase : public KDevelop::DocumentRangeObject
00098 {
00099 public:
00106 DUChainBase(const SimpleRange& range);
00108 virtual ~DUChainBase();
00109
00113 virtual TopDUContext* topContext() const;
00114
00119 const KSharedPtr<DUChainPointerData>& weakPointer() const;
00120
00121 virtual IndexedString url() const;
00122
00123 enum {
00124 Identity = 1
00125 };
00126
00128 void makeDynamic();
00129
00130 DUChainBase( DUChainBaseData& dd );
00131
00134 virtual void setData(DocumentRangeObjectData*, bool constructorCalled = true);
00135
00136 protected:
00141 DUChainBase( DUChainBase& rhs );
00142
00150 DUChainBase( DUChainBaseData& dd, const SimpleRange& range );
00151
00153 virtual void rebuildDynamicData(DUContext* parent, uint ownIndex);
00154
00155 void aboutToWriteData();
00156
00157
00158 virtual bool canWriteData() const;
00159 private:
00160
00161 mutable KSharedPtr<DUChainPointerData> m_ptr;
00162 public:
00163 DUCHAIN_DECLARE_DATA(DUChainBase)
00164 };
00165 }
00166
00167 #endif // DUCHAINBASE_H
00168
00169