-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfilter.cpp
More file actions
76 lines (67 loc) · 1.79 KB
/
filter.cpp
File metadata and controls
76 lines (67 loc) · 1.79 KB
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <cassert>
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>
#include <cstring>
#include "version.h"
using ip_container = std::vector<std::vector<int>>;
template<typename T>
ip_container filter_any(ip_container& container, T t)
{
ip_container result;
for(const auto & ip : container)
{
if(std::any_of(ip.begin(), ip.end(),
[t](int ip_part){return t == ip_part;}))
{
// if(!std::any_of(result.begin(), result.end(),
// [ip](std::vector<int> v){return v == ip;}))
result.push_back(ip);
}
}
return result;
}
template <typename T, typename ... P>
ip_container filter_any(ip_container container, T t, P ... p)
{
auto intermediateResult = filter_any(container, t);
auto result = filter_any(intermediateResult, p...);
return result;
}
template<int N,typename T>
ip_container filter(ip_container& ip_pool, T t)
{
ip_container result;
std::copy_if(ip_pool.begin(), ip_pool.end(), std::back_inserter(result),
[t, &result](std::vector<int> v)
{
if(v.at(N) == t)
{
return true;
// !std::any_of(result.begin(), result.end(),
// [&v](std::vector<int> ip){return v == ip;});
}
else return false;
});
return result;
}
template<int N, typename T, typename ... P>
ip_container filter(ip_container& ip_pool, T t, P ...p)
{
auto intermediateResult = filter<N>(ip_pool,t);
auto result = filter<N+1>(intermediateResult,p...);
return result;
}
template<typename ... P>
ip_container filter(ip_container& ip_pool, P ...p)
{
auto result = filter<0>(ip_pool, p...);
return result;
}
int version()
{
return PROJECT_VERSION_PATCH;
}