00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 #ifndef ACE_MAP_MANAGER_H
00014 #define ACE_MAP_MANAGER_H
00015 
00016 #include  "ace/pre.h"
00017 
00018 #include  "ace/config-all.h"
00019 
00020 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00021 # pragma once
00022 #endif 
00023 
00024 #include "ace/Basic_Types.h"
00025 #include "ace/Global_Macros.h"
00026 #include "ace/Default_Constants.h"
00027 
00028 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00029 
00030 
00031 class ACE_Allocator;
00032 
00033 
00034 
00035 
00036 
00037 
00038 template <class EXT_ID, class INT_ID>
00039 class ACE_Map_Entry
00040 {
00041 public:
00042 
00043   ACE_Map_Entry (void);
00044 
00045 
00046 
00047   ~ACE_Map_Entry (void);
00048 
00049 
00050   EXT_ID ext_id_;
00051 
00052 
00053   INT_ID int_id_;
00054 
00055 
00056   void dump (void) const;
00057 
00058 
00059   ACE_ALLOC_HOOK_DECLARE;
00060 
00061   
00062   
00063 
00064 
00065   ACE_UINT32 next (void) const;
00066 
00067 
00068   void next (ACE_UINT32 n);
00069 
00070 
00071   ACE_UINT32 prev (void) const;
00072 
00073 
00074   void prev (ACE_UINT32 p);
00075 
00076 
00077   ACE_UINT32 next_;
00078 
00079 
00080   ACE_UINT32 prev_;
00081 
00082 #if defined (ACE_HAS_LAZY_MAP_MANAGER)
00083 
00084 
00085   bool free_;
00086 
00087 #endif 
00088 
00089 };
00090 
00091 
00092 template <class EXT_ID, class INT_ID, class ACE_LOCK>
00093 class ACE_Map_Iterator_Base;
00094 
00095 
00096 template <class EXT_ID, class INT_ID, class ACE_LOCK>
00097 class ACE_Map_Const_Iterator_Base;
00098 
00099 
00100 template <class EXT_ID, class INT_ID, class ACE_LOCK>
00101 class ACE_Map_Iterator;
00102 
00103 
00104 template <class EXT_ID, class INT_ID, class ACE_LOCK>
00105 class ACE_Map_Const_Iterator;
00106 
00107 
00108 template <class EXT_ID, class INT_ID, class ACE_LOCK>
00109 class ACE_Map_Reverse_Iterator;
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 
00122 
00123 
00124 
00125 
00126 
00127 template <class EXT_ID, class INT_ID, class ACE_LOCK>
00128 class ACE_Map_Manager
00129 {
00130 public:
00131   friend class ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK>;
00132   friend class ACE_Map_Const_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK>;
00133   friend class ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK>;
00134   friend class ACE_Map_Const_Iterator<EXT_ID, INT_ID, ACE_LOCK>;
00135   friend class ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK>;
00136 
00137   
00138   typedef EXT_ID KEY;
00139   typedef INT_ID VALUE;
00140   typedef ACE_LOCK lock_type;
00141   typedef ACE_Map_Entry<EXT_ID, INT_ID> ENTRY;
00142   typedef ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> ITERATOR;
00143   typedef ACE_Map_Const_Iterator<EXT_ID, INT_ID, ACE_LOCK> CONST_ITERATOR;
00144   typedef ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> REVERSE_ITERATOR;
00145 
00146   typedef ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> iterator;
00147   typedef ACE_Map_Const_Iterator<EXT_ID, INT_ID, ACE_LOCK> const_iterator;
00148   typedef ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> reverse_iterator;
00149 
00150   
00151 
00152   ACE_Map_Manager (ACE_Allocator *alloc = 0);
00153 
00154 
00155   ACE_Map_Manager (size_t size,
00156                    ACE_Allocator *alloc = 0);
00157 
00158 
00159   int open (size_t length = ACE_DEFAULT_MAP_SIZE,
00160             ACE_Allocator *alloc = 0);
00161 
00162 
00163 
00164   int close (void);
00165 
00166 
00167 
00168   ~ACE_Map_Manager (void);
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177   int bind (const EXT_ID &ext_id,
00178             const INT_ID &int_id);
00179 
00180 
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191   int rebind (const EXT_ID &ext_id,
00192               const INT_ID &int_id,
00193               EXT_ID &old_ext_id,
00194               INT_ID &old_int_id);
00195 
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205   int rebind (const EXT_ID &ext_id,
00206               const INT_ID &int_id,
00207               INT_ID &old_int_id);
00208 
00209 
00210 
00211   int rebind (const EXT_ID &ext_id,
00212               const INT_ID &int_id);
00213 
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222   int trybind (const EXT_ID &ext_id,
00223                INT_ID &int_id);
00224 
00225 
00226 
00227 
00228 
00229 
00230   int find (const EXT_ID &ext_id,
00231             INT_ID &int_id) const;
00232 
00233 
00234   int find (const EXT_ID &ext_id) const;
00235 
00236 
00237 
00238 
00239 
00240 
00241 
00242   int unbind (const EXT_ID &ext_id);
00243 
00244 
00245 
00246 
00247 
00248 
00249   int unbind (const EXT_ID &ext_id,
00250               INT_ID &int_id);
00251 
00252 
00253 
00254 
00255   void unbind_all (void);
00256 
00257 
00258   size_t current_size (void) const;
00259 
00260 
00261   size_t total_size (void) const;
00262 
00263 
00264 
00265 
00266 
00267 
00268 
00269 
00270 
00271   ACE_LOCK &mutex (void);
00272 
00273 
00274   void dump (void) const;
00275 
00276   
00277 
00278 
00279   ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> begin (void);
00280   ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> end (void);
00281 
00282 
00283   ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> rbegin (void);
00284   ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> rend (void);
00285 
00286 
00287   ACE_ALLOC_HOOK_DECLARE;
00288 
00289 protected:
00290 
00291   
00292 
00293   
00294   
00295 
00296 
00297 
00298   int bind_i (const EXT_ID &ext_id,
00299               const INT_ID &int_id);
00300 
00301 
00302 
00303   int shared_bind (const EXT_ID &ext_id,
00304                    const INT_ID &int_id);
00305 
00306 
00307 
00308   int rebind_i (const EXT_ID &ext_id,
00309                 const INT_ID &int_id,
00310                 EXT_ID &old_ext_id,
00311                 INT_ID &old_int_id);
00312 
00313 
00314 
00315   int rebind_i (const EXT_ID &ext_id,
00316                 const INT_ID &int_id,
00317                 INT_ID &old_int_id);
00318 
00319 
00320 
00321   int rebind_i (const EXT_ID &ext_id,
00322                 const INT_ID &int_id);
00323 
00324 
00325 
00326   int trybind_i (const EXT_ID &ext_id,
00327                  INT_ID &int_id);
00328 
00329 
00330 
00331   int find_i (const EXT_ID &ext_id,
00332               INT_ID &int_id);
00333 
00334 
00335 
00336   int find_and_return_index (const EXT_ID &ext_id,
00337                              ACE_UINT32 &slot);
00338 
00339 
00340 
00341   int unbind_i (const EXT_ID &ext_id,
00342                 INT_ID &int_id);
00343 
00344 
00345 
00346   int unbind_i (const EXT_ID &ext_id);
00347 
00348 
00349 
00350   int unbind_and_return_index (const EXT_ID &ext_id,
00351                                ACE_UINT32 &slot);
00352 
00353 
00354   void unbind_slot (ACE_UINT32 slot);
00355 
00356 
00357   int resize_i (ACE_UINT32 size);
00358 
00359 
00360   int close_i (void);
00361 
00362 
00363 
00364   int equal (const EXT_ID &id1, const EXT_ID &id2);
00365 
00366 
00367 
00368   ACE_UINT32 new_size (void);
00369 
00370 
00371 
00372   void free_search_structure (void);
00373 
00374 
00375   ACE_UINT32 free_list_id (void) const;
00376 
00377 
00378   ACE_UINT32 occupied_list_id (void) const;
00379 
00380 
00381   int next_free (ACE_UINT32 &slot);
00382 
00383 
00384   void move_from_free_list_to_occupied_list (ACE_UINT32 slot);
00385 
00386 
00387   void move_from_occupied_list_to_free_list (ACE_UINT32 slot);
00388 
00389 #if defined (ACE_HAS_LAZY_MAP_MANAGER)
00390 
00391 
00392 
00393 
00394 
00395 
00396 
00397   void move_all_free_slots_from_occupied_list (void);
00398 
00399 #endif 
00400 
00401 
00402   void shared_move (ACE_UINT32 slot,
00403                     ACE_Map_Entry<EXT_ID, INT_ID> ¤t_list,
00404                     ACE_UINT32 current_list_id,
00405                     ACE_Map_Entry<EXT_ID, INT_ID> &new_list,
00406                     ACE_UINT32 new_list_id);
00407 
00408 
00409   ACE_Allocator *allocator_;
00410 
00411 
00412   mutable ACE_LOCK lock_;
00413 
00414 
00415   ACE_Map_Entry<EXT_ID, INT_ID> *search_structure_;
00416 
00417 
00418   ACE_UINT32 total_size_;
00419 
00420 
00421   ACE_UINT32 cur_size_;
00422 
00423 
00424   ACE_Map_Entry<EXT_ID, INT_ID> free_list_;
00425 
00426 
00427   ACE_Map_Entry<EXT_ID, INT_ID> occupied_list_;
00428 
00429   enum
00430   {
00431 
00432     MAX_EXPONENTIAL = 64 * 1024,
00433 
00434 
00435     LINEAR_INCREASE = 32 * 1024
00436   };
00437 
00438 private:
00439   
00440   ACE_UNIMPLEMENTED_FUNC (void operator= (const ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK> &))
00441   ACE_UNIMPLEMENTED_FUNC (ACE_Map_Manager (const ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK> &))
00442 };
00443 
00444 
00445 
00446 
00447 
00448 
00449 
00450 
00451 
00452 template <class EXT_ID, class INT_ID, class ACE_LOCK>
00453 class ACE_Map_Iterator_Base
00454 {
00455 public:
00456   
00457 
00458 
00459   ACE_Map_Iterator_Base (ACE_Map_Manager <EXT_ID, INT_ID, ACE_LOCK> &mm);
00460 
00461   
00462 
00463 
00464 
00465   int next (ACE_Map_Entry<EXT_ID, INT_ID> *&next_entry) const;
00466 
00467 
00468   int done (void) const;
00469 
00470 
00471   ACE_Map_Entry<EXT_ID, INT_ID>& operator* (void) const;
00472 
00473 
00474 
00475   ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK>& map (void);
00476 
00477 
00478   bool operator== (const ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK> &) const;
00479   bool operator!= (const ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK> &) const;
00480 
00481 
00482   ACE_ALLOC_HOOK_DECLARE;
00483 
00484 protected:
00485 
00486 
00487   int forward_i (void);
00488 
00489 
00490 
00491   int reverse_i (void);
00492 
00493 
00494   void dump_i (void) const;
00495 
00496 
00497   ACE_Map_Manager <EXT_ID, INT_ID, ACE_LOCK> *map_man_;
00498 
00499 
00500   ACE_UINT32 next_;
00501 };
00502 
00503 
00504 
00505 
00506 
00507 
00508 
00509 
00510 
00511 template <class EXT_ID, class INT_ID, class ACE_LOCK>
00512 class ACE_Map_Const_Iterator_Base
00513 {
00514 public:
00515   
00516 
00517 
00518   ACE_Map_Const_Iterator_Base (const ACE_Map_Manager <EXT_ID, INT_ID, ACE_LOCK> &mm);
00519 
00520   
00521 
00522 
00523 
00524   int next (ACE_Map_Entry<EXT_ID, INT_ID> *&next_entry) const;
00525 
00526 
00527   int done (void) const;
00528 
00529 
00530   ACE_Map_Entry<EXT_ID, INT_ID>& operator* (void) const;
00531 
00532 
00533 
00534   const ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK>& map (void) const;
00535 
00536 
00537   bool operator== (const ACE_Map_Const_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK> &) const;
00538   bool operator!= (const ACE_Map_Const_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK> &) const;
00539 
00540 
00541   ACE_ALLOC_HOOK_DECLARE;
00542 
00543 protected:
00544 
00545 
00546   int forward_i (void);
00547 
00548 
00549 
00550   int reverse_i (void);
00551 
00552 
00553   void dump_i (void) const;
00554 
00555 
00556   const ACE_Map_Manager <EXT_ID, INT_ID, ACE_LOCK> *map_man_;
00557 
00558 
00559   ACE_UINT32 next_;
00560 };
00561 
00562 
00563 
00564 
00565 
00566 
00567 
00568 
00569 
00570 
00571 
00572 
00573 
00574 template <class EXT_ID, class INT_ID, class ACE_LOCK>
00575 class ACE_Map_Iterator : public ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK>
00576 {
00577 public:
00578   
00579   ACE_Map_Iterator (ACE_Map_Manager <EXT_ID, INT_ID, ACE_LOCK> &mm,
00580                     int pass_end = 0);
00581 
00582   
00583 
00584 
00585 
00586   int advance (void);
00587 
00588 
00589   void dump (void) const;
00590 
00591   
00592 
00593 
00594   ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> &operator++ (void);
00595 
00596 
00597   ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> operator++ (int);
00598 
00599 
00600   ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> &operator-- (void);
00601 
00602 
00603   ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> operator-- (int);
00604 
00605 
00606   ACE_ALLOC_HOOK_DECLARE;
00607 };
00608 
00609 
00610 
00611 
00612 
00613 
00614 
00615 
00616 
00617 
00618 
00619 
00620 
00621 template <class EXT_ID, class INT_ID, class ACE_LOCK>
00622 class ACE_Map_Const_Iterator : public ACE_Map_Const_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK>
00623 {
00624 public:
00625   
00626   ACE_Map_Const_Iterator (const ACE_Map_Manager <EXT_ID, INT_ID, ACE_LOCK> &mm,
00627                           int pass_end = 0);
00628 
00629   
00630 
00631 
00632 
00633   int advance (void);
00634 
00635 
00636   void dump (void) const;
00637 
00638   
00639 
00640 
00641   ACE_Map_Const_Iterator<EXT_ID, INT_ID, ACE_LOCK> &operator++ (void);
00642 
00643 
00644   ACE_Map_Const_Iterator<EXT_ID, INT_ID, ACE_LOCK> operator++ (int);
00645 
00646 
00647   ACE_Map_Const_Iterator<EXT_ID, INT_ID, ACE_LOCK> &operator-- (void);
00648 
00649 
00650   ACE_Map_Const_Iterator<EXT_ID, INT_ID, ACE_LOCK> operator-- (int);
00651 
00652 
00653   ACE_ALLOC_HOOK_DECLARE;
00654 };
00655 
00656 
00657 
00658 
00659 
00660 
00661 
00662 
00663 
00664 
00665 
00666 
00667 
00668 template <class EXT_ID, class INT_ID, class ACE_LOCK>
00669 class ACE_Map_Reverse_Iterator : public ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK>
00670 {
00671 public:
00672   
00673   ACE_Map_Reverse_Iterator (ACE_Map_Manager <EXT_ID, INT_ID, ACE_LOCK> &mm,
00674                             int pass_end = 0);
00675 
00676   
00677 
00678 
00679 
00680   int advance (void);
00681 
00682 
00683   void dump (void) const;
00684 
00685   
00686 
00687 
00688   ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> &operator++ (void);
00689 
00690 
00691   ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> operator++ (int);
00692 
00693 
00694   ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> &operator-- (void);
00695 
00696 
00697   ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> operator-- (int);
00698 
00699 
00700   ACE_ALLOC_HOOK_DECLARE;
00701 };
00702 
00703 ACE_END_VERSIONED_NAMESPACE_DECL
00704 
00705 #if defined (__ACE_INLINE__)
00706 #include "ace/Map_Manager.inl"
00707 #endif 
00708 
00709 #if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
00710 #include "ace/Map_Manager.cpp"
00711 #endif 
00712 
00713 #if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
00714 #pragma implementation ("Map_Manager.cpp")
00715 #endif 
00716 
00717 #include  "ace/post.h"
00718 
00719 #endif