diff --git a/autowiring/AutoPacket.h b/autowiring/AutoPacket.h index 46b871601..e6097c33c 100644 --- a/autowiring/AutoPacket.h +++ b/autowiring/AutoPacket.h @@ -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 #include #include MEMORY_HEADER diff --git a/autowiring/MicroAutoFilter.h b/autowiring/MicroAutoFilter.h new file mode 100644 index 000000000..942ad3be1 --- /dev/null +++ b/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" + +/// +/// Transmutes a function returning void to an instance that can be called by AutoPacket. +/// The specializations distinguish between void and Deferred return types. +/// +/// +/// The default constructor yields an AutoFilter that does nothing. +/// +template +struct MicroAutoFilter { + // This case pertains only when the return value is not recognized + static_assert(is_auto_filter_return{}, + "The return is not an allowed type for AutoFilter methods"); +}; +template +struct MicroAutoFilter { + MicroAutoFilter(const std::function& filter) : m_filter(filter) { + static_assert(all_auto_filter_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 m_filter; +}; +template +struct MicroAutoFilter { + MicroAutoFilter(const std::function& filter) : m_filter(filter) { + static_assert(all_auto_filter_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 m_filter; +}; diff --git a/src/autowiring/CMakeLists.txt b/src/autowiring/CMakeLists.txt index e473092a5..c8e46a1e5 100644 --- a/src/autowiring/CMakeLists.txt +++ b/src/autowiring/CMakeLists.txt @@ -90,6 +90,7 @@ set(Autowiring_SRCS ObjectPoolMonitor.cpp optional_ptr.h SatCounter.h + MicroAutoFilter.h MicroBolt.h SharedPointerSlot.h SlotInformation.h diff --git a/src/autowiring/test/AutoFilterTest.cpp b/src/autowiring/test/AutoFilterTest.cpp index bedf9f2b3..e6eab35e7 100644 --- a/src/autowiring/test/AutoFilterTest.cpp +++ b/src/autowiring/test/AutoFilterTest.cpp @@ -1106,6 +1106,17 @@ TEST_F(AutoFilterTest, AutoFilterTemplateTests) { ASSERT_TRUE(static_cast(is_auto_filter::value)) << "Valid AutoFilter function identified as invalid"; } +TEST_F(AutoFilterTest, MicroAutoFilterTests) { + int extVal = -1; + std::function filter([&extVal] (const int& getVal) { + extVal = getVal; + }); + MicroAutoFilter makeImmediate(filter); + int setVal = 1; + makeImmediate.AutoFilter(setVal); + ASSERT_EQ(1, extVal); +} + void FilterFunction(const Decoration<0>& typeIn, auto_out> typeOut) { typeOut->i += 1 + typeIn.i; }