libgsjj  1
Deterministic finite automata learning library
MethodFactory.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <memory>
4 #include <string>
5 #include <map>
6 #include <functional>
7 
8 #include "gsjj/passive/Method.h"
9 
10 namespace gsjj {
11  namespace passive {
19  class MethodFactory {
20  public:
24  using MethodPtr = std::unique_ptr<Method>;
28  using MethodConstructor = std::function<MethodPtr(
29  const std::set<std::string>& Sp,
30  const std::set<std::string>& Sm,
31  const std::set<std::string>& S,
32  const std::set<std::string>& prefixes,
33  const std::set<char>& alphabet,
34  unsigned int n
35  )>;
36 
37  public:
38  MethodFactory() = delete; // We don't want to create an instance of this class
39 
47  static bool registerMethod(const std::string &name, MethodConstructor const &constructor);
48 
65  static MethodPtr create(const std::string &name, unsigned int n, const std::set<std::string> &Sp, const std::set<std::string> &Sm, const std::set<std::string> &S, const std::set<std::string> &prefixes, const std::set<char> &alphabet);
66 
67  private:
68  static std::map<std::string, MethodConstructor> s_methodsMap;
69  };
70 
83  template <typename T>
85  protected:
97  static bool s_registered;
98  };
99 
100  template<typename T>
102  [](const std::set<std::string> &Sp, const std::set<std::string> &Sm, const std::set<std::string> &S, const std::set<std::string> &prefixes, const std::set<char> &alphabet, unsigned int n) -> MethodFactory::MethodPtr {
103  class MethodImplemented : public T {
104  public:
105  MethodImplemented(const std::set<std::string> &SpSet, const std::set<std::string> &SmSet, const std::set<std::string> &SSet, const std::set<std::string> &prefixesSet, const std::set<char> &alphabetSet, unsigned int n) : T(SpSet, SmSet, SSet, prefixesSet, alphabetSet, n) {}
106  };
107 
108  return std::move(std::make_unique<MethodImplemented>(Sp, Sm, S, prefixes, alphabet, n));
109  }
110  );
111 
123  std::unique_ptr<Method> constructMethod(const std::string &name, unsigned int n, const std::set<std::string> &Sp, const std::set<std::string> &Sm);
124 
139  std::unique_ptr<Method> constructMethod(const std::string &name, unsigned int n, const std::set<std::string> &Sp, const std::set<std::string> &Sm, const std::set<std::string> &S, const std::set<std::string> &prefixes, const std::set<char> &alphabet);
140 
155  std::pair<std::unique_ptr<Method>, bool> constructMethod(const std::string &name, const std::set<std::string> &Sp, const std::set<std::string> &Sm, const std::chrono::seconds &timeLimit = std::chrono::seconds(0), long double *timeTaken = nullptr);
156 
174  std::pair<std::unique_ptr<Method>, bool> constructMethod(const std::string &name, const std::set<std::string> &Sp, const std::set<std::string> &Sm, const std::set<std::string> &S, const std::set<std::string> &prefixes, const std::set<char> &alphabet, const std::chrono::seconds &timeLimit = std::chrono::seconds(0), long double *timeTaken = nullptr);
175  }
176 }
The namespace of the library.
Definition: binary.h:11
static MethodPtr create(const std::string &name, unsigned int n, const std::set< std::string > &Sp, const std::set< std::string > &Sm, const std::set< std::string > &S, const std::set< std::string > &prefixes, const std::set< char > &alphabet)
Creates a unique_ptr to a method.
static bool registerMethod(const std::string &name, MethodConstructor const &constructor)
Registers a method.
std::unique_ptr< Method > constructMethod(const std::string &name, unsigned int n, const std::set< std::string > &Sp, const std::set< std::string > &Sm)
Computes the alphabet and the prefixes set from Sp and Sm and constructs a method for a fixed number ...
The Factory Builder design pattern adapted to our methods.
Definition: MethodFactory.h:19
static bool s_registered
Useful to make sure the template is correctly used by the compiler.
Definition: MethodFactory.h:97
std::unique_ptr< Method > MethodPtr
The type the function create will return.
Definition: MethodFactory.h:24
std::function< MethodPtr(const std::set< std::string > &Sp, const std::set< std::string > &Sm, const std::set< std::string > &S, const std::set< std::string > &prefixes, const std::set< char > &alphabet, unsigned int n)> MethodConstructor
The type of the constructor the registerMethod must receive.
Definition: MethodFactory.h:35
Helps to register a method in the factory.
Definition: MethodFactory.h:84