Skip to content

Commit

Permalink
Merge pull request #42 from GabrielHare/feature-DeclareAutoFilter
Browse files Browse the repository at this point in the history
Declarative AutoFilter initialization
  • Loading branch information
gtremper committed Aug 13, 2014
2 parents b743a84 + cd9369b commit fd8c114
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 9 deletions.
24 changes: 24 additions & 0 deletions autowiring/DeclareAutoFilter.h
@@ -0,0 +1,24 @@
// Copyright (C) 2012-2014 Leap Motion, Inc. All rights reserved.
#pragma once

#include "CoreContext.h"
#include "MicroAutoFilter.h"

/// <summary>
/// Wraps any method in a MicroAutoFilter class and registers it with the current context.
/// </summary>
/// <remarks>
/// In the constructor of a class that will be Injected into a context call this function as:
/// DeclareAutoFilter(this, &MyClass::MyMethod)
/// for each method that should be used as an AutoFilter.
/// </remarks>
template<class Base, class Ret, class... Args>
std::shared_ptr<MicroAutoFilter<Ret, Args...>> DeclareAutoFilter(Base* that, Ret (Base::*filter)(Args...)) {
return std::shared_ptr<MicroAutoFilter<Ret, Args...>>(
AutoCurrentContext()->template Construct<MicroAutoFilter<Ret, Args...>>(
[that, filter] (Args... args) {
return (that->*filter)(args...);
}
)
);
}
2 changes: 1 addition & 1 deletion autowiring/MicroAutoFilter.h
Expand Up @@ -41,7 +41,7 @@ struct MicroAutoFilter<Deferred, Args...> {

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

Expand Down
1 change: 1 addition & 0 deletions src/autowiring/CMakeLists.txt
Expand Up @@ -51,6 +51,7 @@ set(Autowiring_SRCS
CreationRules.h
CurrentContextPusher.cpp
CurrentContextPusher.h
DeclareAutoFilter.h
Decompose.h
DecorationDisposition.h
Deserialize.h
Expand Down
46 changes: 38 additions & 8 deletions src/autowiring/test/AutoFilterTest.cpp
Expand Up @@ -5,7 +5,8 @@
#include <autowiring/AutoPacketFactory.h>
#include <autowiring/Deferred.h>
#include <autowiring/NewAutoFilter.h>
#include "AutoSelfUpdate.h"
#include <autowiring/DeclareAutoFilter.h>
#include <autowiring/AutoSelfUpdate.h>
#include THREAD_HEADER

class AutoFilterTest:
Expand Down Expand Up @@ -1126,17 +1127,46 @@ TEST_F(AutoFilterTest, MicroAutoFilterTests) {
ASSERT_EQ(1, extVal);
}

struct MultiFilter01 {
std::list<int> call_vals;
void Call0(const Decoration<0>& arg) { call_vals.push_back(arg.i); }
void Call1(const Decoration<1>& arg) { call_vals.push_back(arg.i); }

MultiFilter01() {
// Constructor wraps each method in an AutoFilter call
DeclareAutoFilter(this, &MultiFilter01::Call0);
DeclareAutoFilter(this, &MultiFilter01::Call1);
}
};

TEST_F(AutoFilterTest, DeclareAutoFilterTest) {
AutoCurrentContext()->Initiate();
AutoRequired<AutoPacketFactory> factory;
AutoRequired<MultiFilter01> mf01;

auto packetA = factory->NewPacket();
packetA->Decorate(Decoration<0>());
ASSERT_EQ(1, mf01->call_vals.size()) << "Failed to call AutoFilter wrapped method";
ASSERT_EQ(0, mf01->call_vals.back()) << "Calling value was not propagated";

auto packetB = factory->NewPacket();
packetB->Decorate(Decoration<1>());
ASSERT_EQ(2, mf01->call_vals.size()) << "Failed to call AutoFilter wrapped method";
ASSERT_EQ(1, mf01->call_vals.back()) << "Calling value was not propagated";

packetA->Decorate(Decoration<1>(2));
ASSERT_EQ(3, mf01->call_vals.size()) << "Failed to call AutoFilter wrapped method";
ASSERT_EQ(2, mf01->call_vals.back()) << "Calling value was not propagated";
}

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

TEST_F(AutoFilterTest, DISABLED_FunctionDecorationTest) {
TEST_F(AutoFilterTest, FunctionDecorationTest) {
// AddRecipient that is an instance of std::function f : a -> b
// This must be satisfied by decoration of type a,
// independent of the order of decoration.
//(1) From function
//(2) From method
//(3) From lambda

AutoCurrentContext()->Initiate();
AutoRequired<AutoPacketFactory> factory;
Expand All @@ -1161,7 +1191,7 @@ TEST_F(AutoFilterTest, DISABLED_FunctionDecorationTest) {
}
}

TEST_F(AutoFilterTest, DISABLED_FunctionDecorationLambdaTest) {
TEST_F(AutoFilterTest, FunctionDecorationLambdaTest) {
AutoCurrentContext()->Initiate();
AutoRequired<AutoPacketFactory> factory;

Expand All @@ -1181,7 +1211,7 @@ TEST_F(AutoFilterTest, DISABLED_FunctionDecorationLambdaTest) {

typedef std::function<void(auto_out<Decoration<0>>)> InjectorFunctionType;

TEST_F(AutoFilterTest, DISABLED_FunctionInjectorTest) {
TEST_F(AutoFilterTest, FunctionInjectorTest) {
AutoCurrentContext()->Initiate();
AutoRequired<AutoPacketFactory> factory;

Expand All @@ -1197,7 +1227,7 @@ TEST_F(AutoFilterTest, DISABLED_FunctionInjectorTest) {

typedef std::function<void(const Decoration<1>&)> ExtractorFunctionType;

TEST_F(AutoFilterTest, DISABLED_FunctionExtractorTest) {
TEST_F(AutoFilterTest, FunctionExtractorTest) {
AutoCurrentContext()->Initiate();
AutoRequired<AutoPacketFactory> factory;

Expand Down

0 comments on commit fd8c114

Please sign in to comment.