/*================================================================================================== Copyright (c) 2015 Edouard Alligand and Joel Falcou Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) =================================================================================================**/ #ifndef BRIGAND_HPP_INCLUDED #define BRIGAND_HPP_INCLUDED #ifndef BRIGAND_NO_BOOST_SUPPORT #define BRIGAND_NO_BOOST_SUPPORT #endif #if defined(_MSC_VER) && !defined(__GNUC__) && !defined(__clang__) #define BRIGAND_COMP_MSVC #if _MSC_VER == 1900 #define BRIGAND_COMP_MSVC_2015 #endif #elif defined(__INTEL_COMPILER) || defined(__ICC) #define BRIGAND_COMP_INTEL #elif __GNUC__ #ifndef __clang__ #define BRIGAND_COMP_GCC #else #define BRIGAND_COMP_CLANG #endif #endif #if defined(__CUDACC__) #if __CUDACC_VER_MAJOR__ == 9 #define BRIGAND_COMP_CUDA_9 #endif #if __CUDACC_VER_MAJOR__ >= 9 #define BRIGAND_COMP_CUDA_9PLUS #endif #if __CUDACC_VER_MAJOR__ > 10 || (__CUDACC_VER_MAJOR__ == 10 && __CUDACC_VER_MINOR__ >= 2) #define BRIGAND_COMP_CUDA_10_2PLUS #endif #define BRIGAND_COMP_CUDA #endif #include namespace brigand { template struct list {}; template using integral_list = brigand::list< std::integral_constant...>; using empty_sequence = brigand::list<>; } namespace brigand { namespace lazy { template class B> struct wrap; template class A, class... T, template class B> struct wrap, B> { using type = B; }; } template class B> using wrap = typename lazy::wrap::type; } namespace brigand { namespace detail { template struct append_impl { using type = brigand::empty_sequence; }; template struct append_impl { using type = T; }; template