_Map.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /******************************************************************************/
  2. struct _Map // Map (base) - Do not use this class, use 'Map' instead
  3. {
  4. struct Desc
  5. {
  6. UInt flag;
  7. };
  8. struct Elm
  9. {
  10. };
  11. Int elms ()C {return _elms;}
  12. Int dataSize()C {return _data_size;} // get size of DATA element
  13. CPtr key (Int i)C;
  14. Ptr operator[](Int i) ;
  15. CPtr operator[](Int i)C {return ConstCast(T)[i];}
  16. ~_Map() {del();}
  17. private:
  18. Byte _mode;
  19. Int _elms, _key_offset, /*_data_offset, */_desc_offset, _data_size;
  20. Elm **_order;
  21. Memx<Elm> _memx;
  22. Ptr _user;
  23. Int (*_compare )(CPtr key_a, CPtr key_b);
  24. Bool (*_create )( Ptr elm , CPtr key , Ptr user);
  25. void (*_copy_key)( Ptr dest , CPtr src );
  26. Byte mode(Byte mode);
  27. CPtr dataInMapToKeyRef(CPtr data)C {return (Byte*)data /*-_data_offset*/ + _key_offset;} // assumes that '_data_offset' is zero
  28. CPtr dataInMapToKeyPtr(CPtr data)C {return data ? dataInMapToKeyRef(data) : null;}
  29. CPtr absKey (Int abs_i)C;
  30. CPtr absData(Int abs_i)C;
  31. void from(C _Map &src);
  32. #if EE_PRIVATE
  33. Desc& elmDesc( Elm &elm )C {return *(Desc*)((Byte*)&elm+_desc_offset);}
  34. C Desc& elmDesc(C Elm &elm )C {return *(Desc*)((Byte*)&elm+_desc_offset);}
  35. Ptr elmKey ( Elm &elm )C {return (Byte*)&elm+ _key_offset ;}
  36. CPtr elmKey (C Elm &elm )C {return (Byte*)&elm+ _key_offset ;}
  37. Ptr elmData( Elm &elm )C {return (Byte*)&elm/*+_data_offset*/ ;} // assumes that '_data_offset' is zero
  38. CPtr elmData(C Elm &elm )C {return (Byte*)&elm/*+_data_offset*/ ;} // assumes that '_data_offset' is zero
  39. Elm* dataElm( CPtr data)C {return (Elm *)((Byte*)data/*-_data_offset*/);} // assumes that '_data_offset' is zero
  40. Elm* findElm(CPtr key, Int &stop )C;
  41. void addToOrder( Elm &elm, Int index);
  42. void removeFromOrder( Int index);
  43. void getFailed()C;
  44. Bool containsElm(C Elm *elm)C {return _memx.contains(elm);}
  45. Int dataInMapToAbsIndex(CPtr data)C;
  46. #endif
  47. void clear();
  48. void del ();
  49. Ptr find (CPtr key)C;
  50. Ptr get (CPtr key);
  51. Ptr operator()(CPtr key);
  52. Int findAbsIndex(CPtr key)C;
  53. Int getAbsIndex(CPtr key);
  54. Int requireAbsIndex(CPtr key);
  55. Bool containsKey (CPtr key )C;
  56. Bool containsData(CPtr data)C;
  57. CPtr dataToKey (CPtr data)C;
  58. Int dataToIndex (CPtr data)C;
  59. void remove (Int i );
  60. void removeKey (CPtr key );
  61. void removeData(CPtr data);
  62. Bool replaceKey(CPtr src, CPtr dest);
  63. explicit _Map(Int block_elms, Int compare(CPtr key_a, CPtr key_b), Bool create(Ptr data, CPtr key, Ptr user), Ptr user, void (&copy_key)(Ptr dest, CPtr src));
  64. NO_COPY_CONSTRUCTOR(_Map);
  65. friend struct _MapTS;
  66. T2(KEY,DATA) friend struct Map;
  67. T2(KEY,DATA) friend struct ThreadSafeMap;
  68. };
  69. /******************************************************************************/
  70. STRUCT(_MapTS , _Map) // Map Thread Safe (base) - Do not use this class, use 'ThreadSafeMap' instead
  71. //{
  72. void lock()C;
  73. void unlock()C;
  74. ~_MapTS() {del();}
  75. private:
  76. mutable Byte _d_lock;
  77. SyncLock _lock;
  78. void clear();
  79. void del ();
  80. Ptr find (CPtr key)C;
  81. Ptr get (CPtr key);
  82. Ptr operator()(CPtr key);
  83. Int findAbsIndex(CPtr key)C;
  84. Int getAbsIndex(CPtr key);
  85. Int requireAbsIndex(CPtr key);
  86. Bool containsKey (CPtr key )C;
  87. Bool containsData(CPtr data)C;
  88. CPtr dataToKey (CPtr data)C;
  89. Int dataToIndex (CPtr data)C;
  90. void remove (Int i );
  91. void removeKey (CPtr key );
  92. void removeData(CPtr data);
  93. Bool replaceKey(CPtr src, CPtr dest);
  94. explicit _MapTS(Int block_elms, Int compare(CPtr key_a, CPtr key_b), Bool create(Ptr data, CPtr key, Ptr user), Ptr user, void (&copy_key)(Ptr dest, CPtr src));
  95. T2(KEY,DATA) friend struct ThreadSafeMap;
  96. };
  97. /******************************************************************************/