boost/xpressive/detail/static/regex_operators.hpp
///////////////////////////////////////////////////////////////////////////////
// regex_operators.hpp
//
// Copyright 2005 Eric Niebler. 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)
#ifndef BOOST_XPRESSIVE_DETAIL_STATIC_REGEX_OPERATORS_HPP_EAN_10_04_2005
#define BOOST_XPRESSIVE_DETAIL_STATIC_REGEX_OPERATORS_HPP_EAN_10_04_2005
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
#include <boost/utility/enable_if.hpp>
#include <boost/xpressive/proto/proto.hpp>
#include <boost/xpressive/basic_regex.hpp>
namespace boost { namespace xpressive
{
///////////////////////////////////////////////////////////////////////////////
// operator +
template<typename BidiIter>
inline proto::unary_op
<
proto::unary_op<basic_regex<BidiIter>, proto::noop_tag>
, proto::unary_plus_tag
>
operator +(basic_regex<BidiIter> const ®ex)
{
return +proto::noop(regex);
}
///////////////////////////////////////////////////////////////////////////////
// operator *
template<typename BidiIter>
inline proto::unary_op
<
proto::unary_op<basic_regex<BidiIter>, proto::noop_tag>
, proto::unary_star_tag
>
operator *(basic_regex<BidiIter> const ®ex)
{
return *proto::noop(regex);
}
///////////////////////////////////////////////////////////////////////////////
// operator !
template<typename BidiIter>
inline proto::unary_op
<
proto::unary_op<basic_regex<BidiIter>, proto::noop_tag>
, proto::logical_not_tag
>
operator !(basic_regex<BidiIter> const ®ex)
{
return !proto::noop(regex);
}
///////////////////////////////////////////////////////////////////////////////
// operator >>
template<typename Right, typename BidiIter>
inline typename disable_if
<
proto::is_op<Right>
, proto::binary_op
<
proto::unary_op<basic_regex<BidiIter>, proto::noop_tag>
, proto::unary_op<Right, proto::noop_tag>
, proto::right_shift_tag
>
>::type
operator >>(basic_regex<BidiIter> const ®ex, Right const &right)
{
return proto::noop(regex) >> proto::noop(right);
}
///////////////////////////////////////////////////////////////////////////////
// operator >>
template<typename BidiIter, typename Left>
inline typename disable_if
<
proto::is_op<Left>
, proto::binary_op
<
proto::unary_op<Left, proto::noop_tag>
, proto::unary_op<basic_regex<BidiIter>, proto::noop_tag>
, proto::right_shift_tag
>
>::type
operator >>(Left const &left, basic_regex<BidiIter> const ®ex)
{
return proto::noop(left) >> proto::noop(regex);
}
///////////////////////////////////////////////////////////////////////////////
// operator >>
template<typename BidiIter>
inline proto::binary_op
<
proto::unary_op<basic_regex<BidiIter>, proto::noop_tag>
, proto::unary_op<basic_regex<BidiIter>, proto::noop_tag>
, proto::right_shift_tag
>
operator >>(basic_regex<BidiIter> const &left, basic_regex<BidiIter> const &right)
{
return proto::noop(left) >> proto::noop(right);
}
///////////////////////////////////////////////////////////////////////////////
// operator |
template<typename Right, typename BidiIter>
inline typename disable_if
<
proto::is_op<Right>
, proto::binary_op
<
proto::unary_op<basic_regex<BidiIter>, proto::noop_tag>
, proto::unary_op<Right, proto::noop_tag>
, proto::bitor_tag
>
>::type
operator |(basic_regex<BidiIter> const ®ex, Right const &right)
{
return proto::noop(regex) | proto::noop(right);
}
///////////////////////////////////////////////////////////////////////////////
// operator |
template<typename BidiIter, typename Left>
inline typename disable_if
<
proto::is_op<Left>
, proto::binary_op
<
proto::unary_op<Left, proto::noop_tag>
, proto::unary_op<basic_regex<BidiIter>, proto::noop_tag>
, proto::bitor_tag
>
>::type
operator |(Left const &left, basic_regex<BidiIter> const ®ex)
{
return proto::noop(left) | proto::noop(regex);
}
///////////////////////////////////////////////////////////////////////////////
// operator |
template<typename BidiIter>
inline proto::binary_op
<
proto::unary_op<basic_regex<BidiIter>, proto::noop_tag>
, proto::unary_op<basic_regex<BidiIter>, proto::noop_tag>
, proto::bitor_tag
>
operator |(basic_regex<BidiIter> const &left, basic_regex<BidiIter> const &right)
{
return proto::noop(left) | proto::noop(right);
}
}}
#endif