#ifndef TRACKFILTERFACTORY_H
#define TRACKFILTERFACTORY_H
//_____________________________________________________________________________
/// \class TrackFilterFactory 
///
/// \brief TrackFilterFactory - creates TrackFilter objects
/// 
///
/// TrackFilterFactory creates TrackFilter objects. Pointers
/// to functions creating different types of TrackFilter are in 
/// a map, keyed by names of the fitter state types. Creator
/// functions have to be registered with FSFactory using 
/// 'RegisterTrackFilter' method, so that new types of histogram
/// blocks can be added without changing FSFactory code. FSFactory
/// is a singleton.
///
/// \author Sergei avva@fnal.gov
///
/// $Id: TrackFilterFactory.h,v 1.1 2006/02/04 21:47:35 avva Exp $ 

#include <string>
#include <map> 

class TrackFilter;

class TrackFilterFactory { 

public:
    /// pointer to function creating fitter state  
    typedef TrackFilter* (*Creator)(); 

private:
    /// map of creator function pointers keyed by name 
    typedef std::map<std::string, Creator> CallbackMap; 
    typedef std::map<std::string, TrackFilter*> StateMap;
    
public:

    /// get reference to the FSFactory singleton  
    static  TrackFilterFactory&      Instance();
    
    /// create fitter state given its name 
    TrackFilter* GetTrackFilter(const std::string& fitStateId); 
    TrackFilter* GetTrackFilter(const char* fitStateId); 
    
    
    /// Returns 'true' if registration was successful 
    bool    RegisterTrackFilter      (const std::string& TrackFilterId,
                                        Creator creator); 
    
    /// Returns 'true' if the TrackFilterId was registered before 
    bool    UnregisterTrackFilter    (const std::string& TrackFilterId);
    

    
private: 
    static TrackFilterFactory* fInstance;
    CallbackMap fCallbacks; 
    StateMap    fTrackFilters;
    
    /// create fitter state given its name 
    TrackFilter* CreateTrackFilter(const std::string& TrackFilterId); 
    /// Those are private    
    TrackFilterFactory();
    TrackFilterFactory(const TrackFilterFactory&);
    //TrackFilterFactory& operator=(const TrackFilterFactory&); 
    //~TrackFilterFactory();
    
}; // class TrackFilterFactory

#endif
