-
Notifications
You must be signed in to change notification settings - Fork 10
/
temporary_subdirectory.hpp
131 lines (120 loc) · 3.61 KB
/
temporary_subdirectory.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
* Copyright © 2024 IBM Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <filesystem>
#include <utility>
namespace phosphor::power::util
{
/**
* @class TemporarySubDirectory
*
* A temporary subdirectory in the file system.
*
* This class does NOT represent the system temporary directory (such as /tmp).
* It represents a temporary subdirectory below that directory.
*
* The temporary subdirectory is created by the constructor. The absolute path
* to the subdirectory can be obtained using getPath().
*
* The temporary subdirectory can be deleted by calling remove(). Otherwise the
* subdirectory will be deleted by the destructor.
*
* TemporarySubDirectory objects cannot be copied, but they can be moved. This
* enables them to be stored in containers like std::vector.
*/
class TemporarySubDirectory
{
public:
// Specify which compiler-generated methods we want
TemporarySubDirectory(const TemporarySubDirectory&) = delete;
TemporarySubDirectory& operator=(const TemporarySubDirectory&) = delete;
/**
* Constructor.
*
* Creates a temporary subdirectory below the system temporary directory
* (such as /tmp).
*
* Throws an exception if the subdirectory cannot be created.
*/
TemporarySubDirectory();
/**
* Move constructor.
*
* Transfers ownership of a temporary subdirectory.
*
* @param subdirectory TemporarySubDirectory object being moved
*/
TemporarySubDirectory(TemporarySubDirectory&& subdirectory) :
path{std::move(subdirectory.path)}
{
// Clear path in other object; after move path is in unspecified state
subdirectory.path.clear();
}
/**
* Move assignment operator.
*
* Deletes the temporary subdirectory owned by this object. Then transfers
* ownership of the temporary subdirectory owned by the other object.
*
* Throws an exception if an error occurs during the deletion.
*
* @param subdirectory TemporarySubDirectory object being moved
*/
TemporarySubDirectory& operator=(TemporarySubDirectory&& subdirectory);
/**
* Destructor.
*
* Deletes the temporary subdirectory if necessary.
*/
~TemporarySubDirectory()
{
try
{
remove();
}
catch (...)
{
// Destructors should not throw exceptions
}
}
/**
* Deletes the temporary subdirectory.
*
* Does nothing if the subdirectory has already been deleted.
*
* Throws an exception if an error occurs during the deletion.
*/
void remove();
/**
* Returns the absolute path to the temporary subdirectory.
*
* Returns an empty path if the subdirectory has been deleted.
*
* @return temporary subdirectory path
*/
const std::filesystem::path& getPath() const
{
return path;
}
private:
/**
* Absolute path to the temporary subdirectory.
*
* Empty when subdirectory has been deleted.
*/
std::filesystem::path path{};
};
} // namespace phosphor::power::util