Re-landing "Refactoring cl::list_storage from "is a" to "has a" std::vector."
[oota-llvm.git] / include / llvm / Support / FileUtilities.h
index b243df506b5513977bc6e83cb5511adee4a34548..2ee2c60b9964b6159d2f26dfc6542d6411099909 100644 (file)
@@ -1,10 +1,10 @@
 //===- llvm/Support/FileUtilities.h - File System Utilities -----*- C++ -*-===//
-// 
+//
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
-// 
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
 //===----------------------------------------------------------------------===//
 //
 // This file defines a family of utility functions which are useful for doing
 #ifndef LLVM_SUPPORT_FILEUTILITIES_H
 #define LLVM_SUPPORT_FILEUTILITIES_H
 
-#include <string>
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Path.h"
 
 namespace llvm {
 
-/// DiffFiles - Compare the two files specified, returning true if they are
-/// different or if there is a file error.  If you specify a string to fill in
-/// for the error option, it will set the string to an error message if an error
-/// occurs, allowing the caller to distinguish between a failed diff and a file
-/// system error.
-///
-bool DiffFiles(const std::string &FileA, const std::string &FileB,
-               std::string *Error = 0);
-
-/// CopyFile - Copy the specified source file to the specified destination,
-/// overwriting destination if it exists.  This returns true on failure.
-///
-bool CopyFile(const std::string &Dest, const std::string &Src);
-
-/// MoveFileOverIfUpdated - If the file specified by New is different than Old,
-/// or if Old does not exist, move the New file over the Old file.  Otherwise,
-/// remove the New file.
-///
-void MoveFileOverIfUpdated(const std::string &New, const std::string &Old);
-/// removeFile - Delete the specified file.
-///
-void removeFile(const std::string &Filename);
-
-/// getUniqueFilename - Return a filename with the specified prefix.  If the
-/// file does not exist yet, return it, otherwise add a suffix to make it
-/// unique.
-///
-std::string getUniqueFilename(const std::string &FilenameBase);
-
-/// MakeFileExecutable - This method turns on whatever access attributes are
-/// needed to make the specified file executable.  It returns true on success.
-/// In case of failure, the file's access attributes are unspecified.
-///
-bool MakeFileExecutable(const std::string &Filename);
-
-/// MakeFileReadable - This method turns on whatever access attributes are
-/// needed to make the specified file readable.  It returns true on success.
-/// In case of failure, the file's access attributes are unspecified.
-///
-bool MakeFileReadable(const std::string &Filename);
-
-/// FDHandle - Simple handle class to make sure a file descriptor gets closed
-/// when the object is destroyed.  This handle acts similarly to an
-/// std::auto_ptr, in that the copy constructor and assignment operators
-/// transfer ownership of the handle.  This means that FDHandle's do not have
-/// value semantics.
-///
-class FDHandle {
-  int FD;
-public:
-  FDHandle() : FD(-1) {}
-  FDHandle(int fd) : FD(fd) {}
-  FDHandle(FDHandle &RHS) : FD(RHS.FD) {
-    RHS.FD = -1;       // Transfer ownership
-  }
-
-  ~FDHandle() throw();
-
-  /// get - Get the current file descriptor, without releasing ownership of it.
-  int get() const { return FD; }
-  operator int() const { return FD; }
-
-  FDHandle &operator=(int fd) throw();
-
-  FDHandle &operator=(FDHandle &RHS) {
-    int fd = RHS.FD;
-    RHS.FD = -1;       // Transfer ownership
-    return operator=(fd);
-  }
+  /// DiffFilesWithTolerance - Compare the two files specified, returning 0 if
+  /// the files match, 1 if they are different, and 2 if there is a file error.
+  /// This function allows you to specify an absolute and relative FP error that
+  /// is allowed to exist.  If you specify a string to fill in for the error
+  /// option, it will set the string to an error message if an error occurs, or
+  /// if the files are different.
+  ///
+  int DiffFilesWithTolerance(StringRef FileA,
+                             StringRef FileB,
+                             double AbsTol, double RelTol,
+                             std::string *Error = nullptr);
 
-  /// release - Take ownership of the file descriptor away from the FDHandle
-  /// object, so that the file is not closed when the FDHandle is destroyed.
-  int release() {
-    int Ret = FD;
-    FD = -1;
-    return Ret;
-  }
-};
 
   /// FileRemover - This class is a simple object meant to be stack allocated.
   /// If an exception is thrown from a region, the object removes the filename
   /// specified (if deleteIt is true).
   ///
   class FileRemover {
-    std::string Filename;
+    SmallString<128> Filename;
     bool DeleteIt;
   public:
-    FileRemover(const std::string &filename, bool deleteIt = true)
-      : Filename(filename), DeleteIt(deleteIt) {}
-    
+    FileRemover() : DeleteIt(false) {}
+
+    explicit FileRemover(const Twine& filename, bool deleteIt = true)
+      : DeleteIt(deleteIt) {
+      filename.toVector(Filename);
+    }
+
     ~FileRemover() {
-      if (DeleteIt) removeFile(Filename);
+      if (DeleteIt) {
+        // Ignore problems deleting the file.
+        sys::fs::remove(Filename);
+      }
+    }
+
+    /// setFile - Give ownership of the file to the FileRemover so it will
+    /// be removed when the object is destroyed.  If the FileRemover already
+    /// had ownership of a file, remove it first.
+    void setFile(const Twine& filename, bool deleteIt = true) {
+      if (DeleteIt) {
+        // Ignore problems deleting the file.
+        sys::fs::remove(Filename);
+      }
+
+      Filename.clear();
+      filename.toVector(Filename);
+      DeleteIt = deleteIt;
     }
 
     /// releaseFile - Take ownership of the file away from the FileRemover so it