+#ifndef __FITNESS_FITNESS_H
+#define __FITNESS_FITNESS_H
+
+#include <map>
+#include <string>
+
+#include "chromosome.h"
+
+namespace genetic {
+ /**
+ * Base Fitness template class. It should be a base class for any custom
+ * fitness functions.
+ */
+ template < typename _Chromosome, typename _Value = double >
+ class Fitness {
+ template<typename> friend class Selection;
+ public:
+ /**
+ * Type representing Chromosome Gene
+ */
+ typedef typename _Chromosome::GeneType GeneType;
+
+ /**
+ * Value type returned by the Fitness function
+ */
+ typedef _Value ValueType;
+ protected:
+ /**
+ * Chromosome on which calculations are made
+ */
+ _Chromosome chromosome;
+
+ /**
+ * Calculations should be done here...
+ *
+ * @return Fitness value of the current Chromosome
+ */
+ virtual _Value do_calculate() = 0;
+
+ public:
+ /**
+ * Class constructor
+ */
+ Fitness() {}
+
+ /**
+ * Copy constructor
+ */
+ Fitness(_Chromosome& _chromosome)
+ : chromosome(_chromosome) {
+ }
+
+ /**
+ * Invokes calculations
+ *
+ * @return Fitness value of the current Chromosome
+ */
+ _Value calculate() {
+ return this->do_calculate();
+ }
+
+ /**
+ * Method used to pass additional arguments needed by the function to
+ * run correctly.
+ */
+ virtual void parseArguments(std::map<string, string>) { }
+
+ /**
+ * Method used to get additional arguments needed by the function to
+ * run correctly
+ *
+ * @return map containing additional arguments, empty if do not use any
+ */
+ virtual std::map<string, string> getArguments() {
+ return std::map<string, string>();
+ }
+ };
+}
+
+#endif /* __FITNESS_FITNESS_H */