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 | |
---|
11 | class MultiMap; |
---|
12 | class Geno; |
---|
13 | class GenoConvManager; |
---|
14 | |
---|
15 | class GenoValidator |
---|
16 | { |
---|
17 | public: |
---|
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 |
---|
23 | class ModelGenoValidator: public GenoValidator |
---|
24 | { |
---|
25 | public: |
---|
26 | int testGenoValidity(Geno& g); |
---|
27 | }; |
---|
28 | |
---|
29 | /// basic information about a single genotype. |
---|
30 | class 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; /// # of characters in the initial comment |
---|
42 | int mapoutshift; /// # 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 | |
---|
55 | public: |
---|
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 | Geno getConverted(char otherformat,MultiMap *m=0); |
---|
104 | |
---|
105 | /// @return -1 = before first char in the string |
---|
106 | /// @return -2 = after last char in the string |
---|
107 | int mapGenToString(int genpos) const; |
---|
108 | /// @return -1 = before first char in the genotype |
---|
109 | /// @return -2 = after last char in the genotype |
---|
110 | int mapStringToGen(int stringpos) const; |
---|
111 | |
---|
112 | int operator==(const Geno &g) {return (format==g.format)&&(gen==g.gen);} |
---|
113 | |
---|
114 | void* owner; |
---|
115 | |
---|
116 | // managing global Geno-related objects (used for validation and conversion) |
---|
117 | static void addValidator(GenoValidator* gv) {validators+=gv;} |
---|
118 | static void removeValidator(GenoValidator* gv) {validators-=gv;} |
---|
119 | static void useConverters(GenoConvManager& gcm) {converters=&gcm;} |
---|
120 | static GenoConvManager &getConverters() {return *converters;} |
---|
121 | protected: |
---|
122 | static GenoConvManager *converters; |
---|
123 | static SListTempl<GenoValidator*> validators; |
---|
124 | }; |
---|
125 | |
---|
126 | #ifndef NO_GENOCONVMANAGER |
---|
127 | #include "genoconv.h" |
---|
128 | #endif |
---|
129 | |
---|
130 | #endif |
---|