// Copyright 2011 Google Inc. All Rights Reserved.

#ifndef ART_SRC_INTERN_TABLE_H_
#define ART_SRC_INTERN_TABLE_H_

#include "unordered_map.h"

#include "heap.h"
#include "mutex.h"
#include "object.h"

namespace art {

/**
 * Used to intern strings.
 *
 * There are actually two tables: one that holds strong references to its strings, and one that
 * holds weak references. The former is used for string literals, for which there is an effective
 * reference from the constant pool. The latter is used for strings interned at runtime via
 * String.intern. Some code (XML parsers being a prime example) relies on being able to intern
 * arbitrarily many strings for the duration of a parse without permanently increasing the memory
 * footprint.
 */
class InternTable {
 public:
  InternTable();

  // Interns a potentially new string in the 'strong' table. (See above.)
  String* InternStrong(int32_t utf16_length, const char* utf8_data);

  // Interns a potentially new string in the 'strong' table. (See above.)
  String* InternStrong(const char* utf8_data);

  // Interns a potentially new string in the 'strong' table. (See above.)
  String* InternStrong(String* s);

  // Interns a potentially new string in the 'weak' table. (See above.)
  String* InternWeak(String* s);

  // Register a String trusting that it is safe to intern.
  // Used when reinitializing InternTable from an image.
  void RegisterStrong(String* s);

  // Removes all weak interns for which the predicate functor 'p' returns true.
  // (We use an explicit Predicate type rather than a template to keep implementation
  // out of the header file.)
  struct Predicate {
    virtual ~Predicate() {}
    virtual bool operator()(const String*) const = 0;
  };
  void RemoveWeakIf(const Predicate& p);

  bool ContainsWeak(String* s);

  size_t Size() const;

  void VisitRoots(Heap::RootVisitor* visitor, void* arg) const;

 private:
  typedef std::tr1::unordered_multimap<int32_t, String*> Table;

  String* Insert(String* s, bool is_strong);

  String* Lookup(Table& table, String* s, uint32_t hash_code);
  String* Insert(Table& table, String* s, uint32_t hash_code);
  void Remove(Table& table, const String* s, uint32_t hash_code);

  mutable Mutex intern_table_lock_;
  Table strong_interns_;
  Table weak_interns_;
};

}  // namespace art

#endif  // ART_SRC_CLASS_LINKER_H_
