<p dir="ltr">Can you return an ErrorOr or Expected?</p>
<div class="gmail_quote">On Mar 24, 2016 8:17 PM, "Mehdi AMINI via llvm-commits" <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">joker.eph created this revision.<br>
joker.eph added reviewers: bruno, silvas.<br>
joker.eph added a subscriber: llvm-commits.<br>
Herald added subscribers: srhines, danalbert, tberghammer.<br>
<br>
Adapted from Boost::filesystem.<br>
<br>
<a href="http://reviews.llvm.org/D18467" rel="noreferrer" target="_blank">http://reviews.llvm.org/D18467</a><br>
<br>
Files:<br>
  include/llvm/Support/FileSystem.h<br>
  lib/Support/Unix/Path.inc<br>
  lib/Support/Windows/Path.inc<br>
<br>
Index: lib/Support/Windows/Path.inc<br>
===================================================================<br>
--- lib/Support/Windows/Path.inc<br>
+++ lib/Support/Windows/Path.inc<br>
@@ -151,6 +151,19 @@<br>
   return UniqueID(VolumeSerialNumber, FileID);<br>
 }<br>
<br>
+std::error_code disk_space(const Twine Path, space_info &SpaceInfo) {<br>
+  PULARGE_INTEGER avail, total, free;<br>
+  if (!::GetDiskFreeSpaceExW(Path.str().c_str(), &avail, &total, &free))<br>
+      return mapWindowsError(::GetLastError());<br>
+  SpaceInfo.capacity = (static_cast<uint64_t>(total.HighPart) << 32)<br>
+    + total.LowPart;<br>
+  SpaceInfo.free = (static_cast<uint64_t>(free.HighPart) << 32)<br>
+    + free.LowPart;<br>
+  SpaceInfo.available = (static_cast<uint64_t>(avail.HighPart) << 32)<br>
+    + avail.LowPart;<br>
+  return std::error_code();<br>
+}<br>
+<br>
 TimeValue file_status::getLastAccessedTime() const {<br>
   ULARGE_INTEGER UI;<br>
   UI.LowPart = LastAccessedTimeLow;<br>
Index: lib/Support/Unix/Path.inc<br>
===================================================================<br>
--- lib/Support/Unix/Path.inc<br>
+++ lib/Support/Unix/Path.inc<br>
@@ -60,6 +60,24 @@<br>
 # define PATH_MAX 4096<br>
 #endif<br>
<br>
+#include <sys/types.h><br>
+#if !defined(__APPLE__) && !defined(__OpenBSD__) && !defined(__ANDROID__)<br>
+#  include <sys/statvfs.h><br>
+#  define STATVFS statvfs<br>
+#  define STATVFS_F_FRSIZE(vfs) vfs.f_frsize<br>
+#else<br>
+# ifdef __OpenBSD__<br>
+#  include <sys/param.h><br>
+# elif defined(__ANDROID__)<br>
+#  include <sys/vfs.h><br>
+# else<br>
+#  include <sys/mount.h><br>
+# endif<br>
+# define STATVFS statfs<br>
+# define STATVFS_F_FRSIZE(vfs) static_cast<uint64_t>(vfs.f_bsize)<br>
+#endif<br>
+<br>
+<br>
 using namespace llvm;<br>
<br>
 namespace llvm {<br>
@@ -190,6 +208,18 @@<br>
   return UniqueID(fs_st_dev, fs_st_ino);<br>
 }<br>
<br>
+std::error_code disk_space(const Twine Path, space_info &SpaceInfo) {<br>
+  struct STATVFS Vfs;<br>
+  if(::STATVFS(Path.str().c_str(), &Vfs))<br>
+    return std::error_code(errno, std::generic_category());<br>
+  SpaceInfo.capacity =<br>
+      static_cast<uint64_t>(Vfs.f_blocks)* STATVFS_F_FRSIZE(Vfs);<br>
+  SpaceInfo.free = static_cast<uint64_t>(Vfs.f_bfree)* STATVFS_F_FRSIZE(Vfs);<br>
+  SpaceInfo.available =<br>
+      static_cast<uint64_t>(Vfs.f_bavail)* STATVFS_F_FRSIZE(Vfs);<br>
+  return std::error_code();<br>
+}<br>
+<br>
 std::error_code current_path(SmallVectorImpl<char> &result) {<br>
   result.clear();<br>
<br>
Index: include/llvm/Support/FileSystem.h<br>
===================================================================<br>
--- include/llvm/Support/FileSystem.h<br>
+++ include/llvm/Support/FileSystem.h<br>
@@ -647,6 +647,15 @@<br>
<br>
 std::error_code getUniqueID(const Twine Path, UniqueID &Result);<br>
<br>
+/// @brief Get disk space usage information.<br>
+///<br>
+/// @param Path Input path.<br>
+/// @param SpaceInfo Set to the capacity, free, and available space on the<br>
+///        device \a Path is on.<br>
+/// @results errc::success if result has been successfully set, otherwise a<br>
+///          platform specific error_code.<br>
+std::error_code disk_space(const Twine Path, space_info &SpaceInfo);<br>
+<br>
 /// This class represents a memory mapped file. It is based on<br>
 /// boost::iostreams::mapped_file.<br>
 class mapped_file_region {<br>
<br>
<br>
<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div>