00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _DECAF_UTIL_ABSTRACTMAP_H_
00019 #define _DECAF_UTIL_ABSTRACTMAP_H_
00020
00021 #include <decaf/util/Config.h>
00022 #include <decaf/lang/exceptions/UnsupportedOperationException.h>
00023 #include <decaf/lang/exceptions/NullPointerException.h>
00024 #include <decaf/lang/exceptions/IllegalArgumentException.h>
00025 #include <decaf/util/concurrent/Synchronizable.h>
00026 #include <decaf/util/concurrent/Mutex.h>
00027 #include <decaf/util/Iterator.h>
00028 #include <decaf/util/Map.h>
00029 #include <decaf/util/Set.h>
00030 #include <memory>
00031
00032 namespace decaf {
00033 namespace util {
00034
00058 template< typename K, typename V>
00059 class AbstractMap : public decaf::util::Map<K, V> {
00060 protected:
00061
00062 mutable util::concurrent::Mutex mutex;
00063
00064 public:
00065
00066 AbstractMap() : Map<K, V>(), mutex() {
00067 }
00068
00069 AbstractMap(const Map<K, V>& map) : Map<K, V>(), mutex() {
00070 }
00071
00072 AbstractMap(const AbstractMap<K, V>& map) : Map<K, V>(), mutex() {
00073 }
00074
00075 virtual ~AbstractMap() {}
00076
00077 public:
00078
00079 virtual void lock() {
00080 mutex.lock();
00081 }
00082
00083 virtual bool tryLock() {
00084 return mutex.tryLock();
00085 }
00086
00087 virtual void unlock() {
00088 mutex.unlock();
00089 }
00090
00091 virtual void wait() {
00092 mutex.wait();
00093 }
00094
00095 virtual void wait( long long millisecs ) {
00096 mutex.wait( millisecs );
00097 }
00098
00099 virtual void wait( long long millisecs, int nanos ) {
00100 mutex.wait( millisecs, nanos );
00101 }
00102
00103 virtual void notify() {
00104 mutex.notify();
00105 }
00106
00107 virtual void notifyAll() {
00108 mutex.notifyAll();
00109 }
00110
00111 };
00112
00113 }}
00114
00115 #endif