diff options
Diffstat (limited to 'compiler/utils/scoped_hashtable.h')
| -rw-r--r-- | compiler/utils/scoped_hashtable.h | 71 | 
1 files changed, 71 insertions, 0 deletions
diff --git a/compiler/utils/scoped_hashtable.h b/compiler/utils/scoped_hashtable.h new file mode 100644 index 0000000000..ccec7bafa4 --- /dev/null +++ b/compiler/utils/scoped_hashtable.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stddef.h> +#include <map> +#include <list> + +#ifndef ART_COMPILER_UTILS_SCOPED_HASHTABLE_H_ +#define ART_COMPILER_UTILS_SCOPED_HASHTABLE_H_ + +namespace utils { +template <typename K, typename V> +class ScopedHashtable { + public: +  explicit ScopedHashtable():scopes() { +  } + +  void OpenScope() { +    scopes.push_front(std::map<K, V>()); +  } + +  // Lookups entry K starting from the current (topmost) scope +  // and returns its value if found or NULL. +  V Lookup(K k) const { +    for (typename std::list<std::map<K, V> >::const_iterator scopes_it = scopes.begin(); +        scopes_it != scopes.end(); scopes_it++) { +      typename std::map<K, V>::const_iterator result_it = (*scopes_it).find(k); +      if (result_it != (*scopes_it).end()) { +        return (*result_it).second; +      } +    } +    return NULL; +  } + +  // Adds a new entry in the current (topmost) scope. +  void Add(K k, V v) { +    scopes.front().erase(k); +    scopes.front().insert(std::pair< K, V >(k, v)); +  } + +  // Removes the topmost scope. +  bool CloseScope() { +    // Added check to uniformly handle undefined behavior +    // when removing scope and the list of scopes is empty. +    if (scopes.size() > 0) { +      scopes.pop_front(); +      return true; +    } +    return false; +  } + + private: +  std::list<std::map<K, V> > scopes; +}; +}  // namespace utils + +#endif  // ART_COMPILER_UTILS_SCOPED_HASHTABLE_H_  |