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