variant
A type safe generalized union type
relational.hpp
1 /*
2  * Boost Software License - Version 1.0 - August 17th, 2003
3  *
4  * Permission is hereby granted, free of charge, to any person or organization
5  * obtaining a copy of the software and accompanying documentation covered by
6  * this license (the "Software") to use, reproduce, display, distribute,
7  * execute, and transmit the Software, and to prepare derivative works of the
8  * Software, and to permit third-parties to whom the Software is furnished to
9  * do so, all subject to the following:
10  *
11  * The copyright notices in the Software and this entire statement, including
12  * the above license grant, this restriction and the following disclaimer,
13  * must be included in all copies of the Software, in whole or in part, and
14  * all derivative works of the Software, unless such copies or derivative
15  * works are solely in the form of machine-executable object code generated by
16  * a source language processor.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
21  * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
22  * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
23  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24  * DEALINGS IN THE SOFTWARE.
25  *
26  */
27 
28 #ifndef VARIANT_RELATIONAL_HPP
29 #define VARIANT_RELATIONAL_HPP
30 
31 #include <type_traits>
32 
33 namespace detail
34 {
35 
36 // These will be replaced by C++1z fold expressions when available
37 template<class ... Args>
38 using and_ = std::is_same<
39  std::integer_sequence<bool, Args::value ... >,
40  std::integer_sequence<bool, std::conditional_t< true, bool, Args >(true) ... > >;
41 
42 template<class T>
43 using not_ = std::integral_constant<bool, !T::value>;
44 
45 template<class ... Args>
46 using or_ = not_<std::is_same<
47  std::integer_sequence<bool, Args::value ... >,
48  std::integer_sequence<bool, std::conditional_t< true, bool, Args >(false) ... > > >;
49 }
50 
51 #endif //VARIANT_RELATIONAL_HPP
Definition: relational.hpp:33