• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2     Copyright (c) 2001-2011 Joel de Guzman
3 
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 #if !defined(BOOST_SPIRIT_RANGE_FUNCTIONS_MAY_16_2006_0720_PM)
8 #define BOOST_SPIRIT_RANGE_FUNCTIONS_MAY_16_2006_0720_PM
9 
10 #if defined(_MSC_VER)
11 #pragma once
12 #endif
13 
14 #include <limits>
15 
16 namespace boost { namespace spirit { namespace support { namespace detail
17 {
18     template <typename Range>
19     inline bool
is_valid(Range const & range)20     is_valid(Range const& range)
21     {
22         // test for valid ranges
23         return range.first <= range.last;
24     }
25 
26     template <typename Range>
27     inline bool
includes(Range const & range,Range const & other)28     includes(Range const& range, Range const& other)
29     {
30         // see if two ranges intersect
31         return (range.first <= other.first) && (range.last >= other.last);
32     }
33 
34     template <typename Range>
35     inline bool
includes(Range const & range,typename Range::value_type val)36     includes(Range const& range, typename Range::value_type val)
37     {
38         // see if val is in range
39         return (range.first <= val) && (range.last >= val);
40     }
41 
42     template <typename Range>
43     inline bool
can_merge(Range const & range,Range const & other)44     can_merge(Range const& range, Range const& other)
45     {
46         // see if a 'range' overlaps, or is adjacent to
47         // another range 'other', so we can merge them
48 
49         typedef typename Range::value_type value_type;
50         typedef std::numeric_limits<value_type> limits;
51 
52         value_type decr_first =
53             range.first == limits::min()
54             ? range.first : range.first-1;
55 
56         value_type incr_last =
57             range.last == limits::max()
58             ? range.last : range.last+1;
59 
60         return (decr_first <= other.last) && (incr_last >= other.first);
61     }
62 
63     template <typename Range>
64     inline void
merge(Range & result,Range const & other)65     merge(Range& result, Range const& other)
66     {
67         // merge two ranges
68         if (result.first > other.first)
69             result.first = other.first;
70         if (result.last < other.last)
71             result.last = other.last;
72     }
73 
74     template <typename Range>
75     struct range_compare
76     {
77         // compare functor with a value or another range
78 
79         typedef typename Range::value_type value_type;
80 
operator ()boost::spirit::support::detail::range_compare81         bool operator()(Range const& x, const value_type y) const
82         {
83             return x.first < y;
84         }
85 
operator ()boost::spirit::support::detail::range_compare86         bool operator()(value_type const x, Range const& y) const
87         {
88             return x < y.first;
89         }
90 
operator ()boost::spirit::support::detail::range_compare91         bool operator()(Range const& x, Range const& y) const
92         {
93             return x.first < y.first;
94         }
95     };
96 }}}}
97 
98 #endif
99