Skip to content

Commit

Permalink
Add cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
lalinsky committed Mar 3, 2024
1 parent 6fefdb9 commit 8a3a3d1
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ set(fpindexlib_SOURCES
src/fpindex/io/memory_directory.cpp
src/fpindex/io/memory_file.h
src/fpindex/io/memory_file.cpp
src/fpindex/util/cleanup.h
src/fpindex/proto/internal.pb.h
src/fpindex/proto/internal.pb.cc
)
Expand Down Expand Up @@ -241,6 +242,7 @@ set(tests_SOURCES
src/index/op_test.cpp
src/fpindex/segment_test.cpp
src/fpindex/segment_builder_test.cpp
src/fpindex/util/cleanup_test.cpp
src/store/buffered_input_stream_test.cpp
src/store/input_stream_test.cpp
src/store/output_stream_test.cpp
Expand Down
33 changes: 33 additions & 0 deletions src/fpindex/util/cleanup.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#pragma once

#include <optional>

namespace fpindex {
namespace util {

template <typename Callback = void()>
class Cleanup {
public:
Cleanup(Callback callback) : callback_(std::move(callback)) {}
~Cleanup() { Invoke(); }

void Cancel() { callback_.reset(); }
void Invoke() {
if (callback_) {
auto cb = std::move(*callback_);
callback_.reset();
cb();
}
}

private:
std::optional<Callback> callback_;
};

template <typename Callback>
Cleanup<Callback> MakeCleanup(Callback callback) {
return {std::move(callback)};
}

} // namespace util
} // namespace fpindex
42 changes: 42 additions & 0 deletions src/fpindex/util/cleanup_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#include "fpindex/util/cleanup.h"

#include <gtest/gtest.h>

using namespace fpindex;

TEST(CleanupTest, Cleanup) {
std::string s = "initial";
{
auto cleanup = util::MakeCleanup([&s]() {
s = "cleaned";
});
EXPECT_EQ(s, "initial");
}
EXPECT_EQ(s, "cleaned");
}

TEST(CleanupTest, Invoke) {
std::string s = "initial";
{
auto cleanup = util::MakeCleanup([&s]() {
s = "cleaned";
});
EXPECT_EQ(s, "initial");
cleanup.Invoke();
EXPECT_EQ(s, "cleaned");
s = "updated";
}
EXPECT_EQ(s, "updated");
}

TEST(CleanupTest, Cancel) {
std::string s = "initial";
{
auto cleanup = util::MakeCleanup([&s]() {
s = "cleaned";
});
cleanup.Cancel();
EXPECT_EQ(s, "initial");
}
EXPECT_EQ(s, "initial");
}

0 comments on commit 8a3a3d1

Please sign in to comment.