From 602fd3a5078a141a8f10e047bd594054411c1c3c Mon Sep 17 00:00:00 2001
From: Luca Heltai <luca.heltai@sissa.it>
Date: Fri, 29 Jul 2005 20:59:30 +0000
Subject: [PATCH] Added close() method. Modified construction such that now a
 new class is added if the constructor is called with an unknown class.

git-svn-id: https://svn.dealii.org/trunk@11220 0785d39b-7218-0410-832d-ea1e28bc413d
---
 deal.II/base/include/base/path_search.h | 18 +++++++++++++-
 deal.II/base/source/path_search.cc      | 33 ++++++++++++++++++++++---
 2 files changed, 46 insertions(+), 5 deletions(-)

diff --git a/deal.II/base/include/base/path_search.h b/deal.II/base/include/base/path_search.h
index cc7b26f8f7..3d3ca556b4 100644
--- a/deal.II/base/include/base/path_search.h
+++ b/deal.II/base/include/base/path_search.h
@@ -70,10 +70,14 @@
  * trailing <tt>"/"</tt>, while suffixes should always start with a
  * dot. These characters are not added automatically (allowing you to
  * do some real file name editing).
+ * 
+ * If you want to open another file with the same object, the previous
+ * one is automatically closed for you. The close() method is needed
+ * only if you need to open the same file externally.
  *
  * @todo Add support for environment variables like in kpathsea.
  *
- * @author Guido Kanschat, 2005
+ * @author Guido Kanschat, Luca Heltai 2005
  */
 class PathSearch
 {
@@ -117,6 +121,18 @@ class PathSearch
 				      */
     std::istream& open (const std::string& filename,
 			const std::string& suffix);
+
+				     /** Explicitly close the file
+					 opened by the previous call
+					 to one of the open()
+					 functions. This is needed
+					 only if you need to open the
+					 same file externally. Opening
+					 another file with the same
+					 PathSearch object
+					 automatically closes the old
+					 one. */
+    void close();
     
 				     /**
 				      * Return the actual name of the
diff --git a/deal.II/base/source/path_search.cc b/deal.II/base/source/path_search.cc
index a7998c8659..95768ae65e 100644
--- a/deal.II/base/source/path_search.cc
+++ b/deal.II/base/source/path_search.cc
@@ -52,8 +52,12 @@ PathSearch::get_path_list(const std::string& cls)
 {
   if (path_lists.empty())
     initialize_classes();
-
-  Assert(path_lists.count(cls) != 0, ExcNoClass(cls));
+  
+  // Modified by Luca Heltai. If a class is not there, add it
+  if(path_lists.count(cls) == 0) add_class(cls);
+  
+  // Assert(path_lists.count(cls) != 0, ExcNoClass(cls));
+  Assert(path_lists.count(cls) != 0, ExcInternalError());
   
   return path_lists.find(cls)->second;
 }
@@ -61,8 +65,15 @@ PathSearch::get_path_list(const std::string& cls)
 
 std::vector<std::string>&
 PathSearch::get_suffix_list(const std::string& cls)
-{
-  Assert(suffix_lists.count(cls) != 0, ExcNoClass(cls));
+{  
+  // This is redundant. The constructor should have already called the
+  // add_path function with the path_list bit...
+
+  // Modified by Luca Heltai. If a class is not there, add it
+  if(suffix_lists.count(cls) == 0) add_class(cls);
+  
+  // Assert(suffix_lists.count(cls) != 0, ExcNoClass(cls));
+  Assert(suffix_lists.count(cls) != 0, ExcInternalError());
   
   return suffix_lists.find(cls)->second;
 }
@@ -127,6 +138,20 @@ PathSearch::open (const std::string& filename,
   return *stream;
 }
 
+void 
+PathSearch::close()
+{
+  if(stream->is_open()) {
+    stream->close();
+    if (debug > 0)
+      deallog << "PathSearch[" << cls << "] closed "
+	      << real_name << std::endl;
+  } else {
+    if (debug > 0)
+      deallog << "PathSearch[" << cls 
+	      << "] nothing opened" << std::endl;
+  }
+}
 
 std::istream&
 PathSearch::open (const std::string& filename)
-- 
2.39.5