1 | // This file is a part of Framsticks GDK library. |
---|
2 | // Copyright (C) 2002-2006 Szymon Ulatowski. See LICENSE.txt for details. |
---|
3 | // Refer to http://www.frams.alife.pl/ for further information. |
---|
4 | |
---|
5 | #ifndef _MULTIMAP_H_ |
---|
6 | #define _MULTIMAP_H_ |
---|
7 | |
---|
8 | #include "multirange.h" |
---|
9 | |
---|
10 | class SingleMapping |
---|
11 | { |
---|
12 | public: |
---|
13 | SingleMapping(int b,const MultiRange& t):begin(b),to(t) {} |
---|
14 | SingleMapping(int b):begin(b) {} |
---|
15 | SingleMapping(const SingleMapping& sm):begin(sm.begin),to(sm.to) {} |
---|
16 | int begin; |
---|
17 | MultiRange to; |
---|
18 | }; |
---|
19 | |
---|
20 | /** MultiMap - used for conversion mapping. |
---|
21 | see @ref convmap |
---|
22 | */ |
---|
23 | class MultiMap |
---|
24 | { |
---|
25 | /** list of (SingleMapping*) */ |
---|
26 | SList data; |
---|
27 | |
---|
28 | SingleMapping* getData(int i) const {return (SingleMapping*)data(i);} |
---|
29 | void addData(int i,SingleMapping* mapping) {data.insert(i,(void*)mapping);} |
---|
30 | void removeData(int i) {data.remove(i);} |
---|
31 | int findData(int x) const; |
---|
32 | int getBegin(int i) const {return getData(i)->begin;} |
---|
33 | |
---|
34 | // addRangeXXX return the shift for range numbers > r |
---|
35 | int addRange(int &r,const MultiRange& mr); |
---|
36 | // value of 'r' is adjusted according to its range number change |
---|
37 | int addRangeBeginEnd(int &r,int begin,int end,const MultiRange& mr); |
---|
38 | |
---|
39 | public: |
---|
40 | MultiMap() {} |
---|
41 | MultiMap(const MultiMap& mm) {operator=(mm);} |
---|
42 | ~MultiMap(); |
---|
43 | void operator=(const MultiMap& mm); |
---|
44 | |
---|
45 | void clear(); |
---|
46 | int isEmpty() const {return data.size()==0;} |
---|
47 | int mappingCount() const {return data.size();} |
---|
48 | SingleMapping* getMapping(int i) const {return (SingleMapping*)getData(i);} |
---|
49 | int findMappingId(int x) const {return findData(x);} |
---|
50 | int rangeCount() const {return isEmpty()?0:data.size()-1;} |
---|
51 | IRange getRange(int i) const; |
---|
52 | |
---|
53 | int getBegin() const; |
---|
54 | int getEnd() const; |
---|
55 | |
---|
56 | void add(const IRange& from,const IRange& to) {add(from.begin, from.end, MultiRange(to));} |
---|
57 | void add(const IRange& from,const MultiRange& to) {add(from.begin, from.end, to);} |
---|
58 | void add(int from1,int from2,int to1,int to2) {add(from1,from2,MultiRange(to1,to2));} |
---|
59 | void add(int from1,int from2,const MultiRange& to); |
---|
60 | void add(const MultiRange& from,const MultiRange& to); |
---|
61 | void add(const MultiMap& mm); |
---|
62 | void addCombined(const MultiMap& m1,const MultiMap& m2); |
---|
63 | void addReversed(const MultiMap& mm); |
---|
64 | |
---|
65 | const MultiRange& map(int x) const; |
---|
66 | MultiRange map(int begin,int end) const; |
---|
67 | MultiRange map(const IRange& range) const {return map(range.begin, range.end);} |
---|
68 | MultiRange map(const MultiRange& ranges) const; |
---|
69 | |
---|
70 | void print() const; |
---|
71 | void print2() const; |
---|
72 | }; |
---|
73 | |
---|
74 | #endif |
---|
75 | |
---|
76 | |
---|