]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/test/utils/runtime/cla/argv_traverser.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / test / utils / runtime / cla / argv_traverser.hpp
1 // (C) Copyright Gennadiy Rozental 2001.
2 // Use, modification, and distribution are subject to the
3 // Boost Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 // See http://www.boost.org/libs/test for the library home page.
7 //
8 // File : $RCSfile$
9 //
10 // Version : $Revision$
11 //
12 // Description : defines facility to hide input traversing details
13 // ***************************************************************************
14
15 #ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_HPP
16 #define BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_HPP
17
18 // Boost.Test Runtime parameters
19 #include <boost/test/utils/runtime/fwd.hpp>
20
21 #include <boost/test/detail/suppress_warnings.hpp>
22
23 namespace boost {
24 namespace runtime {
25 namespace cla {
26
27 // ************************************************************************** //
28 // ************** runtime::cla::argv_traverser ************** //
29 // ************************************************************************** //
30
31 class argv_traverser {
32 typedef char const** argv_type;
33 public:
34 /// Constructs traverser based on argc/argv pair
35 /// argv is taken "by reference" and later can be
36 /// updated in remainder method
37 argv_traverser( int argc, argv_type argv )
38 : m_argc( argc )
39 , m_curr_token( 0 )
40 , m_token_size( 0 )
41 , m_argv( argv )
42 {
43 // save program name
44 save_token();
45 }
46
47 /// Returns new argc
48 int remainder()
49 {
50 return m_argc;
51 }
52
53 /// Returns true, if we reached end on input
54 bool eoi() const
55 {
56 return m_curr_token == m_argc;
57 }
58
59 /// Returns current token in the input
60 cstring current_token()
61 {
62 if( eoi() )
63 return cstring();
64
65 return cstring( m_argv[m_curr_token], m_token_size );
66 }
67
68 /// Saves current token for remainder
69 void save_token()
70 {
71 ++m_curr_token;
72
73 if( !eoi() )
74 m_token_size = ::strlen( m_argv[m_curr_token] );
75 }
76
77 /// Commit current token and iterate to next one
78 void next_token()
79 {
80 if( !eoi() ) {
81 for( std::size_t i = m_curr_token; i < m_argc-1; ++i )
82 m_argv[i] = m_argv[i + 1];
83
84 --m_argc;
85
86 m_token_size = ::strlen( m_argv[m_curr_token] );
87 }
88 }
89
90 private:
91
92 // Data members
93 std::size_t m_argc; // total number of arguments
94 std::size_t m_curr_token; // current token index in argv
95 std::size_t m_token_size; // current token size
96 argv_type m_argv; // all arguments
97 };
98
99 } // namespace cla
100 } // namespace runtime
101 } // namespace boost
102
103 #include <boost/test/detail/enable_warnings.hpp>
104
105 #endif // BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_HPP