使用boost::range创建一个缩进算法



我正在为文本编辑器创建一个缩进算法。我已经设法获得要操作的范围,但是当我想做Gtk::TextBuffer::erase时,它失败了:

void unindentSelection(const Glib::RefPtr<Gtk::TextBuffer> &buffer)
{
    Gtk::TextBuffer::iterator start, end;
    buffer->get_selection_bounds(start, end);
    auto selRange = boost::make_iterator_range(start, end);
    auto buffRange = boost::make_iterator_range(buffer->begin(), buffer->end());
    auto prevRangeRev = boost::make_iterator_range(buffRange.begin(), selRange.begin()) | boost::adaptors::reversed;
    auto prevRangeLineRev = boost::find<boost::return_begin_found>(prevRangeRev, 'n');
    auto prevRangeLine = prevRangeLineRev | boost::adaptors::reversed;
    auto afterRange = boost::make_iterator_range(selRange.end(), buffRange.end());
    auto afterRangeLine = boost::find<boost::return_begin_found>(afterRange, 'n');
    auto exSelRangeAux = boost::join(prevRangeLine, selRange);
    auto exSelRange = boost::join(exSelRangeAux, afterRangeLine);
    show_range(exSelRange);
    while (true)
    {
        auto spaceRange = boost::find_if<boost::return_begin_found>(exSelRange, findNonspaceNL);
        if (boost::distance(spaceRange))
        {
            buffer->erase(spaceRange.begin(), spaceRange.end());
        }
    }
}

TextEditor.cpp:501:31:错误:没有可行的转换从'boost::range_detail::join_iterator>, Gtk::TextIter, unsigned int, unsigned int, boost::iterators::bidirectional_traversal_tag>, Gtk::TextIter, unsigned int, unsigned int, boost::iterators::bidirectional_traversal_tag>'到'const iterator'(又名'const Gtk::TextIter')缓冲->删除(spaceRange.begin (), afterRangeLine.end ());^~~~~~~~~~~~~~~~~~/usr/include/gtkmm-3.0/gtkmm/textiter.h:145:7:注意:候选构造函数(隐式复制构造函数)不可用:没有已知的从'boost::range_detail::join_iterator>, Gtk::TextIter, unsigned int, unsigned int, boost::iterators::bidirectional_traversal_tag>, Gtk::TextIter, unsigned int, boost::iterators::bidirectional_traversal_tag>'到'const Gtk::TextIter &'的第一个参数转换类TextIter^/usr/include/gtkmm-3.0/gtkmm/textiter.h:145:7:注意:候选构造函数(隐式移动构造函数)不可用:没有已知的从'boost::range_detail::join_iterator>, Gtk::TextIter, unsigned int, unsigned int, boost::iterators::bidirectional_traversal_tag>, Gtk::TextIter, unsigned int, unsigned int, boost::iterators::bidirectional_traversal_tag>'到'Gtk::TextIter &&'的第一个参数转换类TextIter^/usr/include/gtkmm-3.0/gtkmm/textbuffer.h:378:34:注意:在这里传递参数'range_begin'const Iterator &Range_begin,常量迭代器&range_end);

任何想法?

我必须创建一个迭代器类型,其中包含一个模板化的' iterator it'(在我的情况下是Gtk::TextIter),使用'boost::iterator_facade'。所有对迭代器的操作都被转发给'it',除了操作符*(),它只是给出了普通的迭代器。所以擦除是这样完成的:

buffer->erase(*spaceRange.begin(), *spaceRange.end());

这种新类型的迭代器在操作范围时非常有用。我不确定这是不是最好的解决方案,但确实有效。

相关内容

  • 没有找到相关文章

最新更新