1 /*============================================================================= 2 Copyright (c) 2001-2011 Joel de Guzman 3 Copyright (c) 2001-2011 Hartmut Kaiser 4 5 Distributed under the Boost Software License, Version 1.0. (See accompanying 6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 ==============================================================================*/ 8 #if !defined(BOOST_SPIRIT_UNUSED_APRIL_16_2006_0616PM) 9 #define BOOST_SPIRIT_UNUSED_APRIL_16_2006_0616PM 10 11 #if defined(_MSC_VER) 12 #pragma once 13 #endif 14 15 #include <boost/config.hpp> 16 #include <boost/mpl/bool.hpp> 17 18 #if defined(BOOST_MSVC) 19 # pragma warning(push) 20 # pragma warning(disable: 4522) // multiple assignment operators specified warning 21 #endif 22 23 /////////////////////////////////////////////////////////////////////////////// 24 namespace boost { namespace spirit 25 { 26 /////////////////////////////////////////////////////////////////////////// 27 // We do not import fusion ::unused_type anymore to avoid boost::fusion 28 // being turned into an associate namespace for boost::spirit, as this 29 // interferes with ADL in unexpected ways. We rather copy the full 30 // unused_type implementation from boost::fusion. 31 /////////////////////////////////////////////////////////////////////////// 32 struct unused_type 33 { unused_typeboost::spirit::unused_type34 unused_type() 35 { 36 } 37 38 template <typename T> unused_typeboost::spirit::unused_type39 unused_type(T const&) 40 { 41 } 42 43 template <typename T> 44 unused_type const& operator =boost::spirit::unused_type45 operator=(T const&) const 46 { 47 return *this; 48 } 49 50 template <typename T> 51 unused_type& operator =boost::spirit::unused_type52 operator=(T const&) 53 { 54 return *this; 55 } 56 57 unused_type const& operator =boost::spirit::unused_type58 operator=(unused_type const&) const 59 { 60 return *this; 61 } 62 63 unused_type& operator =boost::spirit::unused_type64 operator=(unused_type const&) 65 { 66 return *this; 67 } 68 }; 69 70 unused_type const unused = unused_type(); 71 72 namespace detail 73 { 74 struct unused_only 75 { unused_onlyboost::spirit::detail::unused_only76 unused_only(unused_type const&) {} 77 }; 78 } 79 80 template <typename Out> operator <<(Out & out,detail::unused_only const &)81 inline Out& operator<<(Out& out, detail::unused_only const&) 82 { 83 return out; 84 } 85 86 template <typename In> operator >>(In & in,unused_type &)87 inline In& operator>>(In& in, unused_type&) 88 { 89 return in; 90 } 91 92 /////////////////////////////////////////////////////////////////////////// 93 namespace traits 94 { 95 // We use this test to detect if the argument is not an unused_type 96 template <typename T> struct not_is_unused : mpl::true_ {}; 97 template <> struct not_is_unused<unused_type> : mpl::false_ {}; 98 } 99 }} 100 101 #if defined(BOOST_MSVC) 102 # pragma warning(pop) 103 #endif 104 105 #endif 106