Skip to content

Commit

Permalink
Added MicroAutoFilter to wrap std::function.
Browse files Browse the repository at this point in the history
  • Loading branch information
Gabriel Hare committed Aug 7, 2014
1 parent 8ce38bb commit 652cda6
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 1 deletion.
2 changes: 1 addition & 1 deletion autowiring/AutoPacket.h
Expand Up @@ -7,7 +7,7 @@
#include "is_shared_ptr.h"
#include "ObjectPool.h"
#include "is_any.h"
#include "is_auto_filter.h"
#include "MicroAutoFilter.h"
#include <sstream>
#include <typeinfo>
#include MEMORY_HEADER
Expand Down
50 changes: 50 additions & 0 deletions autowiring/MicroAutoFilter.h
@@ -0,0 +1,50 @@
// Copyright (C) 2012-2014 Leap Motion, Inc. All rights reserved.
#pragma once

#include "is_auto_filter.h"
#include "Deferred.h"

/// <summary>
/// Transmutes a function returning void to an instance that can be called by AutoPacket.
/// The specializations distinguish between void and Deferred return types.
/// </summary>
/// <remarks>
/// The default constructor yields an AutoFilter that does nothing.
/// </remarks>
template<class Ret, class... Args>
struct MicroAutoFilter {
// This case pertains only when the return value is not recognized
static_assert(is_auto_filter_return<Ret>{},
"The return is not an allowed type for AutoFilter methods");
};
template<class... Args>
struct MicroAutoFilter<void, Args...> {
MicroAutoFilter(const std::function<void(Args...)>& filter) : m_filter(filter) {
static_assert(all_auto_filter_args<Args...>::value,
"At least one argument is not an allowed type for AutoFilter methods");
}

void AutoFilter(Args... args) {
if (m_filter)
return m_filter(args...);
}

protected:
std::function<void(Args...)> m_filter;
};
template<class... Args>
struct MicroAutoFilter<Deferred, Args...> {
MicroAutoFilter(const std::function<void(Args...)>& filter) : m_filter(filter) {
static_assert(all_auto_filter_args<Args...>::value,
"At least one argument is not an allowed type for AutoFilter methods");
}

Deferred AutoFilter(Args... args) {
if (m_filter)
return m_filter(args...);
return Deferred(this);
}

protected:
std::function<void(Args...)> m_filter;
};
1 change: 1 addition & 0 deletions src/autowiring/CMakeLists.txt
Expand Up @@ -90,6 +90,7 @@ set(Autowiring_SRCS
ObjectPoolMonitor.cpp
optional_ptr.h
SatCounter.h
MicroAutoFilter.h
MicroBolt.h
SharedPointerSlot.h
SlotInformation.h
Expand Down
11 changes: 11 additions & 0 deletions src/autowiring/test/AutoFilterTest.cpp
Expand Up @@ -1106,6 +1106,17 @@ TEST_F(AutoFilterTest, AutoFilterTemplateTests) {
ASSERT_TRUE(static_cast<const bool>(is_auto_filter<FilterFunctionType>::value)) << "Valid AutoFilter function identified as invalid";
}

TEST_F(AutoFilterTest, MicroAutoFilterTests) {
int extVal = -1;
std::function<void(const int&)> filter([&extVal] (const int& getVal) {
extVal = getVal;
});
MicroAutoFilter<void, const int&> makeImmediate(filter);
int setVal = 1;
makeImmediate.AutoFilter(setVal);
ASSERT_EQ(1, extVal);
}

void FilterFunction(const Decoration<0>& typeIn, auto_out<Decoration<1>> typeOut) {
typeOut->i += 1 + typeIn.i;
}
Expand Down

0 comments on commit 652cda6

Please sign in to comment.