1 /* Filename-seen cache for the GNU debugger, GDB. 2 3 Copyright (C) 1986-2023 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #ifndef FILENAME_SEEN_CACHE_H 21 #define FILENAME_SEEN_CACHE_H 22 23 #include "defs.h" 24 #include "gdbsupport/function-view.h" 25 #include "gdbsupport/gdb-hashtab.h" 26 27 /* Cache to watch for file names already seen. */ 28 29 class filename_seen_cache 30 { 31 public: 32 filename_seen_cache (); 33 34 DISABLE_COPY_AND_ASSIGN (filename_seen_cache); 35 36 /* Empty the cache, but do not delete it. */ 37 void clear (); 38 39 /* If FILE is not already in the table of files in CACHE, add it and 40 return false; otherwise return true. 41 42 NOTE: We don't manage space for FILE, we assume FILE lives as 43 long as the caller needs. */ 44 bool seen (const char *file); 45 46 /* Traverse all cache entries, calling CALLBACK on each. The 47 filename is passed as argument to CALLBACK. */ 48 void traverse (gdb::function_view<void (const char *filename)> callback) 49 { 50 auto erased_cb = [] (void **slot, void *info) -> int 51 { 52 auto filename = (const char *) *slot; 53 auto restored_cb = (decltype (callback) *) info; 54 (*restored_cb) (filename); 55 return 1; 56 }; 57 58 htab_traverse_noresize (m_tab.get (), erased_cb, &callback); 59 } 60 61 private: 62 /* Table of files seen so far. */ 63 htab_up m_tab; 64 }; 65 66 #endif /* FILENAME_SEEN_CACHE_H */ 67