57 lines
1.8 KiB
C++
57 lines
1.8 KiB
C++
/*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* Copyright 2022, Danny Robson <danny@nerdcruft.net>
|
|
*/
|
|
|
|
#include <optional>
|
|
#include <filesystem>
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
namespace cruft::fs {
|
|
/// Holds a path and deletes the path (and it any contents if it's a
|
|
/// directory) at destruction.
|
|
class scoped_path {
|
|
public:
|
|
explicit scoped_path (std::filesystem::path const&);
|
|
explicit scoped_path (std::filesystem::path &&);
|
|
|
|
scoped_path (scoped_path const&) = delete;
|
|
scoped_path& operator= (scoped_path const&) = delete;
|
|
|
|
scoped_path (scoped_path&&) noexcept = default;
|
|
scoped_path& operator= (scoped_path&&) noexcept = default;
|
|
|
|
~scoped_path ();
|
|
|
|
std::filesystem::path const& operator* (void) const&;
|
|
std::filesystem::path const* operator-> (void) const&;
|
|
|
|
std::filesystem::path const& get (void) const&;
|
|
|
|
std::filesystem::path release (void);
|
|
void reset (void);
|
|
|
|
private:
|
|
std::optional<std::filesystem::path> m_path;
|
|
};
|
|
|
|
|
|
///------------------------------------------------------------------------
|
|
/// Holds the path to a directory that will be deleted (along with all
|
|
/// contents) when the object goes out of scope.
|
|
class scoped_dir : public scoped_path {
|
|
public:
|
|
explicit scoped_dir (std::filesystem::path const&);
|
|
explicit scoped_dir (std::filesystem::path &&);
|
|
|
|
using scoped_path::scoped_path;
|
|
};
|
|
|
|
|
|
/// A convenience function equivalent to `scoped_dir(maketmpdir())`
|
|
scoped_dir scoped_tmpdir (void);
|
|
} |