You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
6.4 KiB
166 lines
6.4 KiB
/***************************************************************************
|
|
copyright : (C) 2006 by David Nolden
|
|
email : david.nolden.tdevelop@art-master.de
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
#ifndef SIMPLETYPENAMESPACE_H
|
|
#define SIMPLETYPENAMESPACE_H
|
|
|
|
#include<hashedstring.h>
|
|
#include "simpletype.h"
|
|
#include "includefiles.h"
|
|
#include <set>
|
|
#include <ext/hash_map>
|
|
#include <list>
|
|
|
|
class SimpleTypeNamespace : public SimpleTypeImpl {
|
|
public:
|
|
|
|
struct Import {
|
|
Import( const TypeDesc& _import, const TypePointer& persp ) : import( _import ), perspective( persp ) {}
|
|
|
|
Import( const IncludeFiles& _files, const TypeDesc& _import, const TypePointer& persp ) : files( _files ), import( _import ), perspective( persp ) {}
|
|
|
|
///Does not respect the include-file-list, only the import-name is compared
|
|
bool operator < ( const Import& rhs ) const {
|
|
return import.name() < rhs.import.name();
|
|
}
|
|
|
|
///Does not respect the include-file-list, only the import-name is compared
|
|
bool operator == ( const Import& rhs ) const {
|
|
return import.name() == rhs.import.name();
|
|
}
|
|
|
|
IncludeFiles files;
|
|
TypeDesc import;
|
|
TypePointer perspective; //From where the import should be searched
|
|
/*
|
|
bool operator < ( const Alias& rhs ) const {
|
|
if( alias < rhs.alias ) return true;
|
|
return false;
|
|
}
|
|
|
|
bool operator == ( const Alias& rhs ) const {
|
|
return alias == rhs.alias && files == rhs.files;
|
|
}*/
|
|
|
|
};
|
|
|
|
//First.first is the desc(including include-file-information for searching), first.second is the set of include-files that activate this import, second is the perspective in which to search
|
|
typedef std::pair<std::pair<TypeDesc, IncludeFiles>, TypePointer> SlaveDesc;
|
|
typedef std::list<SlaveDesc> SlaveList;
|
|
//Maps IDs to slaves
|
|
typedef std::map<size_t, SlaveDesc> SlaveMap;
|
|
|
|
typedef std::multiset<Import> ImportList;
|
|
|
|
SimpleTypeNamespace( const TQStringList& fakeScope, const TQStringList& realScope );
|
|
|
|
SimpleTypeNamespace( const TQStringList& fakeScope );
|
|
|
|
SimpleTypeNamespace( SimpleTypeNamespace* ns );
|
|
|
|
bool isANamespace( SimpleTypeImpl* t ) {
|
|
return dynamic_cast<SimpleTypeNamespace*>( t ) != 0;
|
|
}
|
|
|
|
virtual TypePointer clone();
|
|
|
|
///Returns a list of all slave-namespaces that have an effect with the given set of include-files. Some of the returned type-descs may be unresolved, in case they could not be resolved.
|
|
SlaveList getSlaves( const IncludeFiles& includeFiles );
|
|
|
|
/**empty name means an import.
|
|
* @param files Set of files that must be included for this alias-map to be active. If the set is empty, the alias will be used globally.
|
|
* @param alias The type to import. May contain the include-file-set to search with.
|
|
* @param perspective The point from which to search for the item on demand
|
|
*/
|
|
void addAliasMap( const TypeDesc& name, const TypeDesc& alias , const IncludeFiles& files = IncludeFiles(), bool recurse = true, bool symmetric = false, const TypePointer& perspective = TypePointer() );
|
|
|
|
/**Takes a map of multiple aliases in form "A=B;C=D;....;" similar to the C++ "namespace A=B;" statement
|
|
* @param files Set of files that must be included for this alias-map to be active. If the set is empty, the alias will be used globally.
|
|
*/
|
|
void addAliases( TQString map, const IncludeFiles& files = IncludeFiles() );
|
|
|
|
private:
|
|
SlaveMap m_activeSlaves;
|
|
size_t m_currentSlaveId;
|
|
HashedStringSetGroup m_activeSlaveGroups;
|
|
typedef TQMap<TQString, ImportList> AliasMap;
|
|
AliasMap m_aliases;
|
|
|
|
//Inserts all aliases necessary fo handling a request using the given IncludeFiles
|
|
std::set<size_t> updateAliases( const IncludeFiles& files/*, bool isRecursion = false */);
|
|
|
|
// LocateResult locateSlave( const SlaveList::const_iterator& it, const IncludeFiles& includeFiles );
|
|
|
|
void addImport( const TypeDesc& import, const IncludeFiles& files = IncludeFiles(), TypePointer perspective = TypePointer() );
|
|
|
|
friend class NamespaceBuildInfo;
|
|
|
|
struct NamespaceBuildInfo : public TypeBuildInfo {
|
|
TQStringList m_fakeScope;
|
|
ImportList m_imports;
|
|
TypePointer m_built;
|
|
|
|
|
|
NamespaceBuildInfo( TQStringList fakeScope, const ImportList& imports ) {
|
|
m_fakeScope = fakeScope;
|
|
m_imports = imports;
|
|
}
|
|
|
|
virtual TypePointer build();
|
|
};
|
|
|
|
explicit SimpleTypeNamespace( const SimpleTypeNamespace& rhs ) {}
|
|
|
|
protected:
|
|
|
|
//void updateAliases( const HashedStringSet& files );
|
|
|
|
SimpleTypeImpl::MemberInfo findMember( TypeDesc name, MemberInfo::MemberType type, std::set<HashedString>& ignore );
|
|
|
|
virtual void breakReferences();
|
|
|
|
virtual bool hasNode() const;
|
|
|
|
virtual bool isNamespace() const {
|
|
return true;
|
|
}
|
|
|
|
virtual void invalidatePrimaryCache( bool onlyNegative = false );
|
|
|
|
virtual MemberInfo findMember( TypeDesc name, MemberInfo::MemberType type = MemberInfo::AllTypes );
|
|
|
|
virtual TQValueList<TypePointer> getMemberClasses( const TypeDesc& name ) ;
|
|
|
|
private:
|
|
struct HashedStringHasher {
|
|
size_t operator () ( const HashedStringSet& s ) const {
|
|
return s.hash();
|
|
}
|
|
};
|
|
//Maps from HashedStringSet to the count of slaves when the item was cached, and the SlaveList
|
|
// typedef __gnu_cxx::hash_map<HashedStringSet, std::pair<size_t, SlaveList>, HashedStringHasher> SlavesCache;
|
|
//SlavesCache m_slavesCache;
|
|
TQValueList<TypePointer> getMemberClasses( const TypeDesc& name, std::set<HashedString>& ignore ) ;
|
|
|
|
MemberInfo setupMemberInfo( const TQStringList& subName, const ImportList& imports );
|
|
|
|
//TypePointer locateNamespace( const TypeDesc& alias );
|
|
|
|
//void recurseAliasMap() ;
|
|
};
|
|
|
|
|
|
#endif
|
|
// kate: indent-mode csands; tab-width 4;
|
|
|