/* Filename-seen cache for the GNU debugger, GDB.

   Copyright (C) 1986-2020 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include "defs.h"
#include "filename-seen-cache.h"
#include "filenames.h"

  /* Initial size of the table.  It automagically grows from here.  */
#define INITIAL_FILENAME_SEEN_CACHE_SIZE 100

/* filename_seen_cache constructor.  */

filename_seen_cache::filename_seen_cache ()
{
  m_tab = htab_create_alloc (INITIAL_FILENAME_SEEN_CACHE_SIZE,
			     filename_hash, filename_eq,
			     NULL, xcalloc, xfree);
}

/* See filename-seen-cache.h.  */

void
filename_seen_cache::clear ()
{
  htab_empty (m_tab);
}

/* See filename-seen-cache.h.  */

filename_seen_cache::~filename_seen_cache ()
{
  htab_delete (m_tab);
}

/* See filename-seen-cache.h.  */

bool
filename_seen_cache::seen (const char *file)
{
  void **slot;

  /* Is FILE in tab?  */
  slot = htab_find_slot (m_tab, file, INSERT);
  if (*slot != NULL)
    return true;

  /* No; add it to tab.  */
  *slot = (char *) file;
  return false;
}
