activemq-cpp-3.6.0
ConcurrentStlMap.h
Go to the documentation of this file.
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License. You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef _DECAF_UTIL_CONCURRENTSTLMAP_H_
19 #define _DECAF_UTIL_CONCURRENTSTLMAP_H_
20 
21 #include <map>
22 #include <vector>
28 #include <decaf/util/Map.h>
30 #include <decaf/util/AbstractSet.h>
31 #include <decaf/util/Iterator.h>
32 #include <decaf/lang/Pointer.h>
33 
34 namespace decaf{
35 namespace util{
36 namespace concurrent{
37 
50  template <typename K, typename V, typename COMPARATOR = std::less<K> >
51  class ConcurrentStlMap : public ConcurrentMap<K, V> {
52  private:
53 
54  std::map<K,V,COMPARATOR> valueMap;
55  mutable concurrent::Mutex mutex;
56  int modCount;
57 
58  private:
59 
60  class AbstractMapIterator {
61  protected:
62 
63  mutable int position;
64  int expectedModCount;
65  typename std::map<K,V,COMPARATOR>::iterator futureEntry;
66  typename std::map<K,V,COMPARATOR>::iterator currentEntry;
67 
68  ConcurrentStlMap* associatedMap;
69 
70  private:
71 
72  AbstractMapIterator(const AbstractMapIterator&);
73  AbstractMapIterator& operator= (const AbstractMapIterator&);
74 
75  public:
76 
77  AbstractMapIterator(ConcurrentStlMap* parent) : position(0),
78  expectedModCount(parent->modCount),
79  futureEntry(parent->valueMap.begin()),
80  currentEntry(parent->valueMap.end()),
81  associatedMap(parent) {
82  }
83 
84  virtual ~AbstractMapIterator() {}
85 
86  virtual bool checkHasNext() const {
87  synchronized(&this->associatedMap->mutex) {
88  if (futureEntry != this->associatedMap->valueMap.end()) {
89  return true;
90  }
91  }
92  return false;
93  }
94 
95  void checkConcurrentMod() const {
96  if (expectedModCount != this->associatedMap->modCount) {
98  __FILE__, __LINE__, "StlMap modified outside this iterator");
99  }
100  }
101 
102  void makeNext() {
103  synchronized(&this->associatedMap->mutex) {
104  checkConcurrentMod();
105 
106  if (!checkHasNext()) {
107  throw NoSuchElementException(__FILE__, __LINE__, "No next element");
108  }
109 
110  currentEntry = futureEntry;
111  futureEntry++;
112  }
113  }
114 
115  virtual void doRemove() {
116  synchronized(&this->associatedMap->mutex) {
117  checkConcurrentMod();
118 
119  if (currentEntry == this->associatedMap->valueMap.end()) {
121  __FILE__, __LINE__, "Remove called before call to next()");
122  }
123 
124  this->associatedMap->valueMap.erase(currentEntry);
125  currentEntry = this->associatedMap->valueMap.end();
126 
127  expectedModCount++;
128  associatedMap->modCount++;
129  }
130  }
131  };
132 
133  class EntryIterator : public Iterator< MapEntry<K,V> >, public AbstractMapIterator {
134  private:
135 
136  EntryIterator(const EntryIterator&);
137  EntryIterator& operator= (const EntryIterator&);
138 
139  public:
140 
141  EntryIterator(ConcurrentStlMap* parent) : AbstractMapIterator(parent) {
142  }
143 
144  virtual ~EntryIterator() {}
145 
146  virtual bool hasNext() const {
147  return this->checkHasNext();
148  }
149 
150  virtual MapEntry<K, V> next() {
151  synchronized(&this->associatedMap->mutex) {
152  this->makeNext();
153  return MapEntry<K, V>(this->currentEntry->first, this->currentEntry->second);
154  }
155 
156  return MapEntry<K, V>();
157  }
158 
159  virtual void remove() {
160  this->doRemove();
161  }
162  };
163 
164  class KeyIterator : public Iterator<K>, public AbstractMapIterator {
165  private:
166 
167  KeyIterator(const KeyIterator&);
168  KeyIterator& operator= (const KeyIterator&);
169 
170  public:
171 
172  KeyIterator(ConcurrentStlMap* parent) : AbstractMapIterator(parent) {
173  }
174 
175  virtual ~KeyIterator() {}
176 
177  virtual bool hasNext() const {
178  return this->checkHasNext();
179  }
180 
181  virtual K next() {
182  synchronized(&this->associatedMap->mutex) {
183  this->makeNext();
184  return this->currentEntry->first;
185  }
186 
187  return K();
188  }
189 
190  virtual void remove() {
191  this->doRemove();
192  }
193  };
194 
195  class ValueIterator : public Iterator<V>, public AbstractMapIterator {
196  private:
197 
198  ValueIterator(const ValueIterator&);
199  ValueIterator& operator= (const ValueIterator&);
200 
201  public:
202 
203  ValueIterator(ConcurrentStlMap* parent) : AbstractMapIterator(parent) {
204  }
205 
206  virtual ~ValueIterator() {}
207 
208  virtual bool hasNext() const {
209  return this->checkHasNext();
210  }
211 
212  virtual V next() {
213  synchronized(&this->associatedMap->mutex) {
214  this->makeNext();
215  return this->currentEntry->second;
216  }
217 
218  return V();
219  }
220 
221  virtual void remove() {
222  this->doRemove();
223  }
224  };
225 
226  private:
227 
228  class ConstAbstractMapIterator {
229  protected:
230 
231  mutable int position;
232  int expectedModCount;
233  typename std::map<K,V,COMPARATOR>::const_iterator futureEntry;
234  typename std::map<K,V,COMPARATOR>::const_iterator currentEntry;
235 
236  const ConcurrentStlMap* associatedMap;
237 
238  private:
239 
240  ConstAbstractMapIterator(const ConstAbstractMapIterator&);
241  ConstAbstractMapIterator& operator= (const ConstAbstractMapIterator&);
242 
243  public:
244 
245  ConstAbstractMapIterator(const ConcurrentStlMap* parent) : position(0),
246  expectedModCount(parent->modCount),
247  futureEntry(parent->valueMap.begin()),
248  currentEntry(parent->valueMap.end()),
249  associatedMap(parent) {
250  }
251 
252  virtual ~ConstAbstractMapIterator() {}
253 
254  virtual bool checkHasNext() const {
255  synchronized(&this->associatedMap->mutex) {
256  if (futureEntry != this->associatedMap->valueMap.end()) {
257  return true;
258  }
259  }
260  return false;
261  }
262 
263  void checkConcurrentMod() const {
264  synchronized(&this->associatedMap->mutex) {
265  if (expectedModCount != this->associatedMap->modCount) {
267  __FILE__, __LINE__, "StlMap modified outside this iterator");
268  }
269  }
270  }
271 
272  void makeNext() {
273  synchronized(&this->associatedMap->mutex) {
274  checkConcurrentMod();
275 
276  if (!checkHasNext()) {
277  throw NoSuchElementException(__FILE__, __LINE__, "No next element");
278  }
279 
280  currentEntry = futureEntry;
281  futureEntry++;
282  }
283  }
284  };
285 
286  class ConstEntryIterator : public Iterator< MapEntry<K,V> >, public ConstAbstractMapIterator {
287  private:
288 
289  ConstEntryIterator(const ConstEntryIterator&);
290  ConstEntryIterator& operator= (const ConstEntryIterator&);
291 
292  public:
293 
294  ConstEntryIterator(const ConcurrentStlMap* parent) : ConstAbstractMapIterator(parent) {
295  }
296 
297  virtual ~ConstEntryIterator() {}
298 
299  virtual bool hasNext() const {
300  return this->checkHasNext();
301  }
302 
303  virtual MapEntry<K, V> next() {
304  synchronized(&this->associatedMap->mutex) {
305  this->makeNext();
306  return MapEntry<K, V>(this->currentEntry->first, this->currentEntry->second);
307  }
308 
309  return MapEntry<K, V>();
310  }
311 
312  virtual void remove() {
314  __FILE__, __LINE__, "Cannot write to a const Iterator." );
315  }
316  };
317 
318  class ConstKeyIterator : public Iterator<K>, public ConstAbstractMapIterator {
319  private:
320 
321  ConstKeyIterator(const ConstKeyIterator&);
322  ConstKeyIterator& operator= (const ConstKeyIterator&);
323 
324  public:
325 
326  ConstKeyIterator(const ConcurrentStlMap* parent) : ConstAbstractMapIterator(parent) {
327  }
328 
329  virtual ~ConstKeyIterator() {}
330 
331  virtual bool hasNext() const {
332  return this->checkHasNext();
333  }
334 
335  virtual K next() {
336  synchronized(&this->associatedMap->mutex) {
337  this->makeNext();
338  return this->currentEntry->first;
339  }
340 
341  return K();
342  }
343 
344  virtual void remove() {
346  __FILE__, __LINE__, "Cannot write to a const Iterator." );
347  }
348  };
349 
350  class ConstValueIterator : public Iterator<V>, public ConstAbstractMapIterator {
351  private:
352 
353  ConstValueIterator(const ConstValueIterator&);
354  ConstValueIterator& operator= (const ConstValueIterator&);
355 
356  public:
357 
358  ConstValueIterator(const ConcurrentStlMap* parent) : ConstAbstractMapIterator(parent) {
359  }
360 
361  virtual ~ConstValueIterator() {}
362 
363  virtual bool hasNext() const {
364  return this->checkHasNext();
365  }
366 
367  virtual V next() {
368  synchronized(&this->associatedMap->mutex) {
369  this->makeNext();
370  return this->currentEntry->second;
371  }
372 
373  return V();
374  }
375 
376  virtual void remove() {
378  __FILE__, __LINE__, "Cannot write to a const Iterator." );
379  }
380  };
381 
382  private:
383 
384  // Special Set implementation that is backed by this HashMap
385  class StlMapEntrySet : public AbstractSet< MapEntry<K, V> > {
386  private:
387 
388  ConcurrentStlMap* associatedMap;
389 
390  private:
391 
392  StlMapEntrySet(const StlMapEntrySet&);
393  StlMapEntrySet& operator= (const StlMapEntrySet&);
394 
395  public:
396 
397  StlMapEntrySet(ConcurrentStlMap* parent) : AbstractSet< MapEntry<K,V> >(), associatedMap(parent) {
398  }
399 
400  virtual ~StlMapEntrySet() {}
401 
402  virtual int size() const {
403  return associatedMap->size();
404  }
405 
406  virtual void clear() {
407  associatedMap->clear();
408  }
409 
410  virtual bool remove(const MapEntry<K,V>& entry) {
411  synchronized(&this->associatedMap->mutex) {
412  if (this->associatedMap->containsKey(entry.getKey()) &&
413  this->associatedMap->get(entry.getKey()) == entry.getValue()) {
414  associatedMap->remove(entry.getKey());
415  return true;
416  }
417  }
418 
419  return false;
420  }
421 
422  virtual bool contains(const MapEntry<K,V>& entry) {
423  synchronized(&this->associatedMap->mutex) {
424  if (this->associatedMap->containsKey(entry.getKey()) &&
425  this->associatedMap->get(entry.getKey()) == entry.getValue()) {
426  return true;
427  }
428  }
429  return false;
430  }
431 
432  virtual Iterator< MapEntry<K, V> >* iterator() {
433  return new EntryIterator(associatedMap);
434  }
435 
436  virtual Iterator< MapEntry<K, V> >* iterator() const {
437  return new ConstEntryIterator(associatedMap);
438  }
439  };
440 
441  // Special Set implementation that is backed by this HashMap
442  class ConstStlMapEntrySet : public AbstractSet< MapEntry<K, V> > {
443  private:
444 
445  const ConcurrentStlMap* associatedMap;
446 
447  private:
448 
449  ConstStlMapEntrySet(const ConstStlMapEntrySet&);
450  ConstStlMapEntrySet& operator= (const ConstStlMapEntrySet&);
451 
452  public:
453 
454  ConstStlMapEntrySet(const ConcurrentStlMap* parent) : AbstractSet< MapEntry<K,V> >(), associatedMap(parent) {
455  }
456 
457  virtual ~ConstStlMapEntrySet() {}
458 
459  virtual int size() const {
460  return associatedMap->size();
461  }
462 
463  virtual void clear() {
465  __FILE__, __LINE__, "Can't clear a const collection");
466  }
467 
468  virtual bool remove(const MapEntry<K,V>& entry DECAF_UNUSED) {
470  __FILE__, __LINE__, "Can't remove from const collection");
471  }
472 
473  virtual bool contains(const MapEntry<K,V>& entry) {
474  synchronized(&this->associatedMap->mutex) {
475  if (this->associatedMap->containsKey(entry.getKey()) &&
476  this->associatedMap->get(entry.getKey()) == entry.getValue()) {
477  return true;
478  }
479  }
480  return false;
481  }
482 
483  virtual Iterator< MapEntry<K, V> >* iterator() {
485  __FILE__, __LINE__, "Can't return a non-const iterator for a const collection");
486  }
487 
488  virtual Iterator< MapEntry<K, V> >* iterator() const {
489  return new ConstEntryIterator(associatedMap);
490  }
491  };
492 
493  private:
494 
495  class StlMapKeySet : public AbstractSet<K> {
496  private:
497 
498  ConcurrentStlMap* associatedMap;
499 
500  private:
501 
502  StlMapKeySet(const StlMapKeySet&);
503  StlMapKeySet& operator= (const StlMapKeySet&);
504 
505  public:
506 
507  StlMapKeySet(ConcurrentStlMap* parent) : AbstractSet<K>(), associatedMap(parent) {
508  }
509 
510  virtual ~StlMapKeySet() {}
511 
512  virtual bool contains(const K& key) const {
513  return this->associatedMap->containsKey(key);
514  }
515 
516  virtual int size() const {
517  return this->associatedMap->size();
518  }
519 
520  virtual void clear() {
521  this->associatedMap->clear();
522  }
523 
524  virtual bool remove(const K& key) {
525  synchronized(&this->associatedMap->mutex) {
526  if (this->associatedMap->containsKey(key)) {
527  associatedMap->remove(key);
528  return true;
529  }
530  }
531  return false;
532  }
533 
534  virtual Iterator<K>* iterator() {
535  return new KeyIterator(this->associatedMap);
536  }
537 
538  virtual Iterator<K>* iterator() const {
539  return new ConstKeyIterator(this->associatedMap);
540  }
541  };
542 
543  class ConstStlMapKeySet : public AbstractSet<K> {
544  private:
545 
546  const ConcurrentStlMap* associatedMap;
547 
548  private:
549 
550  ConstStlMapKeySet(const ConstStlMapKeySet&);
551  ConstStlMapKeySet& operator= (const ConstStlMapKeySet&);
552 
553  public:
554 
555  ConstStlMapKeySet(const ConcurrentStlMap* parent) : AbstractSet<K>(), associatedMap(parent) {
556  }
557 
558  virtual ~ConstStlMapKeySet() {}
559 
560  virtual bool contains(const K& key) const {
561  return this->associatedMap->containsKey(key);
562  }
563 
564  virtual int size() const {
565  return this->associatedMap->size();
566  }
567 
568  virtual void clear() {
570  __FILE__, __LINE__, "Can't modify a const collection");
571  }
572 
573  virtual bool remove(const K& key DECAF_UNUSED) {
575  __FILE__, __LINE__, "Can't modify a const collection");
576  }
577 
578  virtual Iterator<K>* iterator() {
580  __FILE__, __LINE__, "Can't return a non-const iterator for a const collection");
581  }
582 
583  virtual Iterator<K>* iterator() const {
584  return new ConstKeyIterator(this->associatedMap);
585  }
586  };
587 
588  private:
589 
590  class StlMapValueCollection : public AbstractCollection<V> {
591  private:
592 
593  ConcurrentStlMap* associatedMap;
594 
595  private:
596 
597  StlMapValueCollection(const StlMapValueCollection&);
598  StlMapValueCollection& operator= (const StlMapValueCollection&);
599 
600  public:
601 
602  StlMapValueCollection(ConcurrentStlMap* parent) : AbstractCollection<V>(), associatedMap(parent) {
603  }
604 
605  virtual ~StlMapValueCollection() {}
606 
607  virtual bool contains(const V& value) const {
608  return this->associatedMap->containsValue(value);
609  }
610 
611  virtual int size() const {
612  return this->associatedMap->size();
613  }
614 
615  virtual void clear() {
616  this->associatedMap->clear();
617  }
618 
619  virtual Iterator<V>* iterator() {
620  return new ValueIterator(this->associatedMap);
621  }
622 
623  virtual Iterator<V>* iterator() const {
624  return new ConstValueIterator(this->associatedMap);
625  }
626  };
627 
628  class ConstStlMapValueCollection : public AbstractCollection<V> {
629  private:
630 
631  const ConcurrentStlMap* associatedMap;
632 
633  private:
634 
635  ConstStlMapValueCollection(const ConstStlMapValueCollection&);
636  ConstStlMapValueCollection& operator= (const ConstStlMapValueCollection&);
637 
638  public:
639 
640  ConstStlMapValueCollection(const ConcurrentStlMap* parent) : AbstractCollection<V>(), associatedMap(parent) {
641  }
642 
643  virtual ~ConstStlMapValueCollection() {}
644 
645  virtual bool contains(const V& value) const {
646  return this->associatedMap->containsValue(value);
647  }
648 
649  virtual int size() const {
650  return this->associatedMap->size();
651  }
652 
653  virtual void clear() {
655  __FILE__, __LINE__, "Can't modify a const collection");
656  }
657 
658  virtual Iterator<V>* iterator() {
660  __FILE__, __LINE__, "Can't return a non-const iterator for a const collection");
661  }
662 
663  virtual Iterator<V>* iterator() const {
664  return new ConstValueIterator(this->associatedMap);
665  }
666  };
667 
668  private:
669 
670  // Cached values that are only initialized once a request for them is made.
673  decaf::lang::Pointer<StlMapValueCollection> cachedValueCollection;
674 
675  // Cached values that are only initialized once a request for them is made.
676  mutable decaf::lang::Pointer<ConstStlMapEntrySet> cachedConstEntrySet;
677  mutable decaf::lang::Pointer<ConstStlMapKeySet> cachedConstKeySet;
678  mutable decaf::lang::Pointer<ConstStlMapValueCollection> cachedConstValueCollection;
679 
680  public:
681 
685  ConcurrentStlMap() : ConcurrentMap<K,V>(), valueMap(), mutex(), modCount(0),
686  cachedEntrySet(), cachedKeySet(), cachedValueCollection(),
687  cachedConstEntrySet(), cachedConstKeySet(), cachedConstValueCollection() {
688 
689  }
690 
696  ConcurrentStlMap(const ConcurrentStlMap& source) : ConcurrentMap<K, V>(), valueMap(), mutex(), modCount(0),
697  cachedEntrySet(), cachedKeySet(), cachedValueCollection(),
698  cachedConstEntrySet(), cachedConstKeySet(), cachedConstValueCollection() {
699  copy(source);
700  }
701 
707  ConcurrentStlMap(const Map<K, V>& source) : ConcurrentMap<K, V>(), valueMap(), mutex(), modCount(0),
708  cachedEntrySet(), cachedKeySet(), cachedValueCollection(),
709  cachedConstEntrySet(), cachedConstKeySet(), cachedConstValueCollection() {
710  copy(source);
711  }
712 
713  virtual ~ConcurrentStlMap() {}
714 
718  virtual bool equals(const ConcurrentStlMap& source) const {
719  synchronized(&mutex) {
720  return this->valueMap == source.valueMap;
721  }
722 
723  return false;
724  }
725 
726  virtual bool equals(const Map<K, V>& source) const {
727  synchronized(&mutex) {
728  typename std::auto_ptr< Iterator<K> > iterator(this->keySet().iterator());
729  while (iterator->hasNext()) {
730  K key = iterator->next();
731  if (!this->containsKey(key)) {
732  return false;
733  }
734 
735  if (!(this->get(key) == source.get(key))) {
736  return false;
737  }
738  }
739  }
740 
741  return true;
742  }
743 
747  virtual void copy(const ConcurrentStlMap& source) {
748  synchronized(&mutex) {
749  this->valueMap.clear();
750  this->valueMap.insert(source.valueMap.begin(), source.valueMap.end());
751  }
752  }
753 
754  virtual void copy(const Map<K, V>& source) {
755  synchronized( &mutex ) {
756  this->clear();
757  this->putAll(source);
758  }
759  }
760 
764  virtual void clear() {
765  synchronized(&mutex) {
766  valueMap.clear();
767  }
768  }
769 
773  virtual bool containsKey(const K& key) const {
774  typename std::map<K, V, COMPARATOR>::const_iterator iter;
775 
776  synchronized(&mutex) {
777  iter = valueMap.find(key);
778  return iter != valueMap.end();
779  }
780 
781  return false;
782  }
783 
787  virtual bool containsValue(const V& value) const {
788  synchronized(&mutex) {
789  if (valueMap.empty()) {
790  return false;
791  }
792 
793  typename std::map<K, V, COMPARATOR>::const_iterator iter = valueMap.begin();
794  for (; iter != valueMap.end(); ++iter) {
795  if ((*iter).second == value) {
796  return true;
797  }
798  }
799  }
800 
801  return false;
802  }
803 
807  virtual bool isEmpty() const {
808  synchronized(&mutex) {
809  return valueMap.empty();
810  }
811 
812  return true;
813  }
814 
818  virtual int size() const {
819  synchronized(&mutex) {
820  return (int)valueMap.size();
821  }
822 
823  return 0;
824  }
825 
829  virtual V& get(const K& key) {
830  typename std::map<K,V,COMPARATOR>::iterator iter;
831  synchronized(&mutex) {
832  iter = valueMap.find(key);
833  if (iter != valueMap.end()) {
834  return iter->second;
835  }
836  }
837 
839  __FILE__, __LINE__, "Key does not exist in map");
840  }
841 
845  virtual const V& get(const K& key) const {
846  typename std::map<K,V,COMPARATOR>::const_iterator iter;
847  synchronized(&mutex) {
848  iter = valueMap.find(key);
849  if (iter != valueMap.end()) {
850  return iter->second;
851  }
852  }
853 
855  __FILE__, __LINE__, "Key does not exist in map");
856  }
857 
861  virtual bool put(const K& key, const V& value) {
862  bool result = false;
863  synchronized(&mutex) {
864  if (this->containsKey(key)) {
865  result = true;
866  }
867  modCount++;
868  valueMap[key] = value;
869  }
870  return result;
871  }
872 
876  virtual bool put(const K& key, const V& value, V& oldValue) {
877  bool result = false;
878  synchronized(&mutex) {
879  if (this->containsKey(key)) {
880  result = true;
881  oldValue = valueMap[key];
882  }
883  modCount++;
884  valueMap[key] = value;
885  }
886  return result;
887  }
888 
892  virtual void putAll(const ConcurrentStlMap<K, V, COMPARATOR>& other) {
893  synchronized(&mutex) {
894  this->valueMap.insert(other.valueMap.begin(), other.valueMap.end());
895  this->modCount++;
896  }
897  }
898 
902  virtual void putAll(const Map<K, V>& other) {
903  synchronized(&mutex) {
904  typename std::auto_ptr< Iterator<K> > iterator(other.keySet().iterator());
905  while (iterator->hasNext()) {
906  K key = iterator->next();
907  this->put(key, other.get(key));
908  }
909  modCount++;
910  }
911  }
912 
916  virtual V remove(const K& key) {
917  V result = V();
918  synchronized(&mutex) {
919  typename std::map<K, V, COMPARATOR>::iterator iter = valueMap.find(key);
920  if (iter == valueMap.end()) {
921  return result;
922  }
923  result = iter->second;
924  valueMap.erase(iter);
925  modCount++;
926  }
927 
928  return result;
929  }
930 
954  bool putIfAbsent(const K& key, const V& value) {
955  synchronized(&mutex) {
956  if (!this->containsKey(key)) {
957  this->put(key, value);
958  return true;
959  }
960  }
961 
962  return false;
963  }
964 
983  bool remove(const K& key, const V& value) {
984  synchronized(&mutex) {
985  if( this->containsKey( key ) && ( this->get( key ) == value ) ) {
986  this->remove(key);
987  return true;
988  }
989  }
990 
991  return false;
992  }
993 
1013  bool replace(const K& key, const V& oldValue, const V& newValue) {
1014  synchronized(&mutex) {
1015  if (this->containsKey(key) && (this->get(key) == oldValue)) {
1016  this->put(key, newValue);
1017  return true;
1018  }
1019  }
1020 
1021  return false;
1022  }
1023 
1044  V replace(const K& key, const V& value) {
1045  synchronized(&mutex) {
1046  if (this->containsKey(key)) {
1047  V result = this->get(key);
1048  this->put(key, value);
1049  return result;
1050  }
1051  }
1052 
1053  throw NoSuchElementException(
1054  __FILE__, __LINE__, "Value to Replace was not in the Map." );
1055  }
1056 
1058  synchronized(&mutex) {
1059  if (this->cachedEntrySet == NULL) {
1060  this->cachedEntrySet.reset(new StlMapEntrySet(this));
1061  }
1062  }
1063  return *(this->cachedEntrySet);
1064  }
1065  virtual const Set< MapEntry<K, V> >& entrySet() const {
1066  synchronized(&mutex) {
1067  if (this->cachedConstEntrySet == NULL) {
1068  this->cachedConstEntrySet.reset(new ConstStlMapEntrySet(this));
1069  }
1070  }
1071  return *(this->cachedConstEntrySet);
1072  }
1073 
1074  virtual Set<K>& keySet() {
1075  synchronized(&mutex) {
1076  if (this->cachedKeySet == NULL) {
1077  this->cachedKeySet.reset(new StlMapKeySet(this));
1078  }
1079  }
1080  return *(this->cachedKeySet);
1081  }
1082 
1083  virtual const Set<K>& keySet() const {
1084  synchronized(&mutex) {
1085  if (this->cachedConstKeySet == NULL) {
1086  this->cachedConstKeySet.reset(new ConstStlMapKeySet(this));
1087  }
1088  }
1089  return *(this->cachedConstKeySet);
1090  }
1091 
1092  virtual Collection<V>& values() {
1093  synchronized(&mutex) {
1094  if (this->cachedValueCollection == NULL) {
1095  this->cachedValueCollection.reset(new StlMapValueCollection(this));
1096  }
1097  }
1098  return *(this->cachedValueCollection);
1099  }
1100 
1101  virtual const Collection<V>& values() const {
1102  synchronized(&mutex) {
1103  if (this->cachedConstValueCollection == NULL) {
1104  this->cachedConstValueCollection.reset(new ConstStlMapValueCollection(this));
1105  }
1106  }
1107  return *(this->cachedConstValueCollection);
1108  }
1109 
1110  public:
1111 
1112  virtual void lock() {
1113  mutex.lock();
1114  }
1115 
1116  virtual bool tryLock() {
1117  return mutex.tryLock();
1118  }
1119 
1120  virtual void unlock() {
1121  mutex.unlock();
1122  }
1123 
1124  virtual void wait() {
1125  mutex.wait();
1126  }
1127 
1128  virtual void wait( long long millisecs ) {
1129  mutex.wait( millisecs );
1130  }
1131 
1132  virtual void wait( long long millisecs, int nanos ) {
1133  mutex.wait( millisecs, nanos );
1134  }
1135 
1136  virtual void notify() {
1137  mutex.notify();
1138  }
1139 
1140  virtual void notifyAll() {
1141  mutex.notifyAll();
1142  }
1143 
1144  };
1145 
1146 }}}
1147 
1148 #endif /*_DECAF_UTIL_CONCURRENTSTLMAP_H_*/