blob: c0d893ef76c6ddae267fc7d3d444f5524da36e7f [file] [log] [blame]
// (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: 49312 $
//
// Description : flexible configuration file iterator definition
// ***************************************************************************
#ifndef BOOST_RT_FILE_CONFIG_FILE_ITERATOR_HPP_062604GER
#define BOOST_RT_FILE_CONFIG_FILE_ITERATOR_HPP_062604GER
// Boost.Runtime.Parameter
#include <boost/test/utils/runtime/config.hpp>
#include <boost/test/utils/runtime/fwd.hpp>
// Boost.Test
#include <boost/test/utils/iterator/input_iterator_facade.hpp>
#include <boost/test/utils/callback.hpp>
#include <boost/test/utils/named_params.hpp>
// Boost
#include <boost/shared_ptr.hpp>
namespace boost {
namespace BOOST_RT_PARAM_NAMESPACE {
namespace file {
// Public typedef
typedef std::pair<dstring,long> location;
// ************************************************************************** //
// ************** modifiers ************** //
// ************************************************************************** //
namespace cfg_detail {
struct path_separators_t;
struct line_delimeter_t;
struct sl_comment_delimeter_t;
struct command_delimeter_t;
struct line_beak_t;
struct macro_ref_begin_t;
struct macro_ref_end_t;
struct include_kw_t;
struct define_kw_t;
struct undef_kw_t;
struct ifdef_kw_t;
struct ifndef_kw_t;
struct else_kw_t;
struct endif_kw_t;
struct buffer_size_t;
struct trim_leading_spaces_t;
struct trim_trailing_spaces_t;
struct skip_empty_lines_t;
struct detect_missing_macro_t;
} // namespace cfg_detail
namespace {
nfp::typed_keyword<cstring,cfg_detail::path_separators_t> path_separators;
nfp::typed_keyword<char_type ,cfg_detail::line_delimeter_t> line_delimeter;
nfp::typed_keyword<cstring,cfg_detail::sl_comment_delimeter_t> single_line_comment_delimeter;
nfp::typed_keyword<cstring,cfg_detail::command_delimeter_t> command_delimeter;
nfp::typed_keyword<cstring,cfg_detail::line_beak_t> line_beak;
nfp::typed_keyword<cstring,cfg_detail::macro_ref_begin_t> macro_ref_begin;
nfp::typed_keyword<cstring,cfg_detail::macro_ref_end_t> macro_ref_end;
nfp::typed_keyword<cstring,cfg_detail::include_kw_t> include_kw;
nfp::typed_keyword<cstring,cfg_detail::define_kw_t> define_kw;
nfp::typed_keyword<cstring,cfg_detail::undef_kw_t> undef_kw;
nfp::typed_keyword<cstring,cfg_detail::ifdef_kw_t> ifdef_kw;
nfp::typed_keyword<cstring,cfg_detail::ifndef_kw_t> ifndef_kw;
nfp::typed_keyword<cstring,cfg_detail::else_kw_t> else_kw;
nfp::typed_keyword<cstring,cfg_detail::endif_kw_t> endif_kw;
nfp::typed_keyword<std::size_t,cfg_detail::buffer_size_t> buffer_size;
nfp::typed_keyword<bool,cfg_detail::trim_leading_spaces_t> trim_leading_spaces;
nfp::typed_keyword<bool,cfg_detail::trim_trailing_spaces_t> trim_trailing_spaces;
nfp::typed_keyword<bool,cfg_detail::skip_empty_lines_t> skip_empty_lines;
nfp::typed_keyword<bool,cfg_detail::detect_missing_macro_t> detect_missing_macro;
} // local namespace
// ************************************************************************** //
// ************** runtime::file::config_file_iterator ************** //
// ************************************************************************** //
class config_file_iterator : public unit_test::input_iterator_facade<config_file_iterator,cstring,cstring> {
typedef unit_test::input_iterator_facade<config_file_iterator,cstring,cstring> base;
public:
// Public typedefs
typedef unit_test::callback1<cstring> command_handler;
// Constructors
config_file_iterator() {}
explicit config_file_iterator( cstring file_name )
{
construct();
load( file_name );
}
template<typename Modifiers>
config_file_iterator( cstring file_name, Modifiers const& m )
{
construct();
m.apply_to( *this );
load( file_name );
}
config_file_iterator( config_file_iterator const& rhs )
: base( rhs )
, m_pimpl( rhs.m_pimpl )
{
rhs.m_valid = false;
}
void operator=( config_file_iterator const& rhs )
{
if( this == &rhs )
return;
(base&)(*this) = rhs;
m_pimpl = rhs.m_pimpl;
rhs.m_valid = false;
} // Assignment
// Access methods
location const& curr_location();
void register_command_handler( cstring command_kw, command_handler const& );
// Parameters setters
void set_parameter( rtti::id_t, cstring );
void set_parameter( rtti::id_t, bool );
void set_parameter( rtti::id_t, char_type );
void set_parameter( rtti::id_t, std::size_t );
private:
friend class unit_test::input_iterator_core_access;
void construct();
void load( cstring file_name );
// increment implementation
bool get();
// Data members
struct Impl;
shared_ptr<Impl> m_pimpl;
};
} // namespace file
} // namespace BOOST_RT_PARAM_NAMESPACE
} // namespace boost
#endif // BOOST_RT_FILE_CONFIG_FILE_ITERATOR_HPP_062604GER