summaryrefslogtreecommitdiff
path: root/boost/test/utils/runtime/cla/argv_traverser.hpp
blob: 58cf2fe5f7775995685bf92920913ea50237b18c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//  (C) Copyright Gennadiy Rozental 2005-2008.
//  Use, modification, and distribution are subject to 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)

//  See http://www.boost.org/libs/test for the library home page.
//
//  File        : $RCSfile$
//
//  Version     : $Revision$
//
//  Description : defines facility to hide input traversing details
// ***************************************************************************

#ifndef BOOST_RT_CLA_ARGV_TRAVERSER_HPP_062604GER
#define BOOST_RT_CLA_ARGV_TRAVERSER_HPP_062604GER

// Boost.Runtime.Parameter
#include <boost/test/utils/runtime/config.hpp>

// Boost.Test
#include <boost/test/utils/class_properties.hpp>

// Boost
#include <boost/noncopyable.hpp>
#include <boost/shared_array.hpp>

namespace boost {

namespace BOOST_RT_PARAM_NAMESPACE {

namespace cla {

// ************************************************************************** //
// **************          runtime::cla::argv_traverser        ************** //
// ************************************************************************** //

class argv_traverser : noncopyable {
    class parser;
public:
    // Constructor
    argv_traverser();

    // public_properties
    unit_test::readwrite_property<bool>         p_ignore_mismatch;
    unit_test::readwrite_property<char_type>    p_separator;

    // argc+argv <-> internal buffer exchange
    void            init( int argc, char_type** argv );
    void            remainder( int& argc, char_type** argv );

    // token based parsing
    cstring         token() const;
    void            next_token();

    // whole input parsing
    cstring         input() const;
    void            trim( std::size_t size );
    bool            match_front( cstring );
    bool            match_front( char_type c );
    bool            eoi() const;

    // transaction logic support
    void            commit();
    void            rollback();

    // current position access; used to save some reference points in input
    std::size_t     input_pos() const;

    // returns true if mismatch detected during input parsing handled successfully
    bool            handle_mismatch();

private:
    // Data members
    dstring                 m_buffer;
    cstring                 m_work_buffer;

    cstring                 m_token;
    cstring::iterator       m_commited_end;

    shared_array<char_type> m_remainder;
    std::size_t             m_remainder_size;
};

} // namespace cla

} // namespace BOOST_RT_PARAM_NAMESPACE

} // namespace boost

#ifndef BOOST_RT_PARAM_OFFLINE

#  define BOOST_RT_PARAM_INLINE inline
#  include <boost/test/utils/runtime/cla/argv_traverser.ipp>

#endif

#endif // BOOST_RT_CLA_ARGV_TRAVERSER_HPP_062604GER