@@ -36,7 +36,7 @@ template <typename TBlockDeviceEntity> class Holder
36
36
using This_t = Holder<TBlockDeviceEntity>;
37
37
38
38
public:
39
- constexpr Holder ()noexcept
39
+ constexpr Holder () noexcept
40
40
{
41
41
m_fsConfig = createLfsConfig ();
42
42
auto error = lfs_mount (&m_fsInstance, &m_fsConfig);
@@ -46,18 +46,24 @@ template <typename TBlockDeviceEntity> class Holder
46
46
lfs_mount (&m_fsInstance, &m_fsConfig);
47
47
}
48
48
}
49
- constexpr auto fsInstance () noexcept
49
+
50
+ constexpr decltype (auto ) fsInstance() noexcept
50
51
{
51
- return m_fsInstance;
52
+ return & m_fsInstance;
52
53
}
53
- File<This_t> openFile (std::string_view path)noexcept
54
+ File<This_t> openFile (std::string_view path) noexcept
54
55
{
55
- lfs_file_t file{};
56
- lfs_file_open (&m_fsInstance, &file, path.data (), LFS_O_RDWR | LFS_O_CREAT);
57
- return File<This_t>{std::move (file), &m_fsInstance };
56
+ File<This_t> retFile{&m_fsInstance};
57
+ lfs_file_open (
58
+ &m_fsInstance,
59
+ retFile.nativeHandle (FilesystemPasskey{}),
60
+ path.data (),
61
+ LFS_O_RDWR | LFS_O_CREAT);
62
+
63
+ return retFile;
58
64
}
59
65
60
- constexpr TBlockDeviceEntity& getBlockDevice ()noexcept
66
+ constexpr TBlockDeviceEntity& getBlockDevice () noexcept
61
67
{
62
68
return m_blockDeviceHolder;
63
69
}
@@ -69,7 +75,7 @@ template <typename TBlockDeviceEntity> class Holder
69
75
lfs_block_t block,
70
76
lfs_off_t off,
71
77
void * buffer,
72
- lfs_size_t size)noexcept
78
+ lfs_size_t size) noexcept
73
79
{
74
80
auto pThis = reinterpret_cast <This_t*>(c->context );
75
81
pThis->getBlockDevice ().read (
@@ -82,7 +88,7 @@ template <typename TBlockDeviceEntity> class Holder
82
88
lfs_block_t block,
83
89
lfs_off_t off,
84
90
const void * buffer,
85
- lfs_size_t size)noexcept
91
+ lfs_size_t size) noexcept
86
92
{
87
93
auto pThis = reinterpret_cast <This_t*>(c->context );
88
94
pThis->getBlockDevice ().write (
@@ -91,13 +97,13 @@ template <typename TBlockDeviceEntity> class Holder
91
97
return LFS_ERR_OK;
92
98
}
93
99
94
- constexpr static int eraseCall (const struct lfs_config * c, lfs_block_t block)noexcept
100
+ constexpr static int eraseCall (const struct lfs_config * c, lfs_block_t block) noexcept
95
101
{
96
102
auto pThis = reinterpret_cast <This_t*>(c->context );
97
103
return LFS_ERR_OK;
98
104
}
99
105
100
- constexpr static int syncCall (const struct lfs_config * c)noexcept
106
+ constexpr static int syncCall (const struct lfs_config * c) noexcept
101
107
{
102
108
auto pThis = reinterpret_cast <This_t*>(c->context );
103
109
return LFS_ERR_OK;
@@ -145,37 +151,54 @@ template <typename TBlockDeviceEntity> class Holder
145
151
template <typename TFilesystemHolder> class File
146
152
{
147
153
public:
148
- explicit constexpr File ()noexcept = default;
149
- explicit constexpr File (lfs_file_t && fileHandle, lfs_t * pFsHolder)noexcept
150
- : m_pFileHandle{ std::move ( fileHandle )}, m_pFsHolder{ pFsHolder }
154
+ explicit constexpr File (lfs_t * pFsHolder) noexcept
155
+ : m_pFileHandle{std::make_unique<lfs_file_t >()}, m_pFsHolder{pFsHolder}
156
+ {
157
+ }
158
+
159
+ constexpr File (File&& otherHandle) noexcept
160
+ : m_pFileHandle{std::move (otherHandle.m_pFileHandle )}
161
+ , m_pFsHolder{std::exchange (otherHandle.m_pFsHolder , nullptr )}
151
162
{
152
- spdlog::warn (" File::File()" );
153
163
}
164
+
154
165
~File ()
155
166
{
156
- lfs_file_close (m_pFsHolder, &m_pFileHandle);
167
+ if (!m_pFsHolder)
168
+ return ;
169
+
170
+ lfs_file_close (m_pFsHolder, m_pFileHandle.get ());
157
171
spdlog::warn (" ~File::File()" );
158
172
}
159
- CoroUtils::VoidTask write (std::span<const std::uint8_t > dataHolder)noexcept
173
+
174
+ CoroUtils::VoidTask write (std::span<const std::uint8_t > dataHolder) noexcept
160
175
{
161
- lfs_file_write (m_pFsHolder, &m_pFileHandle, dataHolder.data (), static_cast <lfs_size_t >(dataHolder.size ()));
176
+ lfs_file_write (
177
+ m_pFsHolder,
178
+ m_pFileHandle.get (),
179
+ dataHolder.data (),
180
+ static_cast <lfs_size_t >(dataHolder.size ()));
162
181
co_return ;
163
182
}
164
183
165
- CoroUtils::Task<std::span<std::uint8_t >> read (std::span<std::uint8_t > outBuffer)noexcept
184
+ CoroUtils::Task<std::span<std::uint8_t >> read (std::span<std::uint8_t > outBuffer) noexcept
166
185
{
167
- lfs_file_read (m_pFsHolder, &m_pFileHandle, outBuffer.data (), static_cast <lfs_size_t >(outBuffer.size ()));
186
+ lfs_file_read (
187
+ m_pFsHolder,
188
+ m_pFileHandle.get (),
189
+ outBuffer.data (),
190
+ static_cast <lfs_size_t >(outBuffer.size ()));
168
191
co_return outBuffer;
169
192
}
170
193
171
- lfs_file_t nativeHandle (const FilesystemPasskey& passkey)noexcept
194
+ lfs_file_t * nativeHandle (const FilesystemPasskey& passkey) noexcept
172
195
{
173
196
Meta::UnuseVar (passkey);
174
- return m_pFileHandle;
197
+ return m_pFileHandle. get () ;
175
198
}
176
199
177
200
private:
178
- lfs_file_t m_pFileHandle;
201
+ std::unique_ptr< lfs_file_t > m_pFileHandle;
179
202
lfs_t * m_pFsHolder;
180
203
};
181
204
} // namespace Platform::Fs
0 commit comments