Make public yp2_filter_struct non-const. If not, the linker symbol
[metaproxy-moved-to-github.git] / src / filter_factory.hpp
index 7ad4e19..c8b2251 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: filter_factory.hpp,v 1.4 2005-10-31 09:40:18 marc Exp $
+/* $Id: filter_factory.hpp,v 1.7 2005-12-10 09:59:10 adam Exp $
    Copyright (c) 2005, Index Data.
 
 %LICENSE%
 #include <string>
 #include <map>
 
-#include "config.hpp"
+#include <boost/noncopyable.hpp>
+#include <boost/scoped_ptr.hpp>
+
 #include "filter.hpp"
 
 
 namespace yp2 {
 
-    namespace filter {
-    
     class FilterFactoryException : public std::runtime_error {
     public:
-        FilterFactoryException(const std::string message)
-            : std::runtime_error("FilterException: " + message){
-        };
+        FilterFactoryException(const std::string message);
     };
+    
+    class FilterFactory : public boost::noncopyable
+    {
+        typedef yp2::filter::Base* (*CreateFilterCallback)();
 
-        class FilterFactory {
-
-        public:
-            typedef yp2::filter::Base* (*CreateFilterCallback)();
-            /// true if registration ok
-
-            FilterFactory(){};
-
-            bool add_creator(std::string fi, CreateFilterCallback cfc);
-            /// true if unregistration ok
-
-            bool drop_creator(std::string fi);
-            
-            /// factory create method
-
-            yp2::filter::Base* create(std::string fi);
-            
-        private:
-            typedef std::map<std::string, CreateFilterCallback> CallbackMap;
-            CallbackMap m_fcm;
+        class Rep;
+    public:
+        /// true if registration ok
+        
+        FilterFactory();
+        ~FilterFactory();
 
-        private:
-            /// disabled because class is singleton
-            FilterFactory(const FilterFactory &);
-            
-            /// disabled because class is singleton
-            FilterFactory& operator=(const FilterFactory &);
-        };
+        bool add_creator(std::string fi, CreateFilterCallback cfc);
         
-    }
-    
-    bool yp2::filter::FilterFactory::add_creator(std::string fi,
-                                    CreateFilterCallback cfc)
-    {
-        return m_fcm.insert(CallbackMap::value_type(fi, cfc)).second;
-    }
-    
-    
-    bool yp2::filter::FilterFactory::drop_creator(std::string fi)
-    {
-        return m_fcm.erase(fi) == 1;
-    }
-    
-    yp2::filter::Base* yp2::filter::FilterFactory::create(std::string fi)
-    {
-        CallbackMap::const_iterator i = m_fcm.find(fi);
+        bool drop_creator(std::string fi);
         
-        if (i == m_fcm.end()){
-            std::string msg = "filter type '" + fi + "' not found";
-            throw yp2::filter::FilterFactoryException(msg);
-        }
-        // call create function
-        return (i->second());
-    }
-    
+        yp2::filter::Base* create(std::string fi);
 
-  
+        bool add_creator_dyn(const std::string &fi, const std::string &path);
+    private:
+        boost::scoped_ptr<Rep> m_p;
+    };
 }
 
 #endif