/*============================================================================= 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 namespace boost { namespace spirit { namespace support { namespace detail { template inline bool is_valid(Range const& range) { // test for valid ranges return range.first <= range.last; } template inline bool includes(Range const& range, Range const& other) { // see if two ranges intersect return (range.first <= other.first) && (range.last >= other.last); } template 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 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 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 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 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