os/ossrv/ossrv_pub/boost_apis/boost/spirit/utility/distinct.hpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*=============================================================================
sl@0
     2
    Copyright (c) 1998-2003 Joel de Guzman
sl@0
     3
    Copyright (c) 2003 Vaclav Vesely
sl@0
     4
    http://spirit.sourceforge.net/
sl@0
     5
sl@0
     6
    Use, modification and distribution is subject to the Boost Software
sl@0
     7
    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
sl@0
     8
    http://www.boost.org/LICENSE_1_0.txt)
sl@0
     9
=============================================================================*/
sl@0
    10
#if !defined(BOOST_SPIRIT_DISTINCT_HPP)
sl@0
    11
#define BOOST_SPIRIT_DISTINCT_HPP
sl@0
    12
sl@0
    13
#include <boost/spirit/core/parser.hpp>
sl@0
    14
#include <boost/spirit/core/primitives/primitives.hpp>
sl@0
    15
#include <boost/spirit/core/composite/operators.hpp>
sl@0
    16
#include <boost/spirit/core/composite/directives.hpp>
sl@0
    17
#include <boost/spirit/core/composite/epsilon.hpp>
sl@0
    18
#include <boost/spirit/core/non_terminal/rule.hpp>
sl@0
    19
#include <boost/spirit/utility/chset.hpp>
sl@0
    20
sl@0
    21
#include <boost/spirit/utility/distinct_fwd.hpp>
sl@0
    22
sl@0
    23
namespace boost {
sl@0
    24
    namespace spirit {
sl@0
    25
//-----------------------------------------------------------------------------
sl@0
    26
// distinct_parser class
sl@0
    27
sl@0
    28
template <typename CharT, typename TailT>
sl@0
    29
class distinct_parser
sl@0
    30
{
sl@0
    31
public:
sl@0
    32
    typedef
sl@0
    33
        contiguous<
sl@0
    34
            sequence<
sl@0
    35
                chseq<CharT const*>,
sl@0
    36
                negated_empty_match_parser<
sl@0
    37
                    TailT
sl@0
    38
                >
sl@0
    39
            >
sl@0
    40
        >
sl@0
    41
            result_t;
sl@0
    42
sl@0
    43
    distinct_parser()
sl@0
    44
    :   tail(chset<CharT>())
sl@0
    45
    {
sl@0
    46
    }
sl@0
    47
sl@0
    48
    explicit distinct_parser(parser<TailT> const & tail_)
sl@0
    49
    :   tail(tail_.derived())
sl@0
    50
    {
sl@0
    51
    }
sl@0
    52
sl@0
    53
    explicit distinct_parser(CharT const* letters)
sl@0
    54
    :   tail(chset_p(letters))
sl@0
    55
    {
sl@0
    56
    }
sl@0
    57
sl@0
    58
    result_t operator()(CharT const* str) const
sl@0
    59
    {
sl@0
    60
        return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
sl@0
    61
    }
sl@0
    62
sl@0
    63
    TailT tail;
sl@0
    64
};
sl@0
    65
sl@0
    66
//-----------------------------------------------------------------------------
sl@0
    67
// distinct_directive class
sl@0
    68
sl@0
    69
template <typename CharT, typename TailT>
sl@0
    70
class distinct_directive
sl@0
    71
{
sl@0
    72
public:
sl@0
    73
    template<typename ParserT>
sl@0
    74
    struct result {
sl@0
    75
        typedef
sl@0
    76
            contiguous<
sl@0
    77
                sequence<
sl@0
    78
                    ParserT,
sl@0
    79
                    negated_empty_match_parser<
sl@0
    80
                        TailT
sl@0
    81
                    >
sl@0
    82
                >
sl@0
    83
            >
sl@0
    84
                type;
sl@0
    85
    };
sl@0
    86
sl@0
    87
    distinct_directive()
sl@0
    88
    :   tail(chset<CharT>())
sl@0
    89
    {
sl@0
    90
    }
sl@0
    91
sl@0
    92
    explicit distinct_directive(CharT const* letters)
sl@0
    93
    :   tail(chset_p(letters))
sl@0
    94
    {
sl@0
    95
    }
sl@0
    96
sl@0
    97
    explicit distinct_directive(parser<TailT> const & tail_)
sl@0
    98
    :   tail(tail_.derived())
sl@0
    99
    {
sl@0
   100
    }
sl@0
   101
sl@0
   102
    template<typename ParserT>
sl@0
   103
    typename result<typename as_parser<ParserT>::type>::type
sl@0
   104
        operator[](ParserT const &subject) const
sl@0
   105
    {
sl@0
   106
        return
sl@0
   107
            lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
sl@0
   108
    }
sl@0
   109
sl@0
   110
    TailT tail;
sl@0
   111
};
sl@0
   112
sl@0
   113
//-----------------------------------------------------------------------------
sl@0
   114
// dynamic_distinct_parser class
sl@0
   115
sl@0
   116
template <typename ScannerT>
sl@0
   117
class dynamic_distinct_parser
sl@0
   118
{
sl@0
   119
public:
sl@0
   120
    typedef typename ScannerT::value_t char_t;
sl@0
   121
sl@0
   122
    typedef
sl@0
   123
        rule<
sl@0
   124
            typename no_actions_scanner<
sl@0
   125
                typename lexeme_scanner<ScannerT>::type
sl@0
   126
            >::type
sl@0
   127
        >
sl@0
   128
            tail_t;
sl@0
   129
sl@0
   130
    typedef
sl@0
   131
        contiguous<
sl@0
   132
            sequence<
sl@0
   133
                chseq<char_t const*>,
sl@0
   134
                negated_empty_match_parser<
sl@0
   135
                    tail_t
sl@0
   136
                >
sl@0
   137
            >
sl@0
   138
        >
sl@0
   139
            result_t;
sl@0
   140
sl@0
   141
    dynamic_distinct_parser()
sl@0
   142
    :   tail(nothing_p)
sl@0
   143
    {
sl@0
   144
    }
sl@0
   145
sl@0
   146
    template<typename ParserT>
sl@0
   147
    explicit dynamic_distinct_parser(parser<ParserT> const & tail_)
sl@0
   148
    :   tail(tail_.derived())
sl@0
   149
    {
sl@0
   150
    }
sl@0
   151
sl@0
   152
    explicit dynamic_distinct_parser(char_t const* letters)
sl@0
   153
    :   tail(chset_p(letters))
sl@0
   154
    {
sl@0
   155
    }
sl@0
   156
sl@0
   157
    result_t operator()(char_t const* str) const
sl@0
   158
    {
sl@0
   159
        return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
sl@0
   160
    }
sl@0
   161
sl@0
   162
    tail_t tail;
sl@0
   163
};
sl@0
   164
sl@0
   165
//-----------------------------------------------------------------------------
sl@0
   166
// dynamic_distinct_directive class
sl@0
   167
sl@0
   168
template <typename ScannerT>
sl@0
   169
class dynamic_distinct_directive
sl@0
   170
{
sl@0
   171
public:
sl@0
   172
    typedef typename ScannerT::value_t char_t;
sl@0
   173
sl@0
   174
    typedef
sl@0
   175
        rule<
sl@0
   176
            typename no_actions_scanner<
sl@0
   177
                typename lexeme_scanner<ScannerT>::type
sl@0
   178
            >::type
sl@0
   179
        >
sl@0
   180
            tail_t;
sl@0
   181
sl@0
   182
    template<typename ParserT>
sl@0
   183
    struct result {
sl@0
   184
        typedef
sl@0
   185
            contiguous<
sl@0
   186
                sequence<
sl@0
   187
                    ParserT,
sl@0
   188
                    negated_empty_match_parser<
sl@0
   189
                        tail_t
sl@0
   190
                    >
sl@0
   191
                >
sl@0
   192
            >
sl@0
   193
                type;
sl@0
   194
    };
sl@0
   195
sl@0
   196
    dynamic_distinct_directive()
sl@0
   197
    :   tail(nothing_p)
sl@0
   198
    {
sl@0
   199
    }
sl@0
   200
sl@0
   201
    template<typename ParserT>
sl@0
   202
    explicit dynamic_distinct_directive(parser<ParserT> const & tail_)
sl@0
   203
    :   tail(tail_.derived())
sl@0
   204
    {
sl@0
   205
    }
sl@0
   206
sl@0
   207
    explicit dynamic_distinct_directive(char_t const* letters)
sl@0
   208
    :   tail(chset_p(letters))
sl@0
   209
    {
sl@0
   210
    }
sl@0
   211
sl@0
   212
    template<typename ParserT>
sl@0
   213
    typename result<typename as_parser<ParserT>::type>::type
sl@0
   214
        operator[](ParserT const &subject) const
sl@0
   215
    {
sl@0
   216
        return
sl@0
   217
            lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
sl@0
   218
    }
sl@0
   219
sl@0
   220
    tail_t tail;
sl@0
   221
};
sl@0
   222
sl@0
   223
//-----------------------------------------------------------------------------
sl@0
   224
    } // namespace spirit
sl@0
   225
} // namespace boost
sl@0
   226
sl@0
   227
#endif // !defined(BOOST_SPIRIT_DISTINCT_HPP)