VISR  0.12.0
Versatile Interactive Scene Renderer
audio_interface_factory.hpp
Go to the documentation of this file.
1 //
2 // audio_interface_factory.h
3 // VISR
4 //
5 // Created by Costantini G. on 31/05/2017.
6 //
7 //
8 
9 #ifndef audio_interface_factory_h
10 #define audio_interface_factory_h
11 
12 
13 
14 /* Copyright Institute of Sound and Vibration Research - All rights reserved */
15 
16 #include "audio_interface.hpp"
17 #include "export_symbols.hpp"
18 
19 #include <functional>
20 #include <map>
21 #include <memory>
22 #include <string>
23 #include <vector>
24 
25 namespace visr
26 {
27 namespace audiointerfaces
28 {
29  class VISR_AUDIOINTERFACES_LIBRARY_SYMBOL AudioInterfaceFactory
30  {
31  public:
38  static std::unique_ptr<audiointerfaces::AudioInterface> create(std::string const & interfaceName, audiointerfaces::AudioInterface::Configuration const & baseConfig, std::string const & config);
39 
43  static std::vector<std::string> audioInterfacesList();
44 
48  template< class ConcreteAudioInterface >
49  static void registerAudioInterfaceType( std::string const & interfaceName );
50 
51 
56  template< class ConcreteAudioInterface >
57  class Registrar
58  {
59  public:
60  explicit Registrar(std::string const & interfaceName )
61  {
62  creatorTable().insert( std::make_pair( interfaceName, TCreator<ConcreteAudioInterface>() ) );
63  }
64  };
65  private:
66  struct Creator
67  {
68  using CreateFunction = std::function< audiointerfaces::AudioInterface* ( audiointerfaces::AudioInterface::Configuration const & baseConfig, std::string const & config ) >;
69  explicit Creator( CreateFunction fcn );
70 
71  std::unique_ptr<audiointerfaces::AudioInterface> create( audiointerfaces::AudioInterface::Configuration const & baseConfig, std::string const & config) const;
72  private:
73  CreateFunction mCreateFunction;
74  };
75 
76  template< class ConcreteAudioInterface >
77  class TCreator: public Creator
78  {
79  public:
80  TCreator( )
81  : Creator( &TCreator<ConcreteAudioInterface>::construct )
82  {
83  }
84 
85  static audiointerfaces::AudioInterface* construct( audiointerfaces::AudioInterface::Configuration const & baseConfig, std::string const & config )
86  {
87  audiointerfaces::AudioInterface* obj = new ConcreteAudioInterface(baseConfig, config );
88  return obj;
89  }
90  };
91 
92  using CreatorTable = std::map<std::string, Creator >;
93 
94  static CreatorTable & creatorTable();
95  };
96 
97  template< class ConcreteAudioInterface >
98  void AudioInterfaceFactory::registerAudioInterfaceType( std::string const & interfaceName )
99  {
100  creatorTable().insert( std::make_pair( interfaceName, TCreator<ConcreteAudioInterface>() ) );
101  }
102 
103 } // audiointerfaces
104 } // namespace visr
105 
106 #endif /* audio_interface_factory_h */
Definition: audio_interface_factory.hpp:57
Definition: audio_interface.hpp:19
Definition: options.cpp:10
static void registerAudioInterfaceType(std::string const &interfaceName)
Definition: audio_interface_factory.hpp:98
Registrar(std::string const &interfaceName)
Definition: audio_interface_factory.hpp:60
Definition: audio_interface_factory.hpp:29