$search
00001 #ifndef TYPELIB_REGISTRY_H 00002 #define TYPELIB_REGISTRY_H 00003 00004 #include "typemodel.hh" 00005 #include <boost/shared_ptr.hpp> 00006 #include <stdexcept> 00007 00008 namespace Typelib 00009 { 00010 class RegistryIterator; 00011 00013 class RegistryException : public std::runtime_error 00014 { 00015 public: 00016 RegistryException(std::string const& what) : std::runtime_error(what) {} 00017 }; 00018 00020 class Undefined : public RegistryException 00021 { 00022 std::string m_name; 00023 00024 public: 00025 Undefined(const std::string& name) 00026 : RegistryException("undefined type '" + name + "'") 00027 , m_name(name) {} 00028 ~Undefined() throw() {} 00029 00030 std::string getName() const { return m_name; } 00031 }; 00032 00035 class AlreadyDefined : public RegistryException 00036 { 00037 std::string m_name; 00038 00039 public: 00040 AlreadyDefined(std::string const& name) 00041 : RegistryException("type " + name + " already defined in registry") 00042 , m_name(name) {} 00043 ~AlreadyDefined() throw() {} 00044 00045 std::string getName() const { return m_name; } 00046 }; 00047 00049 class BadName : public RegistryException 00050 { 00051 const std::string m_name; 00052 00053 public: 00054 BadName(const std::string& name) 00055 : RegistryException(name + " is not a valid type name") 00056 , m_name(name) {} 00057 ~BadName() throw() {} 00058 }; 00059 00063 class DefinitionMismatch : public RegistryException 00064 { 00065 const std::string m_name; 00066 00067 public: 00068 DefinitionMismatch(const std::string& name) 00069 : RegistryException(name + " already defines a type in the registry, but with a different definition") {} 00070 ~DefinitionMismatch() throw() {} 00071 }; 00072 00073 00086 class Registry 00087 { 00088 friend class RegistryIterator; 00089 00090 private: 00091 struct RegistryType 00092 { 00093 Type* type; 00094 bool persistent; 00095 std::string source_id; 00096 }; 00097 typedef std::map 00098 < const std::string 00099 , RegistryType 00100 , bool (*) (const std::string&, const std::string&) 00101 > TypeMap; 00102 00103 typedef std::map<const std::string, RegistryType> NameMap; 00104 00105 TypeMap m_global; 00106 NameMap m_current; 00107 std::string m_namespace; 00108 00109 static bool isPersistent(std::string const& name, Type const& type, std::string const& source_id); 00110 void add(std::string const& name, Type* new_type, bool persistent, std::string const& source_id); 00111 00114 std::set<Type*> reverseDepends(Type const& type); 00115 00119 void updateCurrentNameMap(); 00120 00121 public: 00122 typedef RegistryIterator Iterator; 00123 00124 Registry(); 00125 ~Registry(); 00126 00132 void importNamespace(const std::string& name, bool erase_existing = false); 00133 00137 bool setDefaultNamespace(const std::string& name); 00141 std::string getDefaultNamespace() const; 00142 00151 bool has(const std::string& name, bool build = true) const; 00152 00156 std::string source(Type const* type) const; 00157 00159 Type const* build(const std::string& name); 00160 00165 Type const* get(const std::string& name) const; 00166 00172 RegistryIterator find(std::string const& name) const; 00173 00174 /* Internal version to get a non-const Type object 00175 * 00176 * You should not be using it. This is for internal Typelib use only */ 00177 Type* get_(const std::string& name); 00178 00181 std::set<Type const*> reverseDepends(Type const& type) const; 00182 00189 std::set<Type *> remove(Type const& type); 00190 00191 /* Internal version to get a non-const Type object 00192 * 00193 * You should not be using it. This is for internal Typelib use only */ 00194 Type& get_(Type const& type); 00195 00198 void add(Type* type, std::string const& source_id = ""); 00199 00204 void add(Type* type, bool persistent, std::string const& source_id); 00205 00214 void alias(std::string const& base, std::string const& alias, bool persistent, std::string const& source_id = ""); 00215 00218 void alias(std::string const& base, std::string const& alias, std::string const& source_id = ""); 00219 00222 size_t size() const; 00224 void clear(); 00225 00229 std::string getFullName (const std::string& name) const; 00230 00232 RegistryIterator begin() const; 00234 RegistryIterator end() const; 00239 RegistryIterator begin(std::string const& prefix) const; 00255 RegistryIterator end(std::string const& prefix) const; 00256 00258 static Type const& null(); 00259 00261 void merge(Registry const& registry); 00262 00266 void resize(std::map<std::string, size_t> const& new_sizes); 00267 00270 Registry* minimal(std::string const& name, bool with_aliases = true) const; 00271 00274 Registry* minimal(Registry const& auto_types) const; 00275 00283 bool isSame(Registry const& other) const; 00284 00286 bool isIncluded(Type const& type) const; 00287 00289 std::set<std::string> getAliasesOf(Type const& type) const; 00290 00292 void setSourceID(Type const& type, std::string const& source_id); 00293 00296 void copySourceIDs(Registry const& registry); 00297 00300 void clearAliases(); 00301 00302 public: 00303 enum DumpMode 00304 { 00305 NameOnly = 0, 00306 AllType = 1, 00307 WithSourceId = 2, 00308 RecursiveTypeDump = 4 00309 }; 00310 void dump(std::ostream& stream, int dumpmode = AllType, const std::string& source_filter = "*") const; 00311 }; 00312 } 00313 00314 #endif 00315