/*================================================================================================== 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 #elif _MSC_VER == 1800 #define BRIGAND_COMP_MSVC_2013 #endif #elif __INTEL_COMPILER #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 && __CUDACC_VER_MINOR__ == 0 && __CUDACC_VER_BUILD__ <= 102) #define BRIGAND_COMP_CUDA_9_RC #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