/*
 * 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_
