source: cpp/frams/genetics/geno.h @ 150

Last change on this file since 150 was 150, checked in by sz, 6 years ago

Warn against missing converter, convert() caller can differentiate between conversion failure and missing converter.

  • Property svn:eol-style set to native
File size: 4.3 KB
Line 
1// This file is a part of the Framsticks GDK.
2// Copyright (C) 2002-2014  Maciej Komosinski and Szymon Ulatowski.  See LICENSE.txt for details.
3// Refer to http://www.framsticks.com/ for further information.
4
5#ifndef _GENO_H_
6#define _GENO_H_
7
8#include <frams/util/sstring.h>
9#include <frams/util/extvalue.h>
10
11class MultiMap;
12class Geno;
13class GenoConvManager;
14
15class GenoValidator
16{
17public:
18        virtual int testGenoValidity(Geno& g) = 0;/// -1=no information  0=invalid  1=valid
19};
20
21/// Basic GenoValidator that works by building a Model from any Geno (by converting to f0).
22/// Validation fails when the model can't be built or the genotype can't be converted.
23class ModelGenoValidator : public GenoValidator
24{
25public:
26        int testGenoValidity(Geno& g);
27};
28
29/// basic information about a single genotype.
30class Geno : public DestrBase
31{
32        friend class Simulator;//needs to access validators directly
33        SString gen;
34        SString name;
35        char format;
36        SString txt;
37        int isvalid; ///< <0 -> unknown   >=0 -> value for "isValid"
38
39        Geno *f0gen;
40
41        int mapinshift; /// number of characters in the initial comment
42        int mapoutshift; /// number of characters in the output comment
43        int multiline;
44
45        void init(const SString& genstring, char genformat, const SString& genname, const SString& comment);
46        void validate(void);
47
48        void freeF0();
49
50        bool isInvalid() { return isvalid == 0; }
51
52        friend class Model;
53        friend class GenoConvManager;
54
55public:
56        /// create a genotype object from primitives
57        /// @param genstring pure genotype, without any comments
58        /// @param genformat genotype format
59        /// @param comment information about genotype (for genetic operators and "history")
60        Geno(const char *genstring = 0, char genformat = -1, const char *genname = 0, const char *comment = 0);
61
62        /// create a genotype object from primitives
63        /// @param genstring pure genotype, wihtout any comments
64        /// @param genformat genotype format
65        /// @param name genotype name, new name will generated if needed
66        /// @param comment information about genotype (for genetic operators and "history")
67        Geno(const SString& genstring, char genformat, const SString& genname, const SString& comment);
68
69        /// create object from full string, containing optional format and comment information
70        Geno(const SString & fullstring);
71
72        /// clone
73        Geno(const Geno& src);
74
75        void operator=(const Geno& src);
76
77        ~Geno();
78
79        void setValid(int v) { isvalid = v; }
80        int getValid() { return isvalid; }
81
82        /// return string representation, with format comment at the beginning
83        SString toString(void) const;
84        SString shortString(void) const;
85
86        void setString(const SString& genewithcomments);
87
88        /** @param newformat=-1 -> don't change */
89        void setGene(const SString& g, char newformat = -1);
90        SString getGene(void) const;
91
92        SString getName(void) const;
93        void setName(const SString&);
94        char getFormat(void) const;
95
96        SString getComment(void) const;
97        void setComment(const SString&);
98
99        /// invalid genotype cannot be used to build a creature
100        bool isValid(void);
101
102        /// make converted version of the genotype.
103        /// @param converter_missing optional output parameter (ignored when NULL). Receives true if the conversion fails because of the lack of appropriate converter(s) (the returned Geno is always invalid in this case). Receives false if the genotype was converted by a converter or a converter chain (the returned Geno can be valid or invalid, depending on the converter's decision).
104        Geno getConverted(char otherformat, MultiMap *m = 0, bool *converter_missing = NULL);
105
106        /// @return -1 = before first char in the string
107        /// @return -2 = after last char in the string
108        int mapGenToString(int genpos) const;
109        /// @return -1 = before first char in the genotype
110        /// @return -2 = after last char in the genotype
111        int mapStringToGen(int stringpos) const;
112
113        int operator==(const Geno &g) { return (format == g.format) && (gen == g.gen); }
114
115        void* owner;
116
117        // managing global Geno-related objects (used for validation and conversion)
118        static void addValidator(GenoValidator* gv) { validators += gv; }
119        static void removeValidator(GenoValidator* gv) { validators -= gv; }
120        static void useConverters(GenoConvManager& gcm) { converters = &gcm; }
121        static GenoConvManager &getConverters() { return *converters; }
122protected:
123        static GenoConvManager *converters;
124        static SListTempl<GenoValidator*> validators;
125};
126
127#ifndef NO_GENOCONVMANAGER
128#include "genoconv.h"
129#endif
130
131#endif
Note: See TracBrowser for help on using the repository browser.