/*
 * 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 SCOPED_HASHTABLE_
#define SCOPED_HASHTABLE_

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;
};
} // end namespace utils

#endif
