-
Notifications
You must be signed in to change notification settings - Fork 17
/
MicroAutoFilter.h
60 lines (53 loc) · 1.51 KB
/
MicroAutoFilter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Copyright (C) 2012-2014 Leap Motion, Inc. All rights reserved.
#pragma once
#include "ContextMember.h"
#include "Deferred.h"
#include FUNCTIONAL_HEADER
/// <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:
public ContextMember
{
MicroAutoFilter(const std::function<void(Args...)>&&):
ContextMember("MicroAutoFilter")
{}
// This AutoFilter method will be identified as invalid due to the return type
Ret AutoFilter(Args...) {}
};
template<class... Args>
struct MicroAutoFilter<void, Args...>:
public ContextMember
{
MicroAutoFilter(const std::function<void(Args...)>&& filter):
ContextMember("MicroAutoFilter"),
m_filter(std::move(filter))
{}
void AutoFilter(Args... args) {
if (m_filter)
return m_filter(std::forward<Args>(args)...);
}
protected:
std::function<void(Args...)> m_filter;
};
template<class... Args>
struct MicroAutoFilter<Deferred, Args...> :
public ContextMember
{
MicroAutoFilter(const std::function<void(Args...)>&& filter):
ContextMember("MicroAutoFilter"),
m_filter(std::move(filter))
{}
Deferred AutoFilter(Args... args) {
if (m_filter)
return m_filter(args...);
return Deferred(this);
}
protected:
std::function<void(Args...)> m_filter;
};