Point Cloud Library (PCL) 1.13.0
for_each_type.h
1/*
2 * Software License Agreement (BSD License)
3 *
4 * Point Cloud Library (PCL) - www.pointclouds.org
5 * Copyright (c) 2010-2011, Willow Garage, Inc.
6 *
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * * Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * * Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following
17 * disclaimer in the documentation and/or other materials provided
18 * with the distribution.
19 * * Neither the name of the copyright holder(s) nor the names of its
20 * contributors may be used to endorse or promote products derived
21 * from this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 *
36 * $Id$
37 *
38 */
39
40#pragma once
41
42#ifdef __GNUC__
43#pragma GCC system_header
44#endif
45
46#include <boost/mpl/is_sequence.hpp>
47#include <boost/mpl/begin_end.hpp>
48#include <boost/mpl/next_prior.hpp>
49#include <boost/mpl/deref.hpp>
50#include <boost/mpl/assert.hpp>
51#include <boost/mpl/remove_if.hpp>
52#include <boost/mpl/contains.hpp>
53#include <boost/mpl/not.hpp>
54#include <boost/mpl/aux_/unwrap.hpp>
55
56#include <type_traits>
57
58namespace pcl
59{
60 //////////////////////////////////////////////////////////////////////////////////////////////
61 template <bool done = true>
63 {
64 template<typename Iterator, typename LastIterator, typename F>
65 static void execute (F) {}
66 };
67
68 //////////////////////////////////////////////////////////////////////////////////////////////
69 template <>
70 struct for_each_type_impl<false>
71 {
72 template<typename Iterator, typename LastIterator, typename F>
73 static void execute (F f)
74 {
75 using arg = typename boost::mpl::deref<Iterator>::type;
76
77#if (defined _WIN32 && defined _MSC_VER && !defined(__clang__))
78 boost::mpl::aux::unwrap (f, 0).operator()<arg> ();
79#else
80 boost::mpl::aux::unwrap (f, 0).template operator()<arg> ();
81#endif
82
83 using iter = typename boost::mpl::next<Iterator>::type;
85 ::template execute<iter, LastIterator, F> (f);
86 }
87 };
88
89 //////////////////////////////////////////////////////////////////////////////////////////////
90 template<typename Sequence, typename F> inline void
92 {
93 BOOST_MPL_ASSERT (( boost::mpl::is_sequence<Sequence> ));
94 using first = typename boost::mpl::begin<Sequence>::type;
95 using last = typename boost::mpl::end<Sequence>::type;
96 for_each_type_impl<std::is_same<first, last>::value>::template execute<first, last, F> (f);
97 }
98
99 //////////////////////////////////////////////////////////////////////////////////////////////
100 template <typename Sequence1, typename Sequence2>
101 struct intersect
102 {
103 using type = typename boost::mpl::remove_if<Sequence1, boost::mpl::not_<boost::mpl::contains<Sequence2, boost::mpl::_1> > >::type;
104 };
105}
void for_each_type(F f)
Definition: for_each_type.h:91
static void execute(F)
Definition: for_each_type.h:65
typename boost::mpl::remove_if< Sequence1, boost::mpl::not_< boost::mpl::contains< Sequence2, boost::mpl::_1 > > >::type type