2015-07-27 4 views
1

Я создаю unindent алгоритм для текстового редактора. Я сумел получить диапазон для работы, но когда я хочу сделать Gtk :: TextBuffer :: сотрите, это не удается:Создание unindent алгоритма с использованием boost :: range

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: ошибка: нет жизнеспособного преобразования from '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> 'to' const iterator '(aka' const Gtk :: TextIter ') buffer-> erase (spaceRange.begin(), afterRangeLine.end()); ^ ~~~~~~~~~~~~~~~~~ /usr/include/gtkmm-3.0/gtkmm/textiter.h:145:7: note: конструктор-кандидат (неявный конструктор копирования), а не жизнеспособный: неизвестное преобразование из 'boost :: range_detail :: join_iterator>, Gtk :: TextIter, unsigned int, unsigned int, boost :: iterators :: bidirectional_traversal_tag>, Gtk :: TextIter, unsigned int, unsigned int, boost :: итераторы :: bidirectional_traversal_tag> 'to' const Gtk :: TextIter & 'для 1-го аргумента класс TextIter ^ /usr/include/gtkmm-3.0/gtkmm/textiter.h:145:7: note: конструктор-кандидат (неявный move constructor) не является жизнеспособным: неизвестное преобразование из '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_traver sal_tag>»на 'Gtk :: TextIter & &' для 1-го класса аргумент TextIter ^ /usr/include/gtkmm-3.0/gtkmm/textbuffer.h:378:34: примечание: передача аргумента параметр 'RANGE_BEGIN' здесь итератор erase (const iterator & range_begin, const iterator & range_end);

Любые идеи?

ответ

1

Мне нужно было создать тип итератора, в котором содержался шаблон «Итератор» внутри (который в моем случае является Gtk :: TextIter), используя «boost :: iterator_facade». Все операции с итератором, который пересылается на «это», кроме оператора *(), который просто дал простой итератор. Таким образом, стирание было выполнено таким образом:

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

Этот новый тип итератора будет очень полезен при манипулировании диапазонами. Не уверен, что это лучшее решение, но работает.