Skip to content
Snippets Groups Projects
Commit 02363f9c authored by Ben Cumming's avatar Ben Cumming Committed by GitHub
Browse files

Merge pull request #77 from halfflat/feature/nop

Add 'nop_function' helper for trivial functions.
parents 3b37947a a7d069c2
No related branches found
No related tags found
No related merge requests found
#pragma once
/*
* Provide object that implicitly converts to
* a std::function object that does nothing but return a
* default-constructed type or void.
*/
#include <functional>
namespace nest {
namespace mc {
namespace util {
struct nop_function_t {
template <typename R, typename... Args>
operator std::function<R (Args...)>() const {
return [](Args...) { return R{}; };
}
template <typename... Args>
operator std::function<void (Args...)>() const {
return [](Args...) { };
}
// keep clang happy: see CWG issue #253,
// http://open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253
constexpr nop_function_t() {}
};
static constexpr nop_function_t nop_function;
} // namespace util
} // namespace mc
} // namespace nest
......@@ -21,6 +21,7 @@ set(TEST_SOURCES
test_mask_stream.cpp
test_matrix.cpp
test_mechanisms.cpp
test_nop.cpp
test_optional.cpp
test_parameters.cpp
test_point.cpp
......
#include "gtest.h"
#include "util/nop.hpp"
using namespace nest::mc::util;
TEST(nop, void_fn) {
std::function<void ()> f{nop_function};
EXPECT_TRUE(f);
f(); // should do nothing
bool flag = false;
f = [&]() { flag = true; };
f();
EXPECT_TRUE(flag);
flag = false;
f = nop_function;
f();
EXPECT_FALSE(flag);
// with some arguments
std::function<void (int, int)> g{nop_function};
EXPECT_TRUE(g);
g(2, 3); // should do nothing
int sum = 0;
g = [&](int a, int b) { sum = a+b; };
g(2, 3);
EXPECT_EQ(5, sum);
sum = 0;
g = nop_function;
g(2, 3);
EXPECT_EQ(0, sum);
}
struct check_default {
int value = 100;
check_default() = default;
explicit check_default(int n): value(n) {}
};
TEST(nop, default_return_fn) {
std::function<check_default ()> f{nop_function};
EXPECT_TRUE(f);
auto result = f();
EXPECT_EQ(result.value, 100);
f = []() { return check_default(17); };
result = f();
EXPECT_EQ(result.value, 17);
f = nop_function;
result = f();
EXPECT_EQ(result.value, 100);
std::function<check_default (double, double)> g{nop_function};
EXPECT_TRUE(g);
result = g(1.4, 1.5);
EXPECT_EQ(result.value, 100);
g = [](double x, double y) { return check_default{(int)(x*y)}; };
result = g(1.4, 1.5);
EXPECT_EQ(result.value, 2);
g = nop_function;
result = g(1.4, 1.5);
EXPECT_EQ(result.value, 100);
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment