00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef __GNUG__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _mpqc_src_lib_chemistry_qc_mbptr12_registrytimpl_h
00033 #define _mpqc_src_lib_chemistry_qc_mbptr12_registrytimpl_h
00034
00035 #include <cassert>
00036 #include <util/state/statein.h>
00037 #include <util/state/stateout.h>
00038 #include <chemistry/qc/mbptr12/registry.h>
00039
00040 namespace sc {
00041
00042 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00043 Ref< Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual> >
00044 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::instance()
00045 {
00046 return CreationPolicy< Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual> >::instance();
00047 }
00048
00049 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00050 void
00051 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::save_instance(const Ref<Registry>& obj, StateOut& so)
00052 {
00053 CreationPolicy< Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual> >::save_instance(obj, so);
00054 }
00055
00056 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00057 Ref< Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual> >
00058 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::restore_instance(StateIn& si)
00059 {
00060 return CreationPolicy< Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual> >::instance(si);
00061 }
00062
00063 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00064 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::Registry() :
00065 lock_(ThreadGrp::get_default_threadgrp()->new_lock())
00066 {
00067 }
00068
00069 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00070 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::Registry(StateIn& si) :
00071 lock_(ThreadGrp::get_default_threadgrp()->new_lock())
00072 {
00073 si.get(map_);
00074 }
00075
00076 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00077 void
00078 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::save_data_state(StateOut& so)
00079 {
00080 so.put(map_);
00081 }
00082
00083 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00084 typename Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::const_iterator
00085 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::find_by_key(const Key& key) const
00086 {
00087
00088 if (SameType<KeyEqual,std::equal_to<Key> >::result) {
00089 const_iterator result = map_.find(key);
00090 return result;
00091 }
00092 else {
00093 KeyEqual keyeq;
00094 for(const_iterator v=map_.begin(); v!= map_.end(); ++v)
00095 if (keyeq(v->first,key))
00096 return v;
00097 return map_.end();
00098 }
00099 }
00100
00101 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00102 typename Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::const_iterator
00103 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::find_by_value(const Value& value) const
00104 {
00105 const_iterator result;
00106
00107 ValueEqual valeq;
00108 for(const_iterator v=map_.begin(); v!= map_.end(); ++v)
00109 if (valeq(v->second,value))
00110 return v;
00111
00112 return map_.end();
00113 }
00114
00115 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00116 bool
00117 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::key_exists(const Key& key) const
00118 {
00119 bool result = false;
00120
00121
00122 lock_->lock();
00123 const_iterator v = find_by_key(key);
00124 if (v != map_.end())
00125 result = true;
00126 lock_->unlock();
00127
00128 return result;
00129 }
00130
00131 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00132 bool
00133 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::value_exists(const Value& value) const
00134 {
00135 bool result = false;
00136
00137
00138 lock_->lock();
00139 const_iterator v = find_by_value(value);
00140 if (v != map_.end())
00141 result = true;
00142 lock_->unlock();
00143
00144 return result;
00145 }
00146
00147 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00148 const Key&
00149 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::key(const Value& value) const
00150 {
00151
00152 lock_->lock();
00153 const_iterator v = find_by_value(value);
00154 if (v != map_.end()) {
00155 lock_->unlock();
00156 return v->first;
00157 }
00158 else {
00159 lock_->unlock();
00160 throw not_found("value not found");
00161 }
00162
00163 assert(false);
00164 }
00165
00166 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00167 const Value&
00168 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::value(const Key& key) const
00169 {
00170
00171 lock_->lock();
00172 const_iterator v = find_by_key(key);
00173 if (v != map_.end()) {
00174 lock_->unlock();
00175 return v->second;
00176 }
00177 else {
00178 lock_->unlock();
00179 throw not_found("key not found");
00180 }
00181
00182 assert(false);
00183 }
00184
00185 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00186 void
00187 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::add(const Key& key,
00188 const Value& value)
00189 {
00190 lock_->lock();
00191 map_[key] = value;
00192 lock_->unlock();
00193 }
00194 template <typename Key, typename Value, template <typename> class CreationPolicy, typename KeyEqual, typename ValueEqual >
00195 void
00196 Registry<Key,Value,CreationPolicy,KeyEqual,ValueEqual>::add(const std::pair<Key,Value>& keyval_pair)
00197 {
00198 this->add(keyval_pair.first,keyval_pair.second);
00199 }
00200
00201 }
00202
00203 #endif // end of header guard
00204
00205
00206
00207
00208
00209