Skip to content

Commit

Permalink
libmbcommon: CallbackFile: Use std::function
Browse files Browse the repository at this point in the history
Signed-off-by: Andrew Gunnerson <[email protected]>
  • Loading branch information
chenxiaolong committed Jun 7, 2018
1 parent 90c1861 commit 1db5e5f
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 102 deletions.
31 changes: 15 additions & 16 deletions libmbcommon/include/mbcommon/file/callbacks.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2016-2017 Andrew Gunnerson <[email protected]>
* Copyright (C) 2016-2018 Andrew Gunnerson <[email protected]>
*
* This file is part of DualBootPatcher
*
Expand All @@ -19,6 +19,8 @@

#pragma once

#include <functional>

#include "mbcommon/file.h"

namespace mb
Expand All @@ -27,25 +29,24 @@ namespace mb
class MB_EXPORT CallbackFile : public File
{
public:
using OpenCb = oc::result<void> (*)(File &file, void *userdata);
using CloseCb = oc::result<void> (*)(File &file, void *userdata);
using ReadCb = oc::result<size_t> (*)(File &file, void *userdata,
void *buf, size_t size);
using WriteCb = oc::result<size_t> (*)(File &file, void *userdata,
const void *buf, size_t size);
using SeekCb = oc::result<uint64_t> (*)(File &file, void *userdata,
int64_t offset, int whence);
using TruncateCb = oc::result<void> (*)(File &file, void *userdata,
uint64_t size);
using OpenCb = std::function<oc::result<void>(File &file)>;
using CloseCb = std::function<oc::result<void>(File &file)>;
using ReadCb = std::function<oc::result<size_t>(
File &file, void *buf, size_t size)>;
using WriteCb = std::function<oc::result<size_t>(
File &file, const void *buf, size_t size)>;
using SeekCb = std::function<oc::result<uint64_t>(
File &file, int64_t offset, int whence)>;
using TruncateCb = std::function<oc::result<void>(
File &file, uint64_t size)>;

CallbackFile();
CallbackFile(OpenCb open_cb,
CloseCb close_cb,
ReadCb read_cb,
WriteCb write_cb,
SeekCb seek_cb,
TruncateCb truncate_cb,
void *userdata);
TruncateCb truncate_cb);
virtual ~CallbackFile();

CallbackFile(CallbackFile &&other) noexcept;
Expand All @@ -58,8 +59,7 @@ class MB_EXPORT CallbackFile : public File
ReadCb read_cb,
WriteCb write_cb,
SeekCb seek_cb,
TruncateCb truncate_cb,
void *userdata);
TruncateCb truncate_cb);

protected:
oc::result<void> on_open() override;
Expand All @@ -79,7 +79,6 @@ class MB_EXPORT CallbackFile : public File
WriteCb m_write_cb;
SeekCb m_seek_cb;
TruncateCb m_truncate_cb;
void *m_userdata;
/*! \endcond */
};

Expand Down
66 changes: 29 additions & 37 deletions libmbcommon/src/file/callbacks.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2016-2017 Andrew Gunnerson <[email protected]>
* Copyright (C) 2016-2018 Andrew Gunnerson <[email protected]>
*
* This file is part of DualBootPatcher
*
Expand Down Expand Up @@ -153,19 +153,17 @@ CallbackFile::CallbackFile()
* \param write_cb File write callback
* \param seek_cb File seek callback
* \param truncate_cb File truncate callback
* \param userdata Data pointer to pass to callbacks
*/
CallbackFile::CallbackFile(OpenCb open_cb,
CloseCb close_cb,
ReadCb read_cb,
WriteCb write_cb,
SeekCb seek_cb,
TruncateCb truncate_cb,
void *userdata)
TruncateCb truncate_cb)
: CallbackFile()
{
(void) open(open_cb, close_cb, read_cb, write_cb, seek_cb, truncate_cb,
userdata);
(void) open(std::move(open_cb), std::move(close_cb), std::move(read_cb),
std::move(write_cb), std::move(seek_cb), std::move(truncate_cb));
}

CallbackFile::~CallbackFile()
Expand All @@ -175,13 +173,12 @@ CallbackFile::~CallbackFile()

CallbackFile::CallbackFile(CallbackFile &&other) noexcept
: File(std::move(other))
, m_open_cb(other.m_open_cb)
, m_close_cb(other.m_close_cb)
, m_read_cb(other.m_read_cb)
, m_write_cb(other.m_write_cb)
, m_seek_cb(other.m_seek_cb)
, m_truncate_cb(other.m_truncate_cb)
, m_userdata(other.m_userdata)
, m_open_cb(std::move(other.m_open_cb))
, m_close_cb(std::move(other.m_close_cb))
, m_read_cb(std::move(other.m_read_cb))
, m_write_cb(std::move(other.m_write_cb))
, m_seek_cb(std::move(other.m_seek_cb))
, m_truncate_cb(std::move(other.m_truncate_cb))
{
other.clear();
}
Expand All @@ -190,13 +187,12 @@ CallbackFile & CallbackFile::operator=(CallbackFile &&rhs) noexcept
{
File::operator=(std::move(rhs));

m_open_cb = rhs.m_open_cb;
m_close_cb = rhs.m_close_cb;
m_read_cb = rhs.m_read_cb;
m_write_cb = rhs.m_write_cb;
m_seek_cb = rhs.m_seek_cb;
m_truncate_cb = rhs.m_truncate_cb;
m_userdata = rhs.m_userdata;
m_open_cb = std::move(rhs.m_open_cb);
m_close_cb = std::move(rhs.m_close_cb);
m_read_cb = std::move(rhs.m_read_cb);
m_write_cb = std::move(rhs.m_write_cb);
m_seek_cb = std::move(rhs.m_seek_cb);
m_truncate_cb = std::move(rhs.m_truncate_cb);

rhs.clear();

Expand All @@ -215,24 +211,21 @@ CallbackFile & CallbackFile::operator=(CallbackFile &&rhs) noexcept
* \param write_cb File write callback
* \param seek_cb File seek callback
* \param truncate_cb File truncate callback
* \param userdata Data pointer to pass to callbacks
*/
oc::result<void> CallbackFile::open(OpenCb open_cb,
CloseCb close_cb,
ReadCb read_cb,
WriteCb write_cb,
SeekCb seek_cb,
TruncateCb truncate_cb,
void *userdata)
TruncateCb truncate_cb)
{
if (state() == FileState::New) {
m_open_cb = open_cb;
m_close_cb = close_cb;
m_read_cb = read_cb;
m_write_cb = write_cb;
m_seek_cb = seek_cb;
m_truncate_cb = truncate_cb;
m_userdata = userdata;
m_open_cb = std::move(open_cb);
m_close_cb = std::move(close_cb);
m_read_cb = std::move(read_cb);
m_write_cb = std::move(write_cb);
m_seek_cb = std::move(seek_cb);
m_truncate_cb = std::move(truncate_cb);
}

return File::open();
Expand All @@ -241,7 +234,7 @@ oc::result<void> CallbackFile::open(OpenCb open_cb,
oc::result<void> CallbackFile::on_open()
{
if (m_open_cb) {
return m_open_cb(*this, m_userdata);
return m_open_cb(*this);
} else {
return File::on_open();
}
Expand All @@ -255,7 +248,7 @@ oc::result<void> CallbackFile::on_close()
});

if (m_close_cb) {
return m_close_cb(*this, m_userdata);
return m_close_cb(*this);
} else {
return File::on_close();
}
Expand All @@ -264,7 +257,7 @@ oc::result<void> CallbackFile::on_close()
oc::result<size_t> CallbackFile::on_read(void *buf, size_t size)
{
if (m_read_cb) {
return m_read_cb(*this, m_userdata, buf, size);
return m_read_cb(*this, buf, size);
} else {
return File::on_read(buf, size);
}
Expand All @@ -273,7 +266,7 @@ oc::result<size_t> CallbackFile::on_read(void *buf, size_t size)
oc::result<size_t> CallbackFile::on_write(const void *buf, size_t size)
{
if (m_write_cb) {
return m_write_cb(*this, m_userdata, buf, size);
return m_write_cb(*this, buf, size);
} else {
return File::on_write(buf, size);
}
Expand All @@ -282,7 +275,7 @@ oc::result<size_t> CallbackFile::on_write(const void *buf, size_t size)
oc::result<uint64_t> CallbackFile::on_seek(int64_t offset, int whence)
{
if (m_seek_cb) {
return m_seek_cb(*this, m_userdata, offset, whence);
return m_seek_cb(*this, offset, whence);
} else {
return File::on_seek(offset, whence);
}
Expand All @@ -291,7 +284,7 @@ oc::result<uint64_t> CallbackFile::on_seek(int64_t offset, int whence)
oc::result<void> CallbackFile::on_truncate(uint64_t size)
{
if (m_truncate_cb) {
return m_truncate_cb(*this, m_userdata, size);
return m_truncate_cb(*this, size);
} else {
return File::on_truncate(size);
}
Expand All @@ -305,7 +298,6 @@ void CallbackFile::clear()
m_write_cb = nullptr;
m_seek_cb = nullptr;
m_truncate_cb = nullptr;
m_userdata = nullptr;
}

}
Loading

0 comments on commit 1db5e5f

Please sign in to comment.