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