//  (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: 57992 $
//
//  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
