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

Last change on this file since 150 was 150, checked in by sz, 10 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: 3.5 KB
RevLine 
[121]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.
[109]3// Refer to http://www.framsticks.com/ for further information.
4
5#ifndef _GENCONV_H_
6#define _GENCONV_H_
7
8#include "geno.h"
9#include <frams/param/param.h>
10#include <frams/util/list.h>
11#include <frams/util/sstring.h>
12
13#include <string>
14#include <vector>
15
16
17class GenoConvManager;
18
[150]19class GenoConvParam : public Param
[109]20{
[150]21        GenoConvManager *gcm;
22        std::vector<std::string> gcnames;
23        char tmp_id[20];
24        void freetab();
[109]25public:
[150]26        GenoConvParam(GenoConvManager *g);
27        ~GenoConvParam();
28        void *getTarget(int);
29        const char* id(int i);
30        void updatetab();
[109]31};
32
33class MultiMap;
34
35/// Base class for all Geno Converters.
36/// In constructor you have to set public fields
37/// indicating your identity and supported formats.
38/// Each converter serves one in-out format pair.
39/// Instance of your converter should be registered
40/// in GenoConvManager.
41class GenoConverter
42{
43public:
[150]44        const char *name;       //< converter name (short)
45        char in_format,         //< input format, eg. '1'
46                out_format;     //< output format, eg. '0'
47        const char *info;       //< detailed info about converter, format or copyright
48        long enabled;   //< don't touch this! (used by configuration module)
49        long mapsupport; //< set to 1 if your converter supports genotype mapping
[109]50
[150]51        /// You have to reimplement this method.
52        /// If your converter cannot do its job, return empty string
53        /// (return SString();), any other return value is assumed
54        /// to be output genotype.
55        /// @param map if not null, mapping informaton is requested, converter should add conversion map to this object
56        virtual SString convert(SString &i, MultiMap *map) { return SString(); }
[109]57
[150]58        virtual ~GenoConverter() {}
59        /// Don't forget to set public fields in your constructor
60        GenoConverter() :name(""), in_format(-1), out_format('0'), info(""), enabled(1), mapsupport(0) {}
[109]61};
62
63/// This class gathers abilities of all converters and can
64/// convert a genotype to any other one, provided there is
65/// a path of GenoConverters between them.
66/// In most cases you don't use this class directly,
67/// Geno::getConverted(int) provides full converting functionality.
68/// Explicit GenoConvManager object is only needed for registering
69/// your GenoConverter.
70/// Use DefaultGenoConvManager to register the standard genotype converters automatically.
71class GenoConvManager
72{
[150]73        friend class GenoConvParam;
74        SList converters;
[109]75public:
[150]76        GenoConvManager();
77        ~GenoConvManager();
78        class GenoConvParam param;
79        /// make a genotype in other format. genotype will be invalid
80        /// if GenoConvManager cannot convert it.
81        Geno convert(Geno &in, char format, MultiMap *map = 0, bool *converter_missing = NULL);
82        /// register GenoConverter, the added object will be automatically deleted when GenoConvManager is destructed (call removeConverter() if this is not desirable)
83        void addConverter(GenoConverter *conv);
84        /// unregister GenoConverter
85        void removeConverter(GenoConverter *conv);
[109]86
[150]87        char *getPath(char in, char out, char *path, int maxlen, int *mapavailable = 0);
88        char *getFormatPath(char in, char out, char *path, int maxlen, int *mapavailable = 0);
89        /// returns the list of converters meeting the specified criteria
90        /// pass result=0 if you only need one result (by return value)
91        /// default criteria values mean "don't care", pass anything else to narrow your search
92        GenoConverter *findConverters(SListTempl<GenoConverter*>* result = 0, char in = -1, char out = -1, int enabled = -1, char* name = 0);
[109]93};
94
95#endif
Note: See TracBrowser for help on using the repository browser.