00001 #ifndef MULTYKEYMAP_H
00002 #define MULTYKEYMAP_H
00003 #include <vector>
00004 class StMultiKeyMapIter;
00005 class StMultiKeyNode;
00006
00007 class StMultiKeyMap
00008 {
00009 friend class StMultiKeyMapIter;
00010 public:
00011 StMultiKeyMap(int nKeys);
00012 ~StMultiKeyMap();
00013 void Clear(const char *opt="");
00014 void Add(const void *obj,const float *keys);
00015 void Add(const void *obj,const double *keys);
00016 const StMultiKeyNode *GetTop() const {return mTop;}
00017 StMultiKeyNode *GetTop() {return mTop;}
00018 double Quality();
00019 int MakeTree();
00020 int ls(const char *file="") const;
00021 int Size() const;
00022
00023 static void Test();
00024 static void Test2();
00025
00026
00027 protected:
00028 int mNKey;
00029 StMultiKeyNode *mTop;
00030 std::vector<StMultiKeyNode*> mArr;
00031 };
00032
00033
00034
00035 class StMultiKeyNode
00036 {
00037 friend class StMultiKeyMapIter;
00038 public:
00039 StMultiKeyNode(int nKeys);
00040 StMultiKeyNode(const StMultiKeyNode &source);
00041 virtual ~StMultiKeyNode();
00042 virtual void Set(const void *obj,const float *keys);
00043 void Set(const void *obj,const double *keys);
00044 void Add(const void *obj,const float *keys);
00045 virtual void Add(StMultiKeyNode *node);
00046 virtual double Quality();
00047 virtual int ls(const char *file="") const;
00048
00049 const float *GetKeys() const { return mKeys;}
00050 float GetKey() const { return mKeys[int(mIKey)];}
00051 int GetIKey() const { return mIKey;}
00052 int GetNKey() const { return mNKey;}
00053 int GetNumb(int way) const { return mNumb[way];}
00054 int Size() const { return mNumb[0]+mNumb[1]+1;}
00055 void *GetObj () const { return (void*)mObj ;}
00056 void Clear();
00057 static int GetNInst();
00058
00059 protected:
00060 StMultiKeyNode *LLink() const {return mLink[0];}
00061 StMultiKeyNode *RLink() const {return mLink[1];}
00062 private:
00063 void Init();
00064
00065
00066
00067 public:
00068
00069 protected:
00070 char mNKey;
00071 char mIKey;
00072 int mNumb[2];
00073 StMultiKeyNode *mLink[2];
00074 const void *mObj;
00075 float *mKeys;
00076 int mId;
00077 };
00078
00079
00080 class StMultiKeyMapIter
00081 {
00082 public:
00083 StMultiKeyMapIter(const StMultiKeyNode *node,const float *kMin=0,const float *kMax=0);
00084 void Set(const StMultiKeyNode *node,const float *kMin=0,const float *kMax=0);
00085 void Update(const float *kMin=0,const float *kMax=0);
00086
00087 ~StMultiKeyMapIter();
00088 StMultiKeyNode *operator*() const { return (StMultiKeyNode*)mStk[mLev];}
00089 StMultiKeyMapIter &operator++();
00090 int Level() const {return mLev;}
00091 float *getKMin() const {return mKMin;}
00092 float *getKMax() const {return mKMax;}
00093 const int *Touched() const {return mTouched;}
00094
00095 private:
00096 void Down(const StMultiKeyNode *node);
00097 void SelfCheck();
00098 int FilterLeft(const StMultiKeyNode *node) const;
00099 int FilterRite(const StMultiKeyNode *node) const;
00100 protected:
00101 int mBoundsOn;
00102 mutable int mTouched[2];
00103 std::vector<float> mMinMax;
00104 float *mKMin;
00105 float *mKMax;
00106 int mNK;
00107 int mLev;
00108 std::vector<const StMultiKeyNode*> mStk;
00109 };
00110 #endif //MULTYKEYBINTREE_H