/*=============================================================================
|
Copyright (c) 2001-2011 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_RANGE_FUNCTIONS_MAY_16_2006_0720_PM)
|
#define BOOST_SPIRIT_RANGE_FUNCTIONS_MAY_16_2006_0720_PM
|
|
#if defined(_MSC_VER)
|
#pragma once
|
#endif
|
|
#include <boost/integer_traits.hpp>
|
|
namespace boost { namespace spirit { namespace support { namespace detail
|
{
|
template <typename Range>
|
inline bool
|
is_valid(Range const& range)
|
{
|
// test for valid ranges
|
return range.first <= range.last;
|
}
|
|
template <typename Range>
|
inline bool
|
includes(Range const& range, Range const& other)
|
{
|
// see if two ranges intersect
|
return (range.first <= other.first) && (range.last >= other.last);
|
}
|
|
template <typename Range>
|
inline bool
|
includes(Range const& range, typename Range::value_type val)
|
{
|
// see if val is in range
|
return (range.first <= val) && (range.last >= val);
|
}
|
|
template <typename Range>
|
inline bool
|
can_merge(Range const& range, Range const& other)
|
{
|
// see if a 'range' overlaps, or is adjacent to
|
// another range 'other', so we can merge them
|
|
typedef typename Range::value_type value_type;
|
typedef integer_traits<value_type> integer_traits;
|
|
value_type decr_first =
|
range.first == integer_traits::const_min
|
? range.first : range.first-1;
|
|
value_type incr_last =
|
range.last == integer_traits::const_max
|
? range.last : range.last+1;
|
|
return (decr_first <= other.last) && (incr_last >= other.first);
|
}
|
|
template <typename Range>
|
inline void
|
merge(Range& result, Range const& other)
|
{
|
// merge two ranges
|
if (result.first > other.first)
|
result.first = other.first;
|
if (result.last < other.last)
|
result.last = other.last;
|
}
|
|
template <typename Range>
|
struct range_compare
|
{
|
// compare functor with a value or another range
|
|
typedef typename Range::value_type value_type;
|
|
bool operator()(Range const& x, const value_type y) const
|
{
|
return x.first < y;
|
}
|
|
bool operator()(value_type const x, Range const& y) const
|
{
|
return x < y.first;
|
}
|
|
bool operator()(Range const& x, Range const& y) const
|
{
|
return x.first < y.first;
|
}
|
};
|
}}}}
|
|
#endif
|