diff options
| author | graehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-08-19 04:46:18 +0000 | 
|---|---|---|
| committer | graehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-08-19 04:46:18 +0000 | 
| commit | 1b57d4a77c5d32068d29bf3772d756c2c844e361 (patch) | |
| tree | 2e671f8141ef345022b7196ec81b6abbacce66f3 /utils/hash.h | |
| parent | 6ba469b231c727fbfea5c831852d231247e24526 (diff) | |
ValueArray instead of string for state is 10% faster
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@599 ec762483-ff6d-05da-a07a-a48fb63a330f
Diffstat (limited to 'utils/hash.h')
| -rwxr-xr-x | utils/hash.h | 28 | 
1 files changed, 28 insertions, 0 deletions
| diff --git a/utils/hash.h b/utils/hash.h index fbe10b4e..7e38bb2c 100755 --- a/utils/hash.h +++ b/utils/hash.h @@ -60,6 +60,34 @@ typename H::mapped_type & get_default(H &ht,K const& k,typename H::mapped_type c    return const_cast<typename H::mapped_type &>(ht.insert(typename H::value_type(k,v)).first->second);  } +// get_or_construct w/ no arg: just use ht[k] +template <class H,class K,class C0> +typename H::mapped_type & get_or_construct(H &ht,K const& k,C0 const& c0) { +  typedef typename H::mapped_type V; +  typedef typename H::value_type KV; +  typename H::iterator_type i=ht.find(k); +  if (i==ht.end()) { +    return const_cast<V &>(ht.insert(KV(k,V(c0))).first->second); +  } else { +    return i->second; +  } +} + + +// get_or_call (0 arg) +template <class H,class K,class F> +typename H::mapped_type & get_or_call(H &ht,K const& k,F const& f) { +  typedef typename H::mapped_type V; +  typedef typename H::value_type KV; +  typename H::iterator_type i=ht.find(k); +  if (i==ht.end()) { +    return const_cast<V &>(ht.insert(KV(k,f())).first->second); +  } else { +    return i->second; +  } +} + +  // the below could also return a ref to the mapped max/min.  they have the advantage of not falsely claiming an improvement when an equal value already existed.  otherwise you could just modify the get_default and if equal assume new.  template <class H,class K>  bool improve_mapped_max(H &ht,K const& k,typename H::mapped_type const& v) { | 
