registry.hh
Go to the documentation of this file.
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 


typelib
Author(s): Sylvain Joyeux/sylvain.joyeux@m4x.org
autogenerated on Mon Oct 6 2014 03:17:12