| // (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 |