输入策略

介绍
头文件 'wave/cpp_iteration_context.hpp' 概要
模板参数
成员函数

引言

输入策略类型可以被指定为wave::context对象的模板参数,用于定制包含文件如何被表示,通过一对指向结果输入序列的开始和结束的迭代器。如果实例化 context 对象时未提供此模板参数,则默认为iteration_context_policies::load_file_to_string类型如何,此操作的时间复杂度均为 O(V + E)

头文件 wave/iteration_context.hpp 概要

以下代码列表仅显示了所需接口,但为了简洁起见,显示了一个将给定文件加载到字符串变量中并向Wave库。

namespace boost {
namespace wave {
namespace iteration_context_policies {

    struct load_file_to_string {
    
        template <typename IterContext>
        class inner {
        
        public:
            // expose the begin and end iterators for the
            // included file
            template <typename Position>
            static 
            void init_iterators(IterContext&iter_ctx, 
                Position const &act_pos)
            {
                typedef typename IterContext::iterator_type iterator_type;
                
                std::ifstream instream(iter_ctx.filename.c_str());
                if (!instream.is_open()) {
                    CPP_THROW(preprocess_exception, bad_include_file, 
                        iter_ctx.filename, act_pos);
                }
                
                iter_ctx.instring = std::string(
                    std::istreambuf_iterator<char>(instream.rdbuf()),
                    std::istreambuf_iterator<char>());

                iter_ctx.first = iterator_type(iter_ctx.instring.begin(), 
                    iter_ctx.instring.end(), 
                    PositionT(iter_ctx.filename));
                iter_ctx.last = iterator_type();
            }

        private:
            std::string instring;
        };
    };

}   // namespace iteration_context_policies
}   // namespace wave 
}   // namespace boost   

从上面的代码可以看出,一个input_policy作为wave::context对象只需要实现一个函数,即 init_iterators 函数。所示策略是通过嵌入类实现的,以避免使用模板模板参数,而该参数并非所有系统都支持。这个嵌入类应该命名为inner.

模板参数

inner类使用一个模板参数进行实例化,即迭代上下文类型,策略是该上下文类型的一部分。迭代器类型iterator_type必须通过 typedef 来获取,如所示。需要初始化的迭代器对(可访问为iter_ctx.firstanditer_ctx.last)必须从表示实际输入流的任意迭代器类型初始化。

成员函数

init_iterators

    template <typename Position>
    static void init_iterators(
        IterContext iter_ctx, 
        Position const &act_pos);

指令在输入令牌流中被发现。此函数的主要目的是初始化一对迭代器iter_ctx.firstanditer_ctx.last,用于从预处理器引擎内部访问要插入的包含文件的相应输入流。