blob: 8b9d68490edd17048ee6daff6628eec23f71c661 [file] [log] [blame]
/*=============================================================================
Copyright (c) 2001-2007 Joel de Guzman
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#if !defined(BOOST_SPIRIT_UNUSED_APR_16_2006_0616PM)
#define BOOST_SPIRIT_UNUSED_APR_16_2006_0616PM
#include <boost/fusion/include/unused.hpp>
#include <boost/fusion/include/empty.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/not.hpp>
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_same.hpp>
namespace boost { namespace spirit
{
///////////////////////////////////////////////////////////////////////////
// since boost::fusion now supports exactly what we need, unused is simply
// imported from the fusion namespace
///////////////////////////////////////////////////////////////////////////
typedef boost::fusion::unused_type unused_type;
using boost::fusion::unused;
///////////////////////////////////////////////////////////////////////////
namespace traits
{
// We use this test to detect if the argument is not a unused_type
template <typename T>
struct is_not_unused
: mpl::not_<is_same<T, unused_type> >
{};
// Return unused_type if Target is same as Actual, else
// return Attribute (Attribute defaults to Actual).
template <typename Target, typename Actual, typename Attribute = Actual>
struct unused_if_same
: mpl::if_<is_same<Target, Actual>, unused_type, Attribute>
{};
// Return unused_type if Sequence is empty, else return Attribute.
// (Attribute defaults to Sequence).
template <typename Sequence, typename Attribute = Sequence>
struct unused_if_empty
: mpl::if_<fusion::result_of::empty<Sequence>, unused_type, Attribute>
{};
}
}}
#endif