Empirical
FunctionSet.h
Go to the documentation of this file.
1 
11 #ifndef EMP_FUNCTION_SET_H
12 #define EMP_FUNCTION_SET_H
13 
14 #include <functional>
15 #include "../base/vector.h"
16 
17 namespace emp {
18 
19  template <typename T> class FunctionSet;
20 
24  template <typename RETURN_T, typename... ARGS>
25  class FunctionSet<RETURN_T(ARGS...)> : public emp::vector<std::function<RETURN_T(ARGS...)>> {
26  protected:
28 
29  public:
30  FunctionSet() : return_vals() { ; }
31  ~FunctionSet() { ; }
32 
33  using base_t = emp::vector<std::function<RETURN_T(ARGS...)>>;
34  using value_type = typename base_t::value_type;
35  using return_t = RETURN_T;
36 
38  size_t GetSize() const { return base_t::size(); }
39 
41  void Add(const value_type & in_fun) { base_t::push_back(in_fun); }
42 
44  void Remove(size_t pos) { base_t::erase(base_t::begin()+pos); }
45 
47  const emp::vector<RETURN_T> & Run(ARGS... args) const {
48  const size_t num_tests = base_t::size();
49  return_vals.resize(num_tests);
50  for (size_t i = 0; i < num_tests; i++) {
51  return_vals[i] = (*this)[i](args...);
52  }
53  return return_vals;
54  }
55 
58  RETURN_T Run(ARGS... args, std::function<RETURN_T(RETURN_T, RETURN_T)> comp_fun,
59  RETURN_T default_val=0) const {
60  if (base_t::size() == 0) return default_val; // If we have no entries, return the default.
61 
62  Run(args...);
63 
64  RETURN_T best_found = return_vals[0];
65  for (size_t i = 1; i < return_vals.size(); i++) {
66  best_found = comp_fun(best_found, return_vals[i]);
67  }
68 
69  return best_found;
70  }
71 
73  RETURN_T FindMax(ARGS... args, RETURN_T default_val=0) const {
74  return Run(args..., [](double i1, double i2){ return std::max(i1,i2); }, default_val);
75  }
76 
78  RETURN_T FindMin(ARGS... args, RETURN_T default_val=0) const {
79  return Run(args..., [](double i1, double i2){ return std::min(i1,i2); }, default_val);
80  }
81 
83  RETURN_T FindSum(ARGS... args, RETURN_T default_val=0) const {
84  return Run(args..., [](double i1, double i2){ return i1 + i2; }, default_val);
85  }
86 
88  RETURN_T FindProduct(ARGS... args, RETURN_T default_val=1) const {
89  return Run(args..., [](double i1, double i2){ return i1 * i2; }, default_val);
90  }
91  };
92 
93 
95  template <typename... ARGS>
96  class FunctionSet<void(ARGS...)> : public emp::vector<std::function<void(ARGS...)>> {
97  public:
98  FunctionSet() { ; }
99  ~FunctionSet() { ; }
100 
101  using base_t = emp::vector<std::function<void(ARGS...)>>;
102  using value_type = typename base_t::value_type;
103  using return_t = void;
104 
106  size_t GetSize() const { return base_t::size(); }
107 
109  void Add(const std::function<void(ARGS...)> & in_fun) { base_t::push_back(in_fun); }
110 
112  void Remove(size_t pos) { base_t::erase(base_t::begin()+(int)pos); }
113 
115  void Run(ARGS... args) const {
116  for (const std::function<void(ARGS...)> & cur_fun : *this) {
117  cur_fun(args...);
118  }
119  }
120  };
121 
122 }
123 
124 #endif
size_t GetSize() const
How many functions are in this FunctionSet?
Definition: FunctionSet.h:38
const emp::vector< RETURN_T > & Run(ARGS...args) const
Run all functions and return a vector of all results.
Definition: FunctionSet.h:47
void Remove(size_t pos)
Remove the function at a specified position.
Definition: FunctionSet.h:44
T value_type
Definition: vector.h:136
void Add(const value_type &in_fun)
Add a new funtion to this FunctionSet.
Definition: FunctionSet.h:41
RETURN_T FindProduct(ARGS...args, RETURN_T default_val=1) const
Run all functions and return a product of all values.
Definition: FunctionSet.h:88
typename base_t::value_type value_type
Definition: FunctionSet.h:34
RETURN_T FindMax(ARGS...args, RETURN_T default_val=0) const
Run all functions and return the highest value.
Definition: FunctionSet.h:73
void return_t
Definition: FunctionSet.h:103
size_t size() const
Definition: vector.h:151
RETURN_T FindMin(ARGS...args, RETURN_T default_val=0) const
Run all functions and return the lowest value.
Definition: FunctionSet.h:78
FunctionSet()
Definition: FunctionSet.h:30
~FunctionSet()
Definition: FunctionSet.h:99
void Add(const std::function< void(ARGS...)> &in_fun)
Add a new function to this FunctionSet.
Definition: FunctionSet.h:109
void Run(ARGS...args) const
Run all functions in the FunctionSet.
Definition: FunctionSet.h:115
FunctionSet()
Definition: FunctionSet.h:98
RETURN_T FindSum(ARGS...args, RETURN_T default_val=0) const
Run all functions and return the total value.
Definition: FunctionSet.h:83
size_t GetSize() const
How many functions are in this FunctionSet?
Definition: FunctionSet.h:106
void resize(size_t new_size)
Definition: vector.h:161
typename base_t::value_type value_type
Definition: FunctionSet.h:102
If we are in emscripten, make sure to include the header.
Definition: array.h:37
Definition: FunctionSet.h:19
RETURN_T Run(ARGS...args, std::function< RETURN_T(RETURN_T, RETURN_T)> comp_fun, RETURN_T default_val=0) const
Definition: FunctionSet.h:58
~FunctionSet()
Definition: FunctionSet.h:31
Build a debug wrapper emp::vector around std::vector.
Definition: vector.h:42
RETURN_T return_t
Definition: FunctionSet.h:35
emp::vector< RETURN_T > return_vals
Definition: FunctionSet.h:27
void Remove(size_t pos)
Remove the function at the designated position from this FunctionSet.
Definition: FunctionSet.h:112