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

Last change on this file since 518 was 518, checked in by Maciej Komosinski, 8 years ago

More strict parsing of genotype format prefix

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