1 // Copyright (c) 2017-2018 Dr. Colin Hirsch and Daniel Frey
2 // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/
3 
4 #ifndef TAO_PEGTL_ARGV_INPUT_HPP
5 #define TAO_PEGTL_ARGV_INPUT_HPP
6 
7 #include <cstddef>
8 #include <sstream>
9 #include <string>
10 #include <utility>
11 
12 #include "config.hpp"
13 #include "eol.hpp"
14 #include "memory_input.hpp"
15 #include "tracking_mode.hpp"
16 
17 namespace tao
18 {
19    namespace TAO_PEGTL_NAMESPACE
20    {
21       namespace internal
22       {
make_argv_source(const std::size_t argn)23          inline std::string make_argv_source( const std::size_t argn )
24          {
25             std::ostringstream os;
26             os << "argv[" << argn << ']';
27             return os.str();
28          }
29 
30       }  // namespace internal
31 
32       template< tracking_mode P = tracking_mode::IMMEDIATE, typename Eol = eol::lf_crlf >
33       struct argv_input
34          : public memory_input< P, Eol >
35       {
36          template< typename T >
argv_inputtao::TAO_PEGTL_NAMESPACE::argv_input37          argv_input( char** argv, const std::size_t argn, T&& in_source )
38             : memory_input< P, Eol >( static_cast< const char* >( argv[ argn ] ), std::forward< T >( in_source ) )
39          {
40          }
41 
argv_inputtao::TAO_PEGTL_NAMESPACE::argv_input42          argv_input( char** argv, const std::size_t argn )
43             : argv_input( argv, argn, internal::make_argv_source( argn ) )
44          {
45          }
46       };
47 
48 #ifdef __cpp_deduction_guides
49       template< typename... Ts >
50       argv_input( Ts&&... )->argv_input<>;
51 #endif
52 
53    }  // namespace TAO_PEGTL_NAMESPACE
54 
55 }  // namespace tao
56 
57 #endif
58