[5] | 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 | |
---|